Artikel mit dem Tag "Rekursion"

Smarty Rekursion in einem Template

Es kommt öfters vor, dass man ein Array ausgeben möchte, ohne die Tiefe zu kennen. Baumstrukturen oder Verzeichnislistings sind Beispiele dafür. Mit PHP und anderen Skriptsprachen lässt sich eine solche Struktur leicht mithilfe von Rekursion ausgeben.

Ich persönlich benutze seit geraumer Zeit die Smarty Template Engine, welche die Möglichkeit der Rekursion in Templates leider bisher vermissen lässt.
Wer jedoch zwischen den Zeilen liest, findet im Smarty-Forum eine Lösung, diese Funktionalität trotzdem implementieren zu können.

1) Aktuelle Version des Plugins compiler.defun herunterladen (Kompatibel mit PHP4+)

2) Die heruntergeladene Datei compiler.defun.php in das Plugins-Verzeichnis von Smarty kopieren (smarty/libs/plugins/)

3) Folgende Template-Datei als test.tpl in das Smarty-Template-Verzeichnis (normalerweise templates/) erstellen, welche ein verschachteltes Array ausgeben soll:

<ul>
{defun name="testrecursion" list=$tree}
{foreach from=$list item=node}
<li><span>{$node.caption} ({$node.access_string})</span>{if $node.children}<ul>
	{fun name="testrecursion" list=$node.children}</ul>{/if}</li>
{/foreach}
{/defun}
</ul>

4) Zuletzt mit folgendem Quellcode eine Datei test.php erzeugen, welche Smarty instanziert und ein verschachteltes Array zuweißt:

<?php
	require_once 'smarty/libs/Smarty.class.php';
	$smarty = new smarty();
	$smarty->assign("tree",array(
		0=>array(
			"caption"=>"Hallo",
			"access_string"=>"hallo.html",
			"children"=>array()
		),
		1=>array(
			"caption"=>"Huhu",
			"access_string"=>"huhu.html",
			"children"=>array(
				0=>array(
					"caption"=>"Wuhu",
					"access_string"=>"huhu/wuhu.html",
					"children"=>array()
				),
				1=>array(
					"caption"=>"Bla",
					"access_string"=>"huhu/bla.html",
					"children"=>array(
						0=>array(
							"caption"=>"Waha",
							"access_string"=>"huhu/bla/waha.html",
							"children"=>array(
								0=>array(
									"caption"=>"Ariba",
									"access_string"=>"huhu/bla/waha/ariba.html",
									"children"=>array(
										0=>array(
											"caption"=>"Wabadu",
											"access_string"=>"huhu/bla/waha/ariba/wabadu.html",
											"children"=>array()
										),
										1=>array(
											"caption"=>"Wabadi",
											"access_string"=>"huhu/bla/waha/ariba/wabadi.html",
											"children"=>array(
												0=>array(
													"caption"=>"Hallo",
													"access_string"=>"huhu/bla/waha/ariba/wabadi/hallo.html",
													"children"=>array()
												)
											)
										)
									)
								)
							)
						)
					)
				),
				2=>array(
					"caption"=>"Wau",
					"access_string"=>"huhu/wau.html",
					"children"=>array()
				)
			)
		),
		2=>array(
			"caption"=>"Maeh",
			"access_string"=>"maeh.html",
			"children"=>array(
				0=>array(
					"caption"=>"Muh",
					"access_string"=>"maeh/muh.html",
					"children"=>array()
				)
			)
		)
	));
	$smarty->display("test.tpl");
?>

Die Ausgabe von test.php sieht dann wie folgt aus:
Ausgabe test.php

Share
Geschrieben von Philip Ehret am 10.08.2010 | Kommentare weiterlesen...