vLIB Einführung |
![]() |
Wir haben gelernt mit LOOPS umzugehen und mehrere Datensätze mit TMPL_LOOP auszugeben. Das waren jedoch statische SELECT-Anweisungen, die eine vordefinierte Anzahl von Spalten hatten. Ebenso waren unsere Templates klar definiert.
Was passiert, wenn wir einen dynamischen LOOP bauen wollen, der jeden SELECT ausgeben kann? Wenn die Anzahl der Spalten unbekannt ist? Dann kommen wir mit den erläuterten Beispielen nicht weiter.
Eine Datenbank-Tabelle besteht aus Zeilen und Spalten (siehe die Zeichnung weiter unten). Das heißt, eine Datenbank-Tabelle kann normalerweise mit einem zweidimensionalen Array dargestellt werden. Da wir aber für einen LOOP immer auch die Namen der Templatevariablen im Array benötigen, brauchen wir für die Zeilen und Spalten einer Tabelle einen vierdimensionalen Array (2 x 2 = 4). Hinweis: Ein LOOP-Array hat immer die doppelte Anzahl von Dimensionen als der ursprüngliche Array (siehe Aufbau und Struktur eines LOOP-Arrays).
Fangen wir mit der Erstellung des Templates an:
<html>
<head>
<title>display data from an unknown table</title>
</head>
<body>
<table border="1" width="100%">
Damit hätten wir den Anfang. Jetzt müssen wir die Spaltenüberschriften in das Template einbinden. Dazu reicht uns ein einfacher LOOP mit einem zweidimensionalen LOOP-Array. Die Anzahl der Spaltenüberschriften ist zwar ebenfalls unbekannt, aber diese sind in einem eindimensionalen Array darstellbar und der LOOP-Array hat demnach zwei Dimensionen.
$spalten = array('name', 'city', 'country');
oder
$spalten = array('country', 'city');
Wie schon erwähnt, ist $spalten ein Array mit einer Dimension. Aufbereitet muss er zwei Dimensionen und somit folgende Struktur haben:
$loop_spalten = Array
(
[0] => Array ( [colname] => name )
[1] => Array ( [colname] => city )
[2] => Array ( [colname] => country )
)
$loop_spalten ist unser LOOP-Array, indem wir "colname" als Templatevariable festgelegt haben.
<tr>
<tmpl_loop name='table_header'>
<th align="left">{tmpl_var name='colname'}</th>
</tmpl_loop>
</tr>
Die Spaltenüberschriften haben wir jetzt im Template untergebracht, jetzt kommen die Datensätze. Dazu werden wir einen verschachtelten LOOP brauchen.
Wie bauen wir diesen LOOP am besten auf? Der äußere LOOP enthält alle Tabellendaten, sowohl die Zeilen, als auch die Spalten. Also nennen wir LOOP und LOOP-Array "table_data".
Der innere LOOP wird eine komplette Zeile enthalten, also wäre "row" ein logischer Name für den LOOP und "cell" der Name für die Templatevariable bzw. den Zelleninhalt. Den LOOP-Array kann man entweder "$row" oder "$cells" (es sind ja mehrere Zellen enthalten) nennen, allerdings wird "$row" schon durch $row = mysql_fetch_row($result) vorbelegt, also können wir diesen Variablennamen nicht mehr vergeben.

Es steht Euch natürlich frei, andere Namen zu verwenden. Wie dem auch sei, der (vierdimensionale) LOOP-Array muss folgendermaßen aufgebaut werden:
Array
(
[0] => Array
(
[row] => Array
(
[0] => Array ( [cell] => Nordheimer, Ute )
[1] => Array ( [cell] => Berlin )
[2] => Array ( [cell] => Deutschland )
)
)
[1] => Array
(
[row] => Array
(
[0] => Array ( [cell] => Pullu, Murath )
[1] => Array ( [cell] => Kairo )
[2] => Array ( [cell] => Ägypten )
)
)
)
Und das Template so:
<tmpl_loop name='table_data'>
<tr bgcolor="<tmpl_if name='__EVEN__'>#eeeeee<tmpl_else>#dcdcde</tmpl_if>">
<tmpl_loop name='row'>
<td valign="top">{tmpl_var name='cell'}</td>
</tmpl_loop>
</tr>
</tmpl_loop>
</table>
</body>
</html>
Wir haben an dieser Stelle noch eine kleine Neuheit:
"__EVEN__" ist eine Variable, die nur in einem LOOP gesetzt ist. Sie ist entweder TRUE oder FALSE (1 oder 0). Siehe dazu auch den Abschnitt "Options - GLOBAL_CONTEXT_VARS" im Original der vlibTemplate-Dokumentation.
Da jetzt das Template fertig ist, können wir uns dem PHP-Skript "db_adv.php" zuwenden.
<?php
require_once 'vlib/vlibTemplate.php';
$tmpl = new vlibTemplate('tmpl/db_adv.htm');
// DATABASE variables and query
require_once 'db_config.php';
mysql_connect($db_host, $db_user, $db_pw);
mysql_select_db($db_name);
$select = "SELECT * FROM $db_table";
$result = mysql_query($select);
Ok, der Einstieg wäre geschafft. Jetzt müssen wir uns überlegen, wie wir den Header aufbauen. Das ist noch relativ einfach; wir brauchen einen
$table_header = array();
for ($i = 0; $i < mysql_num_fields($result); $i++)
{
array_push($table_header, array('colname' => mysql_field_name($result, $i)));
}
$tmpl->setloop('table_header', $table_header);
Anhand dieses Beispiels können wir auch den nächsten LOOP aufbauen. Für den äußeren LOOP verwenden wir den Array $table_data und der innere wird in $cells abgespeichert. Nun besteht eine Tabelle ($table_data) aus mehreren Zellen, also muss $cells ein Teil von $table_data sein.
$table_data = array();
while ($row = mysql_fetch_row($result))
{
$cells = array();
for ($j = 0; $j < mysql_num_fields($result); $j++)
{
array_push($cells, array('cell' => $row[$j]));
}
array_push($table_data, array('row' => $cells));
}
$tmpl->setloop('table_data', $table_data);
$tmpl->pparse();
mysql_close();
Unser Beispiel besteht jetzt im Wesentlichen aus den 2 LOOPs $table_header und $table_data. Beide werden abhängig vom $result gebildet und somit ist jeder SELECT ausführbar und das Ergebnis kann abgebildet werden.