Ich mache mir seit einigen Tagen Gedanken um die Funktionsweisen von Template Klassen, da ich eine eigene, eher kleine Klasse schreiben möchte. Soweit kein Problem. Was mir nur Kopfzerbrechen bereitet, sind Blöcke.
Also habe ich mir erstmal die verschiedensten Systeme angesehen und so einige Themen in diesem Forum durchgelesen, bin nur leider noch zu keinem Ergebnis gekommen. Was Blöcke sind und wie sie ersetzt werden, ist dabei nicht das Problem, sondern vielmehr, welches Funktionsprinzip gerade bei verschachtelten Blöcken sinnvoll ist.
Beispiel:
Dazugehörige Blockstruktur (Beispiel):
Die meisten oder zumindest viele Systeme funktionieren ja nach folgendem Prinzip - wenn ich es richtig verstanden habe:
Ein Parser sucht - meist per preg_match_all, while (preg_match) oder auch per strpos, strlen usw. - nach dem bzw. den Vorkommen von Blöcken. Wurde ein Block gefunden, wird der Name extrahiert, ein Array, in dem alle Variablen abgelegt wurden, mit dem passenden Schlüssel Blockname iteriert und die Platzhalter durch Werte ersetzt. Und hier kommt meine Frage:
Ist es gerade bei verschachtelten Blöcken wie in meinem Beispiel nicht sinnvoller, die Verarbeitung nach dieser Reihenfolge vorzunehmen:
Statt erst mit preg_match_all & Co nach Platzhaltern und Blöcken zu suchen, wird das Array, in dem alle Blöcke und Variablen abgelegt sind (z.b. var $block_vars) durchlaufen und dann geprüft, ob zu jedem Blocknamen auch tatsächlich ein Block existiert. Der Vorteil: Ich muss mir erstmal keine Gedanken um verschachtelte Blöcke machen, denn ich muss einfach nur überprüfen, ob $block_vars mit jedem Blocknamen eventuell noch ein multidimensionales Array enthält, was bedeuten würde, dass auch ein verschachtelter Block existieren muss. Das müsste dann um einiges leichter zu verarbeiten seinn. (Ich hoffe das ist halbwegs verständlich).
Grund für meine Frage: Ich stelle es mir eben ziemlich mühsam und kompliziert vor, erstmal alle Blocknamen beispielsweise nach dem Vorkommen eines Punktes zu überprüfen, bei Erfolg dann den Blocknamen zu exploden, damit ich dann alle weiteren Kinderblöcke abarbeiten kann.
Was haltet ihr von meiner Idee? Habe ich etwas Grundlegendes außer Acht gelassen? Ich würde mich freuen, eure Meinungen zu hören, besonders, da viele weitaus mehr Erfahrung mit Template Systemen haben als ich und mir dieser Ansatz bisher noch nicht begegnet ist.
Also habe ich mir erstmal die verschiedensten Systeme angesehen und so einige Themen in diesem Forum durchgelesen, bin nur leider noch zu keinem Ergebnis gekommen. Was Blöcke sind und wie sie ersetzt werden, ist dabei nicht das Problem, sondern vielmehr, welches Funktionsprinzip gerade bei verschachtelten Blöcken sinnvoll ist.
Beispiel:
PHP-Code:
$names = array(
0 => array(
'car' => 'carname_1',
'colors' => array(
0 => 'color_1',
1 => 'color_2',
),
),
1 => array(
'car' => 'carname_2',
'colors' => array(
0 => 'color_1',
1 => 'color_2',
),
),
);
PHP-Code:
<!-- block name: cars -->
{carname}
<!-- block name: cars.colors -->
{color}
<!-- end block: cars.colors -->
<!-- end block: cars -->
Die meisten oder zumindest viele Systeme funktionieren ja nach folgendem Prinzip - wenn ich es richtig verstanden habe:
Ein Parser sucht - meist per preg_match_all, while (preg_match) oder auch per strpos, strlen usw. - nach dem bzw. den Vorkommen von Blöcken. Wurde ein Block gefunden, wird der Name extrahiert, ein Array, in dem alle Variablen abgelegt wurden, mit dem passenden Schlüssel Blockname iteriert und die Platzhalter durch Werte ersetzt. Und hier kommt meine Frage:
Ist es gerade bei verschachtelten Blöcken wie in meinem Beispiel nicht sinnvoller, die Verarbeitung nach dieser Reihenfolge vorzunehmen:
Statt erst mit preg_match_all & Co nach Platzhaltern und Blöcken zu suchen, wird das Array, in dem alle Blöcke und Variablen abgelegt sind (z.b. var $block_vars) durchlaufen und dann geprüft, ob zu jedem Blocknamen auch tatsächlich ein Block existiert. Der Vorteil: Ich muss mir erstmal keine Gedanken um verschachtelte Blöcke machen, denn ich muss einfach nur überprüfen, ob $block_vars mit jedem Blocknamen eventuell noch ein multidimensionales Array enthält, was bedeuten würde, dass auch ein verschachtelter Block existieren muss. Das müsste dann um einiges leichter zu verarbeiten seinn. (Ich hoffe das ist halbwegs verständlich).
Grund für meine Frage: Ich stelle es mir eben ziemlich mühsam und kompliziert vor, erstmal alle Blocknamen beispielsweise nach dem Vorkommen eines Punktes zu überprüfen, bei Erfolg dann den Blocknamen zu exploden, damit ich dann alle weiteren Kinderblöcke abarbeiten kann.
Was haltet ihr von meiner Idee? Habe ich etwas Grundlegendes außer Acht gelassen? Ich würde mich freuen, eure Meinungen zu hören, besonders, da viele weitaus mehr Erfahrung mit Template Systemen haben als ich und mir dieser Ansatz bisher noch nicht begegnet ist.
Kommentar