2009-08-18 3 views
0

Ich fing an, mein eigenes kleines skaliertes Rahmenwerk zu schreiben, und ich bin zu dem Templating-Teil davon gekommen. Bisher habe ich in der Lage gewesen einfache Variable zu tun mit dem folgenden Code ersetzen:mit einer Schleife in einer Vorlage

public function view($page, $vars) 
{ 
    if(!file_exists('system/views/' . $page . '.php')) 
    { 
     trigger_error("No Template found", E_USER_ERROR); 
    } 

    $tempArray = file_get_contents('system/views/' . $page . '.php'); 

    foreach($vars as $key => $value) 
    { 
     $tempArray = str_replace('{' . $key . '}', $value, $tempArray); 
    } 

    print $tempArray; 
    unset($tempArray); 
} 

der gut arbeitet, aber was ich suche jetzt ist, wenn ich eine Schleife wollte aus einer Datenbank unbekannte Anzahl von Datensätzen zeigen, und Ich habe einen Koppler von Ideen versucht aber keiner scheint so weit zu funktionieren

+0

Es gibt eine viel dies ein Tutorial dazu ist, aber Sie müssen es Plus-Mitglied sein Open-Source-PHP-Template-Sprachen, warum sehen Sie sich diese nicht an? – Zed

Antwort

1

Zunächst sollten Sie Ihre variablen Umschreiben überdenken. Es gibt mehrere Fälle, in denen Ihre Methode nicht wie erwartet endet, wenn Sie einige Abhängigkeiten zwischen ihnen haben. Außerdem wird alles ersetzt, unabhängig davon, ob sich eine Variable in einer Schleife befindet oder nicht.

Wenn Sie etwas wie {while (condition)} code {/ while} möchten, müssen Sie beachten, dass Rekursion ebenfalls möglich ist und daher nicht so einfach ist, wie eine Regex darauf zu finden.

Ein einfacher Ansatz wäre die folgende:

  • den Start eines Token finden (Variable, whileloop) und die Position erinnern, wo Sie es
  • finden, wenn es eine Variable ist, und Sie sind in der äußersten Umfang (nicht in einer Schleife), verarbeiten Sie es, indem Sie einen Ersatz vornehmen. Passen Sie Ihren Zeiger so an, dass Sie die Ersetzung anschließend nicht lesen, um zu vermeiden, dass Sie Dinge ersetzen, die Sie nicht möchten.
  • Wenn es sich um eine Schleife ist
    • den Zustand zwischen den Klammern extrahieren und speichern sie somewher
    • Additionaly, speichern den aktuellen Standort
    • Schieben der Token auf einen Stapel der aktuellen Rekursionsebene zu erinnern.
    • Entfernen Sie ein Token vom Stapel, wenn Sie auf das Token {/ while} stoßen.
    • Gehen Sie nun rekursiv vor, indem Sie alle verschachtelten Loop-Tokens auf den Stack schieben und sie entfernen, wenn sie enden. Stoppen Sie, wenn Sie wieder auf der äußersten Ebene sind.
    • Werten Sie den Zustand der Schleife aus. Solange dies der Fall ist, erstellen Sie neue Kopien aus dem Quelltext zwischen dem Start-Token und dem End-Token und verarbeiten sie mithilfe der Rekursion.
    • Verketten Sie die Zwischenergebnisse und ersetzen Sie alle Elemente von {while} bis {/ while} mit dieser Verkettung. Passen Sie den Mauszeiger so, dass Sie nach der Schleife sind und zeigen :)

Hoffnung weiter, dass dies hilft. Ich weiß, dass es ein bisschen schmerzhaft klingt, aber wenn Sie das Konzept verstehen, sollten Sie es tun können (obwohl es nicht super effizient ist und Template-Engines wie Smarty kompilieren wird immer im Voraus sein, da sie die Template-Datei nur einmal parsen und kompiliere es nach PHP-Code).

@Daff: Sie können die Token mit regulären Ausdrücken finden, aber die Verwendung einer Regex zur Übereinstimmung mit einem ganzen Schleifenkonstrukt funktioniert aufgrund der Rekursionen nicht (es sei denn, Ihre Regex hat eine rekursive Erweiterung).

+0

späte Antwort Ich weiß, aber ich dachte, ich würde Sie wissen lassen, dass dies viel geholfen hat, danke! –

1

Wie Zed bereits sagte es gibt viele Templating Sprachen für PHP, die beliebteste ist Smarty und ich weiß nicht, ob es wirklich sinnvoll wäre erfinde das Rad neu, außer zu Lernzwecken. Die Schleifen, die Sie tun möchten, sind viel komplexer als nur Elemente zu ersetzen. Ich bin mir ziemlich sicher, dass Sie das mit vielen regulären Ausdrücken tun können, aber irgendwann werden Sie Ihre eigene Skriptsprache schreiben (wie die Smarty-Leute), indem Sie Ihre View-Datei analysieren, einen Syntaxbaum erstellen und ihn auswerten und kompiliere es in eine neue PHP-Datei. Dies ist ziemlich komplex, daher empfehle ich, entweder eine vorhandene Templating-Engine zu verwenden oder PHP als Template-Sprache selbst zu verwenden (wenn streng nach dem MVC Muster, das funktionieren könnte, obwohl es viele Diskussionen darüber gibt).

Mit einem regulären Ausdruck könnten Sie alles zwischen {for ...} {/ for} analysieren, um auf ein Element mit einem gegebenen Variablennamen zuzugreifen, nach {for und} einer Definition Ihrer Variablen occurrs und after} und vorher {/ für} Ihre HTML-Definition. Das wäre so etwas wie eine foreach-Schleife, die man nicht einmal ineinander verschachteln kann.

{for item=$varname} 
    <p>{item.othervalue}</p> 
{/for} 
+0

Ich mache es hauptsächlich, um zu lernen, sicherlich muss es einen Weg geben, es zu tun, der nicht dazu führt, zu einem Extramamen zu gehen? –

+0

Ich habe ein kleines Beispiel hinzugefügt, wie es aussehen könnte. Aber wenn Sie es wirklich lernen wollen, möchten Sie vielleicht zu einem Extrem gehen ... am einfachsten, wenn Sie einfach PHP als Vorlagensprache verwenden oder das Extrem mit der Erstellung Ihrer eigenen Vorlagen-Engine. – Daff

+0

danke für das Beispiel, das scheint die Route, die ich auf dem Weg ging –