Typo3 Extensions mit Extbase und Fluid – Custom View Helper

Die Standard View Helper Bibliothek bietet bereits viele Möglichkeiten. In der Praxis finden sich jedoch ständig Aufgabenstellungen, die wird mit ihnen nicht bewältigen können. So wird jeder Template Entwickler mittlerweile seine ganz eigene Bibliothek an zusätzlichen View Helpern in der Schublade haben.

Einen eigenen View Helper in einer Extension zu entwickeln ist denkbar einfach. Wir müssen dafür nur eine eigene View Helper Klasse definieren und in den Ordner Controller/ViewHelper ablegen. Im Fluid Template muss das Ganze dann noch über namespaces angesprochen werden. Dies gehen wir hier an einem kleinen Beispiel Schritt für Schritt durch.

Unsere Aufgabe: Es müssen Schlüsselwörter in einem Textblock dynamisch ausgetauscht werden, wie in der bekannten PHP Funktion str_replace.

Als erstes erstellen wir die Datei, die mit dem Namen des neuen View Helpers in UpperCamelCase ergänzt durch ViewHelper bezeichnet wird. In unsrem Fall wäre das StrReplaceViewHelper.php. Diese Art der Bezeichnung ist für jede View Helper Datei zu wählen.

Nun implementieren wir unsere View Helper Klasse, deren Name nach dem ähnlichen Prinzip vergeben wird und aus zwei Teilen besteht:

  1. Der volle  Namespace des ViewHelpers – In unserem Fall: Tx_Tut23template_ViewHelpers
  2. Wie auch schon bei dem Datei-Namen: der Name des neuen View Helpers in UpperCamelCase ergänzt durch ViewHelper – StrReplaceViewHelper

Insgesamt ist das dann die Klasse Tx_Tut23template_ViewHelpers_StrReplaceViewHelper, der die Standard ViewHelper Klasse Tx_Fluid_Core_ViewHelper_AbstractViewHelper vererbt werden muss. Die Klasse selbst benötigt dann noch die Methode render().

<?php
class Tx_Tut23template_ViewHelpers_StrReplaceViewHelper extends Tx_Fluid_Core_ViewHelper_AbstractViewHelper {

    /**
    *
    */
    public function render() {
        return 'Hello World';
    }
}

Das war auch schon das Schwierigste und der View Helper ist eigentlich schon fertig, mit der Einschränkung, dass er noch nichts kann, außer ‚Hello World‘ zurück zu geben. Aus unserem Fluid Template können wir nun Variablen übergeben, die in der Methode render() auf zwei Wegen registriert werden können.

Variante 1: Der einfachste Weg – Wir registrieren unsere benötigten Variablen direkt in der Methode render(). Dies erreichen wir durch eine gewohnte Parameter Übergabe in Funktionen. Hier müssen wir die Variablen für das Variablen Handling in Typo3 im PHPDoc Block genau definieren. Für die Rückgabe setzen wir dann auch gleich die str_replace Funktion ein.

	/**
	* @param string $subject Content
	* @param string $search Search Key
	* @param string $replace Replacement Key
	* @return string the Content with replaced Keys
	*/
	public function render($subject, $search, $replace) {
		return str_replace($search, $replace, $subject);
	}

Variante 2: Bei View Helpern mit vielen Variablen wird das ganze schnell unbeweglich. Deswegen haben wir auch die Möglichkeit alle Variablen mit der Methode initializeArguments() zu registrieren. Über $this->registerArgument($name, $type, $description, $required, $defaultValue) können wir nun die jeweiligen Variablen registrieren und in der Methode render() durch $this->arguments[] direkt auf diese zugreifen.

/**
* Arguments Initialization
*/
public function initializeArguments() {
	$this->registerArgument('subject', 'string','Content with replaced Elements', TRUE);
	$this->registerArgument('search', 'string','Content to Replace', TRUE);
	$this->registerArgument('replace', 'string','Content to Replace with', TRUE);
}

/**
* @return string the Content Element with links
*/
public function render() {
	return str_replace($this->arguments['search'], $this->arguments['replace'], $this->arguments['subject']);
}

Nun ist unser kleiner str_replace View Helper einsatzbereit. Jetzt muss er nur noch im Fluid Template aktiviert werden. Auch kommen wieder Namespaces zum Zuge. In der ersten Zeile des Templates werden alle zusätzlichen View Helper geladen. Dafür müssen wir lediglich einen unique Namensraum definieren und über den View Helper Namespace alle View Helper aus unserem Extension-Ordner importieren.

{namespace tv = Tx_Tut23template_ViewHelpers}

Jetzt können wir unseren View Helper über den Namespace und den Namen verwenden.

<tv:StrReplace subject="foo bar" search="foo" replace="bar" />

Weitere Informationen findet man wie üblich in unendlichen Foren Einträgen und natürlich der Typo3 Dokumentation.