Typo3 Extensions mit Extbase und Fluid – All Featured Extension | Controller & Views

Werfen wir wieder einen Blick auf den Controller, den wir bereits auf die Schnelle geschrieben haben.

namespace Tut23tutorial\Tut23bandagenda\Controller;

/**
 * Tut23bandController
 */
class Tut23bandController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

	/**
	 * tut23bandRepository
	 *
	 * @var \Tut23tutorial\Tut23bandagenda\Domain\Repository\Tut23bandRepository
	 * @inject
	 */
	protected $tut23bandRepository = NULL;

	/**
	 * action list
	 *
	 * @return void
	 */
	public function listAction() {
		$tut23bands = $this->tut23bandRepository->findAll();
		$this->view->assign('tut23bands', $tut23bands);
	}

	/**
	 * action show
	 *
	 * @param \Tut23tutorial\Tut23bandagenda\Domain\Model\Tut23band $tut23band
	 * @return void
	 */
	public function showAction(\Tut23tutorial\Tut23bandagenda\Domain\Model\Tut23band $tut23band) {
		$this->view->assign('tut23band', $tut23band);
	}

Zur Erinnerung: Als erstes integrieren wir das Repository über die inject-Methode in den Controller und es steht uns durch die Variable $tut23bandRepository mit allen im letzten Abschnitt benannten Methoden zur Verfügung.

Wir greifen in der list Action direkt auf die findAll() Methode zu und erhalten alle Einträge aus unserer Band Agenda mit allen im Model definierten Variablen und Objekten. Diese übergeben wir mit der bekannten view->assign() Methode an das List.html Template, welches nun automatisch aus dem Ordner Resources/Private/Templates/Tut23band/ geladen wird. Wir erstellen hier erstmal eine Liste aller Bands in der Reihenfolge, die durch das Repoitory vorgegeben wurde. Die Liste beschränkt sich auf das Bild, soweit vorhanden, dem Titel, einem Text-Auszug und einem ‚weiterlesen‘ Link.

<f:layout name="Default" />
<f:section name="main">
	<f:for each="{tut23bands}" as="tut23band">
		<article>
			<div>
				<f:if condition="{tut23band.images}">
					<f:image src="{tut23band.images.originalResource.uid}" treatIdAsReference="1" />
				</f:if>
			</div>
			<div>
				{tut23band.titel}
			</div>
			<div>
				<f:format.html><f:format.crop maxCharacters="200" respectWordBoundaries="1">{tut23band.description}</f:format.crop></f:format.html>
			</div>
			<div>
				<f:link.action action="show" arguments="{tut23band : tut23band}"> Read More</f:link.action></td>
			</div>
		</article>
	</f:for>
</f:section>

Hier finden wir zwei View Helper, die bis jetzt nicht beleuchtet wurden: f:image (Diesem widmen wir uns im Abschnitt FAL) und f:link.action. In der kurzen Einleitung in Fluid wurde darauf hingewiesen, dass f:link.action in der Extension Entwicklung eine wichtige Rolle spielt. Er wird dazu genutzt einen Controller und eine bestimmte Action anzusprechen. In diesem Falle automatisch der Tut23bandController mit dem Aufruf der show Action. Als Parameter wird das gesamte tut23band Object an die Action übergeben.

Das Layout wurde natürlich wie wir es kennen aus dem Layout-Ordner geladen und braucht hier keine weitere Erläuterung, aber als Tipp für die Default.html: <f:render section=“main“ />.

Wenn wir einen Blick in den Controller werfen, stellen wir fest, dass die Show Action als Parameter ‚@param \Tut23tutorial\Tut23bandagenda\Domain\Model\Tut23band $tut23band‘ ein Objekt namens $tut23band erwartet, welches durch das Model Tut23band definiert wird. Um es etwas näher zu verdeutlichen, erinnere ich daran, dass wir bei der Model Gestaltung bereits gelernt haben, dass wir über @param den Variablen Typ definieren und ihn auch als Objekt definieren können. In der show Action wird nun genau das angewendet und unser Extension Model definiert.

Durch diese Übergabe ist es nicht mehr notwendig eine Datenbank Abfrage durchzuführen. Das gesamte Objekt kann direkt dem Show.html View übergeben werden, der wieder automatisch aus dem Ordner Resources/Private/Templates/Tut23band/ geladen wird.

<article>
	<div>
		<h1>{tut23band.titel}</h1>
	</div>
	<div>
		<f:if condition="{tut23band.images}">
			<f:image src="{tut23band.images.originalResource.uid}" treatIdAsReference="1" />
		</f:if>
	</div>
	<div>
		<f:format.html>{tut23band.description}</f:format.html>
	</div>
	<div>
		<f:link.action action="list">Back to list</f:link.action><br />
	</div>
</article>

Jetzt haben wir alle Elemente unserer Basis Extension zusammen und werden nach der Installation feststellen, dass es noch vieles zu Verbessern gibt. Der nächste Abschnitt wird eher eine Ernüchterung, aber für die Bestandsaufnahme sehr wichtig.