PHP Portal » PHP Forum » Vorhalle » Smalltalk » Fragen zur Boardtechnik
Seite: 1 [2]

Re: Fragen zur Boardtechnik 

von
the Boss
Zitat
Zitat: Beitrag von Gasthmm aber wie weisst du ob das Datenarray mit der aktuellen Ebene geparst werden soll? und sieht das Template Array so aus wie meines?
Das weiß ich nicht, ist ja auch egal. Ich gehe einfach das vorhandene Daten-Array durch, und wenn ein passender Template-Block vorhanden ist, wird der ausgefüllt. Das Daten-Array entscheidet ob ein Template-Block angezeigt wird, nicht das Template.
So wie ich das sehe muss da ein Zeiger oder so etwas immer beim Template Array mitlaufen andernfalls weiss ich ja nicht ob aktuell der übergebene Block im Datenarray zulässig ist
Das ist eine rekursive Funktion, daher brauch ich keinen Zeiger, sondern hangel mich einfach runter, und gebe den zu bearbeitenden Block jeweils mit

Werbung

Re: Fragen zur Boardtechnik 

von
Besucher
Zitat
Du bildest die Verschachtelung der Blöcke im Template Array nicht ab?

d.h.
block["blubb"]
block["bla"]

usw.?

Re: Fragen zur Boardtechnik 

von
the Boss
Zitat
Die Blöcke haben in ihrem Text einen Platzhalter für Unterblöcke.
ungefähr so:

$block['blockname'] = 'blablabla {loop subblock} blablabla'

daher darf jeder Blockname auch nur einmal vorkommen

Re: Fragen zur Boardtechnik 

von
Neuling
Zitat
Interessanter Thread, hab mir diesbezüglich auch ein paar Gedanken gemacht.

1.) Datenarray: Nach welchem Grundsatz wird dieses den aufgebaut?

Bezogen auf diese HTML Table gibt es ja die Hierarchie:
table -> tr -> td/th und an dem Beispiel Modell

d.h. also es wird so etwas gesetzt
$tpl->add("table",array());
$tpl->add("tr",array());
$tpl->add("td",array("varname"=>Zelle1.1));
$tpl->add("td",array("varname"=>Zelle1.2));
$tpl->add("tr",array());
$tpl->add("td",array("varname"=>Zelle2.1));
$tpl->add("td",array("varname"=>Zelle2.2));

Wenn dieser Ablauf lösgelöst von der eigentlichen Templateblockhierarchie ist wie werden dann neue Knoten ins Datenmodell eingehängt?

Beim letzten aktuellen Knoten? Aber wie wären dann Blöcke auf der selben Ebene möglich z.B. einen fiktiven "tr2" Block der auf der selben Ebene wie tr liegt.

Man könnte sich denken das beim letzten aktuellen Knoten der kein Array ist ein neuer Knoten eingehängt wird und wenn ein Knoten schon existiert wird erfolgt ein weiteres Subarray?

2.) Template Blöcke
Template Blöcke enthalten so wie ich verstanden habe lediglich einen Verweis auf den nächsten Subblock. Wird hierbei eine Blockhierarchie beachtet oder werden lediglich Blöcke mit den Marken entsprechend angelegt d.h.

$block[table]="<table>{BLOCK:TR}</table>";
$block[table]="<tr>{BLOCK:TD}</tr>";

etc. ?

3.) Ablauf Datenabgleich Datenmodell und tatsächlichen Templateblöcken
Das Datenmodell wird durchlaufen und dann "Wie?" mit den Templateblöcken abgeglichen?

Ich denke das Kernproblem ist wie man das Datenmodell aufbaut, die Hierarchie behält und dann die Templateblöcke mit dem Datenmodell abgleicht...

Könnte man das vielleicht mal in Pseudo Code formulieren, dmait diese Idee klarer wird

Re: Fragen zur Boardtechnik 

von
the Boss
Zitat
zur 1. Frage
Die Hierachie in den Daten ergibt sich durch die Reihenfolge beim "add" und dem Knotennamen.
Kennt er einen Namen noch nicht, wird eine Unterebene angelegt, ansonsten springt er im Baum wieder zurück bis zu dem Knoten mit diesem Namen, und legt einen neuen Schleifendurchlauf für diesen an.

PHP Code
1
2
3
4
5
6
7
$tpl->add("table",array()); $tpl->add("tr",array()); $tpl->add("td",array("varname"=>"Zelle1.1")); $tpl->add("td",array("varname"=>"Zelle1.2")); // Knoten "td" bereits vorhanden, daher neuer loop für td $tpl->add("tr",array()); // Knoten "tr" bereits vorhanden, daher neuer loop für tr $tpl->add("td",array("varname"=>"Zelle2.1")); // unter dem aktuellen tr, gibt es noch kein td, daher neuer Knoten $tpl->add("td",array("varname"=>"Zelle2.2")); // Knoten "td" bereits vorhanden, daher neuer loop für td

