Variablen-Problem bei Template-IFs

Pain-maker

Mitglied
Hi @ all!
Hab in meine Template-Klasse ein IF-Abfrage-System eingefügt was ich selbst gebastelt habe. Es funktioniert auch einwandfrei mit Globalen Variablen, mit Variablen aus der aufrufenden Datei allerdings nicht. Wie kann ich das beheben?

Die Funktion:
PHP:
<?php

	private function replaceIfs() {
		while(preg_match("/(<\[IF\((.+)\)\]>)(.+)(<\[ENDIF\]>)/isUe", $this->template, $keys) != FALSE) {
			@eval("\$condition = \"\".".$keys['2'].".\"\";");
			if($condition) {
				$this->template = str_replace($keys['0'], $keys['3'], $this->template);
			} else {
				$this->template = str_replace($keys['0'], "", $this->template);
			}
		}
		return true;
	}

?>

Der Aufruf:
Code:
              <[IF($_SESSION['login']===TRUE)]>
                <p align="center">
                  <span class="small">Willkommen $_SESSION[username]!</span><br>
                  <a href="logout.php"><span class="small">[Abmelden]</span></a>
                </p>
              <[ENDIF]>

So funktioniert es also wunderbar.
Nun habe ich aber eine Datei (members.php) mit einer FOR-Schleife mit der Variablen $j und der Variablen $getMembers (aus MySQL). Nun soll immer eine neue Tabellen-Zeile nach 2 Ergebnissen erzeugt werden. Das geht in der Datei auch gut aber ich hätte das nun mal gerne im Template:

Code:
              <[IF(($j % 2 && $j >= 1) || $j==count($getMembers)-1)]>
                </tr>
                <tr>
              <[ENDIF]>

Die Variable $j und $getMembers kennt meine Klasse aber natürlich nicht... Das ist mein Problem.
Ich hoffe ihr könnt mir vielleicht weiterhelfen! :)

MFG Pain-maker
 
Danke erstmal für die Antwort!
Ich habe meine Funktion nun wie folgt verändert:
PHP:
<?php

	private function replaceIfs() {
		while(preg_match("/(<\[IF\((.+)\)\]>)(.+)(<\[ENDIF\]>)/isUe", $this->template, $keys) != FALSE) {
			$keys['2'] = preg_replace('/\$([\.a-zA-Z0-9_-][\w-]*)/is', '\$GLOBALS["\\1"]', $keys['2']);
			@eval("\$condition = \"\".".$keys['2'].".\"\";");
			if($condition) {
				$this->template = str_replace($keys['0'], $keys['3'], $this->template);
			} else {
				$this->template = str_replace($keys['0'], "", $this->template);
			}
		}
		return true;
	}

?>

Allerdings macht er trotzdem noch nichts... aber ich habe mal in der Funktion versucht auf $GLOBAL["j"] zuzugreifen und das mit Erfolg. Nun verstehe ich nicht warum es trotzdem nicht geht.
Woran könnte das denn liegen? Ist an meiner Funktion vielleicht etwas falsch?

MFG Pain-maker
 
Probier mal Folgendes:
PHP:
private function replaceIfs()
{
	while( preg_match('/<\[IF\((.+?)\)\]>(.+)<\[ENDIF\]>/s', $this->template, $match) ) {
		$match[1] = preg_replace('/\$([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)/', '\$GLOBALS["\1"]', $match[1]);
		@eval('$expr = '.$match[1].';');
		if( $expr ) {
			$this->template = str_replace($match[0], $match[2], $this->template);
		} else {
			$this->template = str_replace($match[0], '', $this->template);
		}
	}
	return true;
}
Allerdings solltest du dir noch was überlegen, sodass etwa Folgendes richtig interpretiert wird:
Code:
<[IF(true)]>
	true
	<[IF(false)]>
		false
		<[IF(true)]>
			true-2
		<[ENDIF]>
	<[ENDIF]>
<[ENDIF]>
 
Sehr gut nun funktionierts!
Ich hab das eval() so verändert wie du's vorgeschlagen hast und nun gehts.
Danke Gumbo, für die schnelle und aufschlussreiche Hilfe! :)

MFG Pain-maker
 
Zurück