Mit Fluid lassen sich tolle Dinge machen. Einfach ein Objekt definieren und dann im HTML Template ausgeben...
public function listAction() {
$productRepository = t3lib_div::makeInstance('Tx_Inventory_Domain_Repository_ProductRepository');
$products = $productRepository->findAll();
$this->view->assign('products', $products);
}
<ul>
<f:for each="{products}" as="product">
<li>
<ul>
<li>{product.name}</li>
<li>{product.description}</li>
<li>{product.quantity}</li>
</ul>
</li>
</f:for>
</ul>
Ich habe auch schon irgendwo gesehen, dass sich in Fluid die Ausgabe individuell anpassen lässt (Zeichen begrenzen, userFuncs einbinden, if Bedingungen, etc...). Aber lassen sich die Werte auch vorher noch durch TypoScript "durchjagen"?
Als Beispiel würde mir schon ein TypoScript Wrap reichen...
Ideen?
Gruß, Alex
Jo, sowas habe ich mir auch schon gedacht, hatte allerdings noch keine Zeit mich weiter damit zu beschäftigen :-)
Dazu wirst Du Dir einen eigenen ViewHelper schreiben müssen, idealerweise gleich einen mit stdWrap-Funktionalität damit Du gleich das volle Programm hast...
Wie man einen eigenen ViewHelper schreibt müsste eigentlich in der Extbase-Doku vom Mittwald drin stehen.
Hallo Kai,
dein Tipp war goldrichtig. Habe mal etwas mit Viewhelpers experimentiert und auch schon eine Lösung.
Nehmen wir an, im Controller liegen die Werte als Array vor, die man ausgeben möchte:
public function listAction() {
$r = array (
'name' => 'Tolles Produkt',
'description' => 'Goldverziertes Staubsaugermodell der 1. Generation',
'price' => '3.00'
);
$this->view->assign('r', $r);
}
Dann einen neuen ViewHelper erstellen ([extKey]/Classes/ViewHelpers/TypoScriptParserViewHelper.php):
<?php
/**
* This class is a demo view helper for the Fluid templating engine.
*
* @package TYPO3
* @subpackage Fluid
* @version
*/
class Tx_Inventory_ViewHelpers_TypoScriptParserViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {
/**
* This function renders a value with TypoScript
*
* @param string $valueArray The values of all fields as array
* @param string $name The fields name
* @validate $value ArrayValidator
* @validate $name StringValidator
* @return parsed value through TypoScript
* @author Alex Kellner <alexander.kellner@einpraegsam.net>
*/
public function render($valueArray, $name) {
// config
global $TSFE;
$local_cObj = $TSFE->cObj; // cObject
$conf = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_inventory.']['TypoScriptParser.'];
$local_cObj->start($valueArray, 'tt_content');
return $local_cObj->cObjGetSingle($conf[$name], $conf[$name . '.']);
}
}
?>
Im HTML Template kann man diesen ViewHelper so aufrufen:
{namespace vh=Tx_Inventory_ViewHelpers}
<vh:TypoScriptParser value="{r}" name="name" />
<vh:TypoScriptParser value="{r}" name="description" />
<vh:TypoScriptParser value="{r}" name="price" />
Und der TypoScript Teil dazu:
plugin.tx_inventory {
TypoScriptParser {
name = TEXT
name.field = value
name.wrap = <h1>|</h1>
description = TEXT
description.field = value
description.crop = 10 | ...
price = TEXT
price.field = value
price.wrap = | €
}
}
Hoffe es kann jemand brauchen...
Aus der Mittwald Doku zu dem Thema:
Um dieses Problem zu lösen, bietet Fluid auch hierfür einen View-Helper an – was auch sonst?
Der CObject-ViewHelper nimmt einen Typoscript-Pfad sowie optional ein Array mit Daten als
Parameter entgegen, und rendert daraus mithilfe der Typoscript-API das entsprechende Objekt.
Um den oben angegebenen Typoscript-Code also ausgeben zu können, verwenden wir folgenden
View-Helper:
<f:cObject typoscriptObjectPath="plugin.tx_myext.object" />
Alles obenstehende bitte wieder vergessen - geht sehr viel einfacher und genialer mit Fluid.
Beispiel Controller:
public function listAction() {
$r = array (
'name' => 'Tolles Produkt',
'description' => 'Goldverziertes Staubsaugermodell der 1. Generation',
'price' => '3.00'
);
$this->view->assign('product', $r);
}
Im HTML Template:
{product -> f:cObject(typoscriptObjectPath: 'plugin.tx_ext.product', currentValueKey: 'name')}
Und der TypoScript Teil dazu:
plugin.tx_ext {
# show name
product = TEXT
product.current = 1
}
Das Ganze auch etwas komplexer:
plugin.tx_ext {
product = COA
product {
10 = TEXT
10.field = name
20 = TEXT
20.field = description
}
}
Hi,
was macht man, wenn das Produkt im Beispiel ein Aggregate Root ist und man an die Werte aus einem zugeordneten Object Storage möchte? Zum Beispiel könnte an das Produkt ja ein Produktmanager angehängt sein und man will nun im Gifbuilder sein Foto mit darstellen.
Sowas wie
10.field = product.productmanager.image
funktioniert leider nicht.
Gibt es da einen workaround für?
Also die Frage interessiert mich auch.
Ich habe ein Objekt, von dem ich auch Eigenschaften der Unterobjekte im Typoscript benötige.
Gibt des da einen Weg mit Typoscript oder müsste man die Daten in Extbase zusammenstellen?