Blöcke auf der selben fiktiven Ebene, erhalte ich durch setzen des "internen Zeigers"

PHP Code
1
2
3
4
5
6
7
8
$tpl->add("table",array()); $tpl->add("tr",array()); $tpl->add("td",array("varname"=>"Zelle1.1")); $tpl->add("td",array("varname"=>"Zelle1.2")); $tpl->set( 'table' ); // zurück zu Knoten "table" $tpl->add("tr2",array()); $tpl->add("td",array("varname"=>"Zelle1.1")); $tpl->add("td",array("varname"=>"Zelle1.2"));

Ein springen im Baum "nach unten" ist NICHT möglich (da er die unterliegenden Knoten nicht kennt), aber dies habe ich bisher auch noch nie benötigt.

zur 2. Frage
Beim Evaluieren des Templates zerlegt er dieses in seine einzelnen Blöcke und notiert dabei die Templatehierarchie. D.h. er speichert z.B., das im Template "main" die Untertemplates "head", "content" sowie "foot" enthalten sind.
Beim Zerlegen von "head" notiert er dann munter weiter: enthält "abc", "xyz", ...

zur 3. Frage
Er geht das Datenarray rekursiv mit foreach durch, und prüft jeweils, ob er für die aktuelle Ebene auch ein Template findet (loop-Name von "add" = Name des Templateblocks).
Findet er er einen Templateblock, folgt der rekursive Aufruf, und erst bei der Rükehr aus der Rekursion erfolgt das Füllen. Das hat den Vorteil, das Variablen innerhalb der Hierarchie vererbt werden.
D.h. Variablen welche im obigen Schnipsel bei "table" gesetzt werden, können in "tr", wie auch "td" oder "tr2" genutzt werden.

Re: Fragen zur Boardtechnik 

von
Neuling
Zitat
So hab ein wenig gebastelt um aufzuzeigen was ich so habe:

Meine Templateblöcke werden hierarchisch wie im Nopaste vermekt gespeichert, ganz am Ende befindet sich noch mein derzeitiges Datenarray
http://nopaste.info/a960ef5b48.html

Meinst du das so?



Was das Datenarray anbelangt hab ich im Moment das Problem das ich diesen korrekten Rücksprung zum Einhängen eines Subarrays nicht schaffe. Zwischenzeitlich hatte ich mir zwar in einer Klassenvar gemerkt wo ich ein Block sich befindet und diesen dann erweitert allerdings hatte ich nach 2td Block einfügen und dann wieder 1x tr Block das Problem das er den tr Block in einem td Block eingehängt hat.

Mein Code sieht so aus, evtl. kannst du mir hier weiterhelfen (hab den fehlerhaften Code entfernt und nur noch den Basisfall)
Grafische Ausgabe (ganz unten) im Nopaste Link

PHP Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function add($name, $data){ if(count($this->__tempBlocks) > 0){ $this->insertBlock($name,$data,$this->curBlocks); } else{ $this->__tempBlocks[$name]=0; $this->curBlocks=&$this->__tempBlocks[$name]; } } private function insertBlock($name,$data,&$blocks){ if(is_array($blocks)){ foreach($blocks as $key => $var){ $this->insertBlock($name,$data,&$blocks[$key]); } } else{ $blocks=array();
für die ungekürzte Fassung bitte einloggen

Re: Fragen zur Boardtechnik 

von
the Boss
Zitat
mein Datenarray sieht auf den ersten Blick genauso aus.

Nur meine Template sind nicht verschachtelt, beim ermitteln der Blöcke notiert er in einem externen Array die Verschachtelung. Dadurch kann ich die Blöcke innerhalb einer Seite auch mehrfach verwenden.

Das Problem des korrekten Rücksprungs lose ich durch ein weiteres Array, eine einfache Liste der aktuellen Rekursionstiefe.

Re: Fragen zur Boardtechnik 

von
Neuling
Zitat
Könntest du das vll. mal exemplarisch zeigen wie du das meinst?

also die rekursionstiefe soll das ein int wert symbolisieren je Block?

und zu den Tpl Blöcken
also meinst du das so?
$tpl[tpl1]['table']='dsfs {Block tr}';
$tpl[tpl1]['tr']='dsfs {Block td}';

?

Re: Fragen zur Boardtechnik 

von
the Boss
Zitat
er hat nachher intern mehrere Arrays:

Code
1
2
3
4
5
tpl => array( 'main' => '{include head} Inhalt der speziellen Seite {include foot}', 'head' => '<html> ... <body>', 'foot' => '</body></html>' )

außerdem die Verchachtelung (das {include ...} ist nur der Platzhalter)

Code
1
2
3
dep => array( 'main' => array( 'head','foot' ) )

Beim Ausfüllen des Templates geht er das Datenarray rekursiv durch, und wenn er auf ein Array stößt,
schaut er nach, ob er einen Block mit selbem Namen findet.

Seite: 1 [2]

Schnellantwort

ähnliche Themen