vLIB Einführung |
![]() |
Im Gegensatz zum letzten Kapitel, werden wir nicht immer in der glücklichen Lage sein, perfekte LOOP-Strukturen vorzufinden. In den meisten Fällen müssen wir uns die LOOP-Arrays zusammenbauen. Das macht man mit dem Befehl array_push(). Denn wie wir im letzten Kapitel gelernt haben, müssen alle Daten, die wir in einem TMPL_LOOP verwenden wollen, in einem LOOP-Array gespeichert werden. Dieser muss mindestens zwei, bei verschachtelten LOOPS vier, sechs, acht oder mehr Dimensionen (durch 2 teilbar) haben.
Die nächste Frage: Reichen LOOP-Arrays mit zwei Dimensionen aus, um alle Problemstellungen zu lösen? Die Antwort: Natürlich nicht. Deswegen gibt es verschachtelte LOOPs.
Ein klassisches Problem ist der Gruppenwechsel oder eine 1:N Beziehung einer Datenbankstruktur. In einem Forum zum Beispiel kann ein User beliebig viele Posts erstellt haben - eine klassische 1:N Beziehung. Wir wollen jetzt jeden Post seinem User zuordnen oder anders ausgedrückt, jeder User soll mit seinen Posts aufgelistet werden. Der Einfachheit halber bilden wir diese Struktur in zwei Arrays ab:
require_once 'vlib/vlibTemplate.php';
$tmpl = new vlibTemplate('tmpl/nested_loops.htm');
$users = array(
array('u_id' => 1, 'u_name' => 'Claus'),
array('u_id' => 2, 'u_name' => 'Kelvin'),
array('u_id' => 3, 'u_name' => 'Skrol'),
array('u_id' => 4, 'u_name' => 'Micheal')
);
$posts = array(
array('user_id' => 1, 'post' => '1st post by Claus'),
array('user_id' => 1, 'post' => 'Claus has something to say'),
array('user_id' => 1, 'post' => 'Claus: Addtional informations'),
array('user_id' => 1, 'post' => 'Claus: Problem solved!'),
array('user_id' => 2, 'post' => '1st post by Kelvin'),
array('user_id' => 2, 'post' => 'Kelvin: Best regards!'),
array('user_id' => 3, 'post' => '1st post by Skrol'),
array('user_id' => 3, 'post' => 'Skrol: Use TBS!'),
array('user_id' => 3, 'post' => 'Skrol made a different approach'),
array('user_id' => 4, 'post' => '1st post by Micheal'),
array('user_id' => 4, 'post' => 'Micheal: Thanks!')
);
$i = 0;
$outer = array();
foreach ($users as $key => $value)
{
$inner = array();
while ($value['u_id'] == $posts[$i]['user_id'])
{
array_push($inner, array(
'p_post' => $posts[$i]['post']
)
);
$i++;
}
array_push($outer, array(
'u_id' => $value['u_id'],
'u_name' => $value['u_name'],
'inner' => $inner
)
);
}
$tmpl->setloop('outer', $outer);
$tmpl->pparse();
<tmpl_loop name='outer'>
<h1>User: {tmpl_var name='u_id'} - {tmpl_var name='u_name'}</h1>
<tmpl_loop name='inner'>
<div style="margin-left: 20px">#{tmpl_var name='__ROWNUM__'}:
{tmpl_var name='p_post' escape='html'}</div>
</tmpl_loop>
</tmpl_loop>
Das Template enthält die verschachtelte LOOP-Struktur. Wie man auf einen Blick sehen kann, gleichen die Postionierungen der beiden TMPL_LOOPs einer verschachtelten WHILE-Schleife. Genauso funktioniert dann auch die Ausgabe. Die eigentliche "Intelligenz" liegt im PHP-Skript und genau dahin gehört die Programmierlogik auch.
Ebenfalls neu ist "__ROWNUM__". Hierbei handelt es sich um eine Zählervariable, die in jedem LOOP automatisch gesetzt wird und bei 1 beginnt. Mehr Informationen können Sie unter Options - GLOBAL_CONTEXT_VARS nachlesen. Das Attribut "escape" wurde schon früher in diesem Tutorial erläutert. Trotzdem hier noch einmal der Hinweis, dass man weitere Informationen zu diesem und anderen Attributen im Forum finden kann.