Zum Inhalt springen

Fluid: Werte mit TypoScript parsen

Erstellt am 5. Juli 2010 · 6 Antworten · letzte Antwort am 16. September 2011

Tags: Frage

einpraegsam.​net ·

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

kainobi ·

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.

einpraegsam.​net ·

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 = |&nbsp;&euro;
	}
}

Hoffe es kann jemand brauchen...

einpraegsam.​net ·

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" />
einpraegsam.​net ·

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
	}
}
moberndoerfer ·

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?

sktypo3 ·

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?