Entwicklung & Design

TYPO3: Zehn Tipps & Tricks für Extbase und Fluid

Seite 2 / 3

Default-Sortierung im Repository

Nicht unbedingt unbekannt, aber weitestgehend ungenutzt ist ein Feature, welches in Extbase 1.3 hinzugekommen ist: Im Repository besteht die Möglichkeit, das Ergebnis nach bestimmten Feldern aufsteigend oder absteigend zu sortieren. Dies wird beispielsweise mittels „$query->setOrderings(array(’name‘ => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));“ erledigt.

Um dies nicht für jede einzelne Repository-Funktion einstellen zu müssen, gibt es die Eigenschaft defaultOrderings:

Im Repository
protected $defaultOrderings = array ('name' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING);

Listing 6

Eigenes Template im Controller

Normalerweise ist in Extbase und Fluid immer alles genau geregelt – „Convention over Configuration“ lautet das Motto und das macht durchaus Sinn. So ist beispielsweise festgelegt, dass im Controller automatisch der View (und damit zunächst die HTML-Datei) ermittelt wird, der zum Controller und zur Action passt. Eine List-Action des Blog-Controllers (List.html) erwartet das Template somit im Verzeichnis Resources/Private/Templates/Blog/.

Nun kann es aber durchaus sein, dass man von dieser Vorgabe abweichen und ein eigenes Template definieren möchte – beispielsweise damit ein eingeloggter Administrator ein anderes Template erhält als der normale User. Dies kann über die Methode setTemplatePathAndFilename wie folgt realisiert werden:

Im Controller – innerhalb einer Action
public function listAction() {
	...
	$this->view->setTemplatePathAndFilename(
			'typo3conf/ext/' .
			$this->request->getControllerExtensionKey() .
			'/Resources/Private/Templates/Blog/NeuesTemplate.html'
		);
	...
	$this->view->assign(...);
}

Listing 7

Individuelle SQL-Abfragen

Extbase besitzt einen sehr leistungsfähigen Query-Manager. Dieser baut Abfragen so zusammen, wie es SQL eben passt – getreu dem Motto „Don’t care about databases“. Tatsächlich gibt es im Domain Driven Design (der Philosophie, die hinter FLOW3 und damit auch hinter Extbase steht) keine Datenbanken, sondern nur „Repositories“.

Damit wird die technische Realisierung der Speicherung letztlich außerhalb der Domäne transportiert. Folgerichtig befindet sich in der Domäne kein SQL – denn dies funktioniert ja nur mit einer Datenbank. Die Daten könnten aber auch im Filesystem oder in einem Webservice gespeichert sein.

Im Alltag wird aber nach wie vor eine MySQL-Datenbank verwendet werden und so existiert auch in Extbase eine Möglichkeit, Datenbanken direkt anzusprechen. Dies kann zum Beispiel dann von Nutzen sein, wenn komplexe Queries für statistische Auswertungen oder auf Performance optimierte Befehle abgesetzt werden sollen.

Damit dies allerdings gelingt, muss der interne Mechanismus ausgeschaltet werden, mit dem Extbase probiert, aus dem Query-Result wieder fertige Objekte zu konstruieren. Hier kommen die so genannten Query-Settings und mit ihnen die Statement-Methode der Query-Factory ins Spiel:

Im Repository
public function findRaw(){
	$query = $this->createQuery();
	$query->getQuerySettings()->setReturnRawQueryResult(TRUE);
	$query->statement('SELECT * from tx_simpleblog_domain_model_blog');
	return $query->execute();
}

Listing 8

Es wird nun statt des Objekt-Interfaces ein Array mit dem Ergebnis der Datenbankabfrage zurückgeliefert. Allerdings verliert Fluid damit seine Aufwärtskompatibilität zu FLOW3. Nun noch Controller und View angepasst und schon steht dem Datenbankzugriff nichts mehr im Weg:

Controller
$this->view->assign('result',$this->blogRepository->findRaw());

Listing 9

View
<f:for each="{result}" as="row">
	{row.title}<br />
</f:for>

Listing 10

Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

3 Kommentare
Stefan

Schöne Übersicht, ein paar Punkte sind sehr hilfreich bei Problemen die bisher echt Nerven gekostet haben. Die verfügbaren Extbase/Fluid-Dokus sind ja insgesamt etwas mager und wiederholen sich auf einem bestimmten Niveau.
Hier sind aber endlich mal ein paar neue Beispiele – vielen Dank!

Claus
Claus

Das Code Template von Typovision enthält einen Fehler. Das Image Tag hat kein Argument source, sondern src.

sabine.deeken
sabine.deeken

Settings-Zugriff im Viewhelper mit Namespaces (getestet in TYPO3 6.1):

/**
* @var \TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface
* @inject
*/
protected $configurationManager;

/**
* Injects the configuration manager, retrieves the plugin settings from it
*
* @param \TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface $configurationManager
* @return void
* @override \TYPO3\CMS\Extbase\Mvc\Controller\AbstractController
**/
public function injectConfigurationManager(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface $configurationManager) {
$this->configurationManager = $configurationManager;
$settings = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS);
$this->settings = $settings;
}