Eigenes Template-System loop im loop

daniel_sun

Erfahrenes Mitglied
Hallo,

ich bin aktuell dabei ein kleines Template-System zu coden. Da darf natürlich auch ein Loop nicht fehlen. Der einfache Loop funktioniert auch wie gewünscht:

Template:
HTML:
{foreach users}
	<p>
		<b>
			{name}
		</b> 
			{nachname}
	</p>
{/foreach}

Iwo im Script wird passend dazu ein array vorbereitet:
PHP:
			$users[0] = array('name' => 'Max', 'nachname' => 'Muster');
			$users[1] = array('name' => 'Paul', 'nachname' => 'Panzer');
			
			$template->assingArray('users', $users);

Vor der Anzeige des Templates wird das ganze das compiliert / geparst (In $this->template steht der Template code)

PHP:
$this->template = preg_replace_callback('%\{foreach (\w+)\}(.*)\{/foreach\}%sU', array(&$this, 'replaceForeach'), $this->template);

PHP:
		private function replaceForeach($var){
			
			var_dump($var);
			
			$result = "";
			$arr = $this->assingedArrays[$var[1]];
			foreach ($arr as $a) {
				$tmp = $var[2];
				preg_match_all("/\{([^}]+)\}/", $var[2], $match);
				foreach($match[1] as $m){
					$tmp = str_replace('{'.$m.'}', $a[$m], $tmp);
				}
				$result .= $tmp;
			}
			return $result;
		}

Wie schon gesagt Funktioniert es super. Nun soll das ganze in die 2. Runde gehen. So soll das ganze nun rekrusiev Funktioniert also 2, 3 etc. Schreifen in einander verschachtelt. Mir fehlt nur leider etwas der Ansatz. Wenn ich ein Tpl mit verschachtelter Foreach nehme wird beim preg_replace der Close-Tag der inneren schleife als Close für die äußere erkennt:

HTML:
{foreach users}
	<p>
		<b>
			{name}
		</b> 
			{nachname}
	</p>
	<p>
		{foreach jobs}
			<i>{name}</i>
		{/foreach}
	</p>
{/foreach}

Wäre toll wenn einer nen Tip hat wie man das mit der Rekrusion am besten lösen kann :) Brauche wie nen Ansatz :)

Gruß
daniel_sun
 
Hab noch bissel Probleme mit dem Pattern.

Habe immer noch folgendes Template:

HTML:
{foreach users}
	<p>
		<b>
			{name}
		</b> 
			{nachname}
	</p>
	<p>
		{foreach jobs}
			{name}
		{/foreach}
	</p>
{/foreach}

Das will ich nun mit dem Compiler kompilieren (später recrusiv)

PHP:
<?php
	class ForeachCompiler{
		
		
		public function compile($tpl){
			$tpl = preg_replace_callback('%\{foreach (\w+)\}((?:[^[]|\{(?!/?foreach})|(?R))+)\{/foreach\}%sU', array(&$this, 'replaceForeach'), $tpl);
			return $tpl;
		}
		
		private function replaceForeach($var){
			
			var_dump($var);
		}
	}
?>

Leider wird durch den Pattern %\{foreach (\w+)\}((?:[^[]|\{(?!/?foreach})|(?R))+)\{/foreach\}%sU immer noch der erste Close-Tag und nicht der zweite genommen. Was ist an dem Pattern falsch?

Hier die var_dump ausgabe:

Code:
array (size=3)
  0 => string '{foreach users}

	<p>

		<b>

			{name}

		</b> 

			{nachname}

	</p>

	<p>

		{foreach jobs}

			{name}

		{/foreach}' (length=119)
  1 => string 'users' (length=5)
  2 => string '

	<p>

		<b>

			{name}

		</b> 

			{nachname}

	</p>

	<p>

		{foreach jobs}

			{name}

		' (length=94)

{/foreach}

Der letzte {/foreach} ist nicht mehr bestandteil des Vardumbs sondern wird darunter ausgegeben.

Gruß
Daniel_Sun
 
Zurück