Template-Klasse + option-Felder dynamisch erstellen

Elite

Grünschnabel
So jetzt komme ich auch mal dazu hier was zu posten.
Und zwar geht es um eine selber programmierte Template-Klasse, die ich um eine Funktion erweitern möchte, die mit Hilfe einer mySQL-Abfrage automatisch eine Auswahlliste (<option>) erstellt.
Nur stehe ich auf dem Schlauch, wie so etwas anzufangen ist, da das besondere dabei ist, dass ich am liebsten in den Templates z.B. nur {AUSWAHLLISTE} stehen haben möchte und beim ersetzen dann die x-fachen <option>-Felder erscheinen.
Als Beispiel: Ich lese z.B. aus ner mySQL-DB Projekte aus und möchte dann eine Liste haben mit den Projekten. Als value bei der <option> soll die jeweilige id des Projekts angezeigt werden und als "Beschriftung" dann halt der Name.
Soviel zur Theorie. Ich poste nun erstmal nen Auszug aus meiner Klasse und zeige euch dann mal einen Ansatz.

Funktion setvar
PHP:
function setvar($name = '', $value = ''){
	$name = strtoupper($name);
	if(!$name)
	{
	$this->_error .= "No Placeholder for the value '".$name."' selected!<br>";
	}
	else
	{
		if(!is_array($name) AND !is_array($value)) $this->_content = str_replace("{".$name."}", $value, $this->_content);
		if(is_array($name) AND !$value) $this->setarray($name);
	}
}

Funktion setarray
PHP:
function setarray($array){
foreach ($array as $placeholder => $thevalue) {
$this->setvar($placeholder, $thevalue);
}
}

So das sind denke ich die beiden Funktionen, die für mein Problem evtl. noch wichtig sein sollten.

So jetzt zurück zu meinem Problem. Ich dachte mir dass ich das am besten so anfange, dass ich die Datensätze erst einmal in ein Array lade.

PHP:
$res_arr = array();
$query = "SELECT id, projectname FROM $dbprefix"."projects";
$result = mysql_query($query);
$count = mysql_num_rows($result);
while ($row  =  mysql_fetch_array($result)) {
$res_arr[] = $row;
}

jetzt hab ich ja alle Datensätze im Array $res_arr. Ausgeben könnte man das ganze jetzt ja z.B. mit
PHP:
echo $res_arr['1']['projectname'];

So jetzt mein Ansatz wie ich das mit der Klasse verbinde:

PHP:
function selectarray($array, $placeholder){
if(is_array($array)){
	sort($array);
	$x = 0;
	foreach($array as $id => $projectname){
	$var = "<option value=\"".$array[$x]['id']."\">".$array[$x]['projectname']."</option>\n";
	$x++;
	}
} else{
$this->_error .= "You must select an Array for the function 'selectarray' !<br>";
}

}

Diese Variable var könnte man jetzt mit echo ausgeben und dann hab ich meine Liste.
Nur möchte ich ja, dass ich z.B. in mein Template schreibe {AUSWAHLLISTE} und dann dort die Liste erscheint.
Deshalb meine Frage: Wie könnte ich das machen bzw. was muss ich an den Funktionen ändern/hinzufügen ?

Ich hoffe ihr könnt mir helfen!
 
Ja wo gehört denn sonst so etwas hin?
Ich mein die Template-Klasse sorgt ja dafür, dass die Platzhalter ersetzt werden.
Wie würdest du denn die Erstellung dieser Liste mit Templates verbinden? Durch die Datenbank-Sache kann ich ja in den Templates keine festen <option>-Felder einbauen, da sich der Datenbank-Inhalt laufend ändern ( kann ) und so diese Auswahlliste immer dynamisch erzeugt werden muss
 
Hallo,
du könntest ja das Ergebnis der Datenbankabfrage in einem Array speichern und dann in deinem Template mit einer foreach Schleife das Array entsprechend ausgeben.
So ungefähr (Smarty Syntax).
Code:
<select size="1" name="projekte">
    {foreach key=id item=projektname from=$deinarray}
        <option value="{$id}">{$projektname}</option>
    {/foreach}
</select>

mfg
forsterm
 
Zuletzt bearbeitet:
Nun ja, die Aufgabe einer Template Engine ist Platzhalter in einer Vorlage zu ersetzen. Das war’s. Alles weitere gehört nicht in eine Template Engine.
 
Aus meiner Sicht ist die vorrangige Aufgabe einer Template Engine, den Code vom Design zu trennen und insofern ist es aus meiner Sicht auch absolut zulässig solche Funktionen einzubauen.

Du solltest dir vielleicht überlegen, ob du das ganze selber programmieren möchtest, oder nicht vielleicht doch eine bereits fertige Engine nutzt, Smarty ist aus meiner Sicht relativ umfangreich und auch performant. Neben der Syntax, die oben bereits erwähnt worden ist, existiert noch eine Variante speziell für HTML-options "{html_options values=$value_array output=$output_array selected=$selected_value}". Die könntest du per regexp auch für deine Funktion programmieren, oder aber einfach gleich die Smarty Engine (http://smarty.php.net) verwenden.
 
Habs jetzt anders gelöst:

Funktion:
PHP:
function createlist($query,$wert,$beschreibung) {
  global $dbprefix;
  $sql = mysql_query($query);
  $options = "";
   while($row = mysql_fetch_array($sql)) {
     $options .= "<option value=\"".$row[$wert]."\">";
     $options .= "".$row[$beschreibung]."</option>\n";
	}
	return $options;
	
}

Aufruf:
PHP:
$t->setvar("optionrows", $t->createlist("SELECT id, projectname FROM $dbprefix"."projects","id", "projectname"));
 
Zurück