Qual é a melhor maneira de lidar com a recursão na inteligência?

Encontrei algumas maneiras de lidar com a recursão no Smarty, principalmente com base na inclusão de modelos em si mesmos, o que parece um ridículo desperdício de recursos. Encontrei uma solução, por Messju, no Smarty, que parecia estar certa - mas não é suportada e falha na versão mais recente do smarty :(

Para as pessoas que perguntam: O que eu quero que o smarty imprima é um tópico de discussão definido por uma matriz de entradas. Se uma entrada tiver uma ou mais respostas, elas serão listadas como filhos da referida entrada em uma matriz e assim por diante.

array(
    array(
        'id'=>0,
        'headline'=>"My parent headline",
        'body'    =>"My parent body",
        'children'=>array(
            array(
                'id'=>1,
                'headline'=>"My firstChild headline",
                'body'    =>"My firstChild body",
                'children'=>array()
            ),
            array(
                'id'=>2,
                'headline'=>"My secondChild headline",
                'body'    =>"My secondChild body",
                'children'=>array()
            )
        )
    ),
);

A matriz aninhada tem uma profundidade arbitrária e cada entrada terá um número arbitrário de filhos. Para mim, isso é algo que quero fazer no escopo do modelo, pois considero pura lógica de exibição. Eu não quero ter que lidar com HTML ou algum tipo de espaços reservados HTML fora do modelo.

Quero que o smarty imprima isso como listas aninhadas:

<ul>
    <li>
        <h1>My parent headline</h1>
        <p>My parent body</p>
        <ul>
            <li>
                <h1>My firstChild headline</h1>
                <p>My firstChild body</p>
            </li>
            <li>
                <h1>My secondChild headline</h1>
                <p>My secondChild body</p>
            </li>
        </ul>
    </li>
</ul>

Estou começando a perceber que isso pode ser um problema muito caso a caso, então acho que vou escrever um plug-in inteligente para lidar com isso especificamente, embora prefira ter uma solução completa.

Há algum caminho?

questionAnswers(4)

yourAnswerToTheQuestion