Search the FirstSpirit Knowledge Base
Hallo zusammen,
ich versuche eine DOMTABLE aus einer Datenbank-Tabelle in eine CMS_Function vom Typ Table zu übergeben. Leider wird hier jedoch folgender Fehler geworfen:
(de.espirit.firstspirit.generate.SiteProduction): 'tableData' has wrong type: 'de.espirit.firstspirit.parser.eval.Undefined'.
Der Aufbau ist folgendermaßen:
In der Datenbank-Tabelle "product" werden die Daten eines CMS_INPUT_DOMTABLE (aus Formular der Tabelle) als Typ DOMTABLE gespeichert.
Bei der Auslese des DOMTABLE in einer Absatzvorlage, sollte die CMS_Function "Table" die Tabelle individuell verändern. Jedoch passiert an dieser Stelle dann der genannte Fehler.
Muss die Information aus der Datenbank erst in irgendeiner Form konvertiert werden, damit die Header-Funktion weiß, dass es sich um ein DOMTABLE-Element handelt?
Codeteil Table Formular:
<CMS_INPUT_DOMTABLE name="cs_comparison" allowEmpty="yes" bold="yes" hFill="yes" italic="yes" useLanguages="no">
<LANGINFOS>
<LANGINFO lang="*" label="Vergleich"/>
</LANGINFOS>
</CMS_INPUT_DOMTABLE>
Codeteil Absatzvorlage Formular:
<CMS_INPUT_COMBOBOX name="st_product" allowEmpty="no" hFill="yes" sortOrder="ascending" useLanguages="no">
<CMS_INCLUDE_OPTIONS type="database">
<LABELS>
<LABEL lang="*">#item.name</LABEL>
</LABELS>
<TABLE>product.product</TABLE>
</CMS_INCLUDE_OPTIONS>
<LANGINFOS>
<LANGINFO lang="*" label="Produkt"/>
</LANGINFOS>
</CMS_INPUT_COMBOBOX>
Codeteil Absatzvorlage Header (Ausgabekanal):
<CMS_HEADER>
<CMS_FUNCTION name="Table" resultname="fr_st_product_comparison">
<CMS_PARAM name="tableData" value="st_product.value.comparison" />
<CMS_NODE_PARAM name="tableFormat">
<HEADERSPEC>
<![CDATA[<table class="default-table feature-table" cellspacing="0" cellpadding="0">$CMS_VALUE(#content)$</table>]]>
</HEADERSPEC>
<ROW number="ALL"><![CDATA[<tr>$CMS_VALUE(#content)$</tr>]]></ROW>
<CELL col="ALL" row="ALL">
<![CDATA[<td class="text-center">$CMS_VALUE(#content)$</td>]]>
</CELL>
</CMS_NODE_PARAM>
</CMS_FUNCTION>
</CMS_HEADER>
Ohne die Funktion wird die Tabelle über $CMS_VALUE(st_product.value.comparison)$ ganz normal gerendert.
Viele Grüße
Philipp
Der Fehler besagt, das der Ausdruck "st_product.value.comparison
" nicht aufgelöst werden kann bzw. "null" liefert. Mir ist der Zusammenhang der einzelnen Templates nicht klar, es scheint mir aber, das die Kette zu dem Zeitpunkt der Auswertung der Funktion (noch) nicht verfügbar ist. Was ist denn, wenn dieses Fragment im Tabellentemplate direkt inkludiert wird?
Genau, der Ausdruck kann zu dem Zeitpunkt (Auswertung im Header) noch nicht aufgelöst werden.
Etwas später - im Body - ist er jedoch verfügbar.
Um den Zusammenhang deutlicher zu machen, hier nochmal etwas abstrakter:
Es gibt eine Datenbanktabelle "product" mit der Spalte "comparison" vom Typ DOMTABLE. Diese enthält mehrere Produkte mit jeweils einer (DOMTABLE-) Tabelle.
Desweiteren gibt es eine Absatzvorlage "product_detail", in der im Formular eine Combobox (name="st_product") mit CMS_INCLUDE_OPTIONS (zeigt auf die DB-Tabelle "product") hinterlegt ist. Hier kann eines der Produkte aus der Tabelle "product" ausgewählt werden.
Jetzt gilt es im Ausgabekanal der Absatzvorlage "product_detail" die Domtable des ausgewählten Produkts anzuzeigen. Das funktioniert ohne die Header-Funktion wunderbar über $CMS_VALUE(st_product.value.comparison)$.
Die Tabelle muss aber individuell gestaltet werden (verschieden css-Klassen für verschiedene Zellen). Dazu soll die Header-Funktion "Table" genutzt werden (<CMS_FUNCTION name="Table" resultname="fr_product_comparison"><CMS_PARAM name="tableData" value="st_product.value.comparison" />). An dieser Stelle kann der Ausdruck aber anscheinend nicht ausgewertet werden.
Wäre es nicht sinnvoll, wenn an dieser Stelle auf den Inhalt zugegriffen werden könnte, so dass die CMS_FUNCTION "Table" auch für Datenbank-Einträge genutzt werden kann.
Kann das jetzige Verhalten in irgend einer Form umgangen werden?
Vielen Dank
PS
Wurde das Problem verstanden oder kann ich mit Screenshots oder detaillierteren Angaben weiterhelfen?
Um das nachvollziehen zu können wäre ein Testprojekt-Export ideal. Wahrscheinlich ist es auch besser, das über den Helpdesk laufen lassen.
Als kurzfristigen Workaround kannst du mal versuchen, das Rendering der Tabelle in ein seperates Template auszulagern, welches über $CMS_RENDER(template:XXX, table:st_product.value.comparison)$ inkludiert wird.
Hallo Peter,
vielen Dank, dein Workaround funktioniert einwandfrei.
Ich denke wir werden es bei der Lösung belassen, da dadurch der Table-Function Code auch an einer zentralen Stelle liegt und somit wartbarer ist.
Viele Grüße
Philipp