Encontré un par de formas de manejar la recursión en Smarty, principalmente basada en incluir plantillas en sí mismas, lo que parece una pérdida de recursos ridícula. Encontré una solución, por Messju en Smarty que parecía ser la correcta, pero no es compatible y falla en la última versión de smarty :(¿Cuál es la mejor forma de manejar la recursión en smarty?
Para las personas que preguntan: Lo que quiero que Smarty imprima es una discusión hilo que se define por un conjunto de entradas. Si una entrada tiene una o más respuestas, aquellos enumerados como los niños a dicha entrada en una matriz, y así sucesivamente.
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()
)
)
),
);
La matriz anidada tiene una profundidad arbitraria, y cada entrada tendrá un número arbitrario de hijos. Para mí, esto es algo que quiero hacer dentro del alcance de la plantilla, ya que la considero pura lógica de visualización. No quiero tener que manejar HTML o algún tipo de HTML. marcadores de posición fuera de la modelo.
Quiero Smarty para imprimir esto como anidados listas:
<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>
estoy empezando a darse cuenta de que esto podría ser un problema muy, caso por caso, por lo que figura que voy a escribir un plugin Smarty para manejar esto específicamente, aunque preferiría tener una solución completa.
¿Hay alguna manera?
Piénselo de esta manera, la aplicación necesita mostrar una lista anidada arbitrariamente de cosas. Hay complejidad allí. Necesitas administrar la complejidad. Tiene sentido poner lo que esencialmente es lógica de visualización (loop en una matriz y spit out markup) en la plantilla. El hecho de ser recursividad no lo convierte en malvado. – GloryFish
Lo suficiente, pero en comparación con hacer recursividad con una función única, una solución inteligente será intrincada. –