Nachdem ich mein erstes Problem, der erst fehlschlagenden Speicherung von Werten in einem neuen Datenbank-Feld gelöst habe, gibt es jetzt neue Probleme.
Außerhalb von Oxid habe ich bereits Smarty genutzt, das was in Oxid passiert, wirft bei mir jedoch so einige Fragen auf.
Zuerst einmal die Frage, weswegen um die Smarty Codes im Template immer eckige Klammern gemacht werden (müssen)? Macht man das nicht, wird es als Klartext ausgegeben, was man im Template mit Smarty gemacht hat.
Nun habe ich mir in einem Modul ein Array erstellt, welches ich im Template mit Smarty ausgeben will. Normalerweise gibt man bei Smarty die Arrayelemente mit z.B. “$array.element” aus. Bei Oxid geht das wohl nicht.
Wie kann ich nun auch meine Arrayelemente zugreifen und diese ausgeben?
Hier mal das Array, wie es in PHP erzeugt wird und darunter die bisherige Ausgabe im Template.
$rows = $oDB->Execute( $sSelect);
$count = $rows->recordCount();
$arrArticles = array();
if( $rows != false && $count > 0 )
{
while ( !$rows->EOF )
{
array_push($arrArticles,
array( "oxid_id" => new oxField($rows->fields[0]),
"article_number" => new oxField($rows->fields[1]),
"title" => new oxField($rows->fields[2]),
"short_description" => new oxField($rows->fields[3]),
"price" => new oxField($rows->fields[4])
)
);
$rows->MoveNext();
}
}
<ol>
[{foreach from=$article_list item=article name=article_list}]
<li>
Name: [{$article->title->value}] |
Artikelnummer: [{$article->article_number->value}] |
Kurzbeschreibung: [{$article->short_description->value}] |
Preis: [{$article->price->value}] |
Oxid-ID: [{$article->oxid_id->value}]
</li>
[{/foreach}]
</ol>
Meine Ausgabe erzeugt aktuell 51 Listenpunkte. Das heißt also, mein Array ist korrekt im Smarty vorhanden, nur ist mein Zugriff auf die einzelnen Werte nicht möglich, es sieht nur in etwa so aus:
- Name: | Artikelnummer: | Kurzbeschreibung: | Preis: | Oxid-ID:
- Name: | Artikelnummer: | Kurzbeschreibung: | Preis: | Oxid-ID:
- Name: | Artikelnummer: | Kurzbeschreibung: | Preis: | Oxid-ID:
Wo könnte mein Fehler liegen, dass keine Arraywerte angezeigt werden?
Da sind 2 Fehler drin:
- Array-Aufbau::
$arrArticles[]=array(
"oxid_id" => $rows->fields[0],
"article_number" => $rows->fields[1],
"title" => $rows->fields[2],
"short_description" => $rows->fields[3],
"price" => $rows->fields[4]);
- Array auslesen:
[{foreach from=$article_list item=article name=article_list}]
<li>
Name: [{$article.title}] |
Artikelnummer: [{$article.article_number}] |
Kurzbeschreibung: [{$article.short_description}] |
Preis: [{$article.price}] |
Oxid-ID: [{$article.oxid_id}]
</li>
[{/foreach}]
[QUOTE=AlexWeedy;58301]Zuerst einmal die Frage, weswegen um die Smarty Codes im Template immer eckige Klammern gemacht werden (müssen)? Macht man das nicht, wird es als Klartext ausgegeben, was man im Template mit Smarty gemacht hat.[/QUOTE]
Damit man in dem absolut seltenen Fall, dass man in das Template ein Javascript einbaut, dieses nicht mit “literal”-Tags umgeben muss…
Sinnlos?
Absolut sinnlos!
Danke zuerst einmal für die Antworten!
Die Template Ausgabe hatte ich ebenfalls schon so, wie Du es jetzt auch wieder als korrigiert aufgelistet hast. Ändert nichts!
Ebenso habe ich den Quelltext im PHP geändert, obwohl das, was ich zuvor hatte, am Ende genau das gleiche Resultat erzeugt hat. Es ändert ebenfalls nichts!
Die Ausgabe im Template ist leer. Er durchläuft die Schleife 51 Mal, so oft also wie das Array im PHP mit Zeilen aus der SQL Abfrage befüllt wurde, gibt jedoch nur leere Ergebnisse aus.
Es gibt nicht mal einen Fehler o.ä., so dass ich sehen könnte, was ich falsch mache, nein es wird einfach nur keine Smarty Variable ausgegeben obwohl das Smarty foreach korrekt als Schleife abgearbeitet wird.
Dann füge mal am Anfang des Templates ein [{debug}] ein, dann erhältst Du eine Übersicht über die verfügbaren Smarty Variablen und ihre Struktur.
Danke für den Tipp!
Damit sehe ich nun, dass die Variablen leer sind. Also [I]null[/I].
Mal schauen, weswegen das so ist, denn das SQL, also die Abfrage spuckt richtige Werte aus, nur werden sie wohl nicht korrekt ins Array geschrieben. Ich vermute einen Fehler in diesem Bereich
if( $rows != false && $count > 0 )
{
while ( !$rows->EOF )
{
$arrArticles[]=array(
"oxid_id" => $rows->fields[0],
"article_number" => $rows->fields[1],
"title" => $rows->fields[2],
"short_description" => $rows->fields[3],
"price" => $rows->fields[4]);
/*
array_push($arrArticles,
array( "oxid_id" => new oxField($rows->fields[0]),
"article_number" => new oxField($rows->fields[1]),
"title" => new oxField($rows->fields[2]),
"short_description" => new oxField($rows->fields[3]),
"price" => new oxField($rows->fields[4])
)
);
*/
$rows->MoveNext();
}
}
Edit:
Warum auch immer es zuvor “teilweise” funktioniert hat (immerhin wurde die Schleife 51 Mal durchlaufen), nun bekomme ich alle Ergebnisse, wie ich es benötige. Dabei war der Fehler die Schreibweise. Case Sensitive ist logisch und muss hier beispielsweise wie folgt aussehen:
$rows = $oDB->execute($sSelect);
sowie
$rows->moveNext();