Typo3 Extensions mit Extbase und Fluid – All Featured Extension

Nun ist es soweit, Zeit für eine komplex Extension mit allen Facetten und mehreren Models. Wir fangen aber erstmal wieder klein an und arbeiten uns dann aufwärts.

Kunde: Entwickeln Sie eine Agenda für Bands, mit Unterseiten für die Bandmitglieder sowie die Einbindung von Musikbeispielen via Youtube. Zusätzlich muss das alles nach Genre sortierbar sein.

Wir lieben solche klare Ansagen, denn da ist wie üblich alles offen, wenn der Projekt Manager nicht seinen ganzen Job gemacht hat.

Normalerweise würde man bei einer solchen Aufgabe den Extension Builder zu Hilfe nehmen, doch wir wollen das ja from the Scratch bewältigen, um die Welt der Extebase Extensions zu verstehen.

Eigentlich sollten wir erstmal die Model Struktur planen, da es aber um ein Tutorial geht, bauen wir diese mit der Zeit auf. Im ersten Schritt machen wir das Extension Start-Up, d.h. wir kennen es bereits: Ordner Struktur, ext_emconf.php, ext_tables.php und ext_conf.php. Nur dass sich unsere Ordnerstruktur etwas erweitert. Nicht zu vergessen, die Extension bekommt den Namen ‚tut23bandagenda‘.

    • tut23bandagenda
      • Classes
        • Controller
      • Domain
        • Model
        • Repository
      • ViewHelpers
      • Configuration
        • TypoScript
        • FlexForms
        • TCA
      • Resources
        • Private
          • Layouts
          • Partials
          • Templates
        • Public
      • ext_emconf.php
      • ext_localconf.php
      • ext_tables.php
      • ext_icon.gif

 

Wie man schon sieht hat sich hier der Classes Ordner ziemlich erweitert sowie in der Configuration ein TCA Ordner dazu gekommen ist. Diese brauchen wir um unser Modell zu integrieren und die DB Steuerungen zu nutzen. Aber jetzt erstmal die ext_emconf.php

$EM_CONF[$_EXTKEY] = array(
	'title' => 'BandAgenda',
	'description' => '',
	'category' => 'plugin',
	'author' => 'YOUR_NAME',
	'author_email' => 'YOU@YOUR_COMPANY',
	'state' => 'alpha',
	'internal' => '',
	'uploadfolder' => '1',
	'createDirs' => '',
	'clearCacheOnLoad' => 0,
	'version' => '',
	'constraints' => array(
		'depends' => array(
			'typo3' => '6.2',
		),
		'conflicts' => array(
		),
		'suggests' => array(
		),
	),
);

Direkt gefolgt von der ext_tables.php, die wir noch ausgiebig befüllen werden und mit dem bekannten Static File bestückt ist.

if (!defined('TYPO3_MODE')) {
	die('Access denied.');
}

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
	$_EXTKEY,
	'Tut23bandagenda',
	'Band Agenda'
);

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'BandAgenda');

Die TS Configuration Dateien, in denen wir das Template Routing definieren, legen wir im Ordner Configoration/Typoscript/ als constants.txt

plugin.tx_tut23bandagenda {
	view {
		templateRootPath = {$plugin.tx_tut23bandagenda.view.templateRootPath}
		partialRootPath = {$plugin.tx_tut23bandagenda.view.partialRootPath}
		layoutRootPath = {$plugin.tx_tut23bandagenda.view.layoutRootPath}
	}
}

und als setupt.txt an.

plugin.tx_tut23bandagenda {
	view {
		# cat=plugin.tx_tut23bandagenda/file; type=string; label=Path to template root (FE)
		templateRootPath = EXT:tut23bandagenda/Resources/Private/Templates/
		# cat=plugin.tx_tut23bandagenda/file; type=string; label=Path to template partials (FE)
		partialRootPath = EXT:tut23bandagenda/Resources/Private/Partials/
		# cat=plugin.tx_tut23bandagenda/file; type=string; label=Path to template layouts (FE)
		layoutRootPath = EXT:tut23bandagenda/Resources/Private/Layouts/
	}
}

Als letztes die ext_localconfig.php, in der wir nach Vorgabe des Kunden einen Haupt-Controller ‚Tut23Band‘ für die Bands definieren und diesem eine Action für die Auflistung der Bands ‚list‘ und eine Action für die Band-Detailseite ’show‘ zuweisen.

if (!defined('TYPO3_MODE')) {
	die('Access denied.');
}

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Tut23tutorial.' . $_EXTKEY,
	'Tut23bandagenda',
	array(
		'Tut23band' => 'list, show',
	),
	// non-cacheable actions
	array(
		'Tut23band' => 'show',
	)
);

Hier legen wir sicherheitshalber die show Action als nicht im Cache integriert an, damit diese immer wieder neu befüllt werden kann.

 

Aber wenn wir die Actions definieren, müssen wir doch auch den Controller und die Templates definieren, oder?

Das ist genau der nächste Schritt. Also unter Classes/Controller/ die Datei Tut23bandController.php nach dem Prinzipien, die wir bereits kennen anlegen:

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);
	}

Um die Templates kümmern wir uns später, da ab hier wird klar dass es etwas Neues gibt mit dem wir die Extension mit Daten befüllen.

In der ‚listAction‘ werden die Daten aus dem Repository an das Template übertragen, die durch unser protected $tut23bandRepository übertragen werden. Durch die Definition von $tut23bandRepository wird über die ‚inject‘ Methode eine weiter Klasse der Extension hinzugefügt. Eine Besonderheit in der Extbase Programmierung, ist dass man die inject Methode nicht mehr über eine Funktion initialisieren muss: Anhand der Kommentare wird alles initialisiert. Das heißt in unserem Falle: Die Klasse Tut23bandRepository wird in die Extension integriert in dem man mit ‚@var‘ den Namespace und dadurch den Pfad zu Datei definiert und mit ‚@inject‘ das alt bekannte require_once aktiviert. Ist ein wenig wie Magie, doch es funktioniert.

 

Aber wir haben doch keine Datei im Ordner Repository? Und wie funktioniert der Zugriff auf die Daten?

Deswegen neu in unserem Gefüge die Datei Tut23bandRepository.php im Ordner /Classes/Domain/Repository/, die wir erstmal durch den Namespace eindeutig zuordnen und die dann unsere Klasse etablieren und mit den Standard Eigenschaften der Typo3 Repository Klasse beerben.

namespace Tut23tutorial\Tut23bandagenda\Domain\Repository;

class Tut23bandRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
   //
}

Das Repository ist eine wichtige Steuerungsdatei für den Datenbank Transfer. Die Details werden wir in den nächsten Schritten kennen lernen, wenn wir uns Model definiert haben, denn in diesem Abschnitt haben wir ja den kurzen Extension Start-Up vollführt und erstmal nur die Dateien angelegt. Wir sollten auch in diesem Stadium noch nicht versuchen die Extension zu installieren, da noch die wichtigsten Elemente fehlen, um die es im nächsten Abschnitt geht.