Küken und Osterhase im Gras

Extbase Objekte überschreiben und erweitern

Als TYPO3-Entwickler bzw. Integrator steht man oftmals vor der Herausforderung, bestehende bzw. externe Extbase-Erweiterungen dem aktuellen Projekt anzupassen. Dabei ist es hin und wieder notwendig eigene Felder zu definieren, welche der Redakteur befüllen kann und die entsprechend verarbeitet werden müssen.

Wenn man weiß wo man hier ansetzen muss, ist das nicht weiter schwierig. Als kleines Ostergimmick zeigen wir euch was es zu beachten gilt. Dabei nehmen wir die news Extension von Georg Ringer als Vorlage, da diese sehr weit verbreitet ist.

Erweitern von Extbase-Datensätzen

Als erstes Beispiel soll der Redakteur die Möglichkeit erhalten, einem News-Tag eine Farbe zuzuweisen. Konkret bedeutet das für den TYPO3-Entwickler, dass der News-Tag-Datensatz um ein Inputfeld zu erweitern ist.

1. Erstellen einer Erweiterung

Um ein neues Feld hinzuzufügen, benötigen wir eine separate TYPO3-Erweiterung. In unserem Besipiel heißt diese cs_news_extend. Es reicht einen eigenen Ordner mit dem Extension-Key, sowie eine ext_emconf.php und eine composer.json anzulegen. Ansonsten kann die Extension auch mit den Extension-Builder kreiert werden.

Vergesst nicht die Extension im Extension-Manager zu installieren!

2. Das Feld zur Datenbank hinzufügen

Ist das Grundgerüst für die Erweiterung fertig, legen wir zunächst eine ext_tables.sql-Datei an.

# Extend table structure for table 'tx_news_domain_model_tag'
CREATE TABLE tx_news_domain_model_tag (
 tx_csnewsextend_color varchar(255) DEFAULT '' NOT NULL
);

Im Anschluss gilt es, einmal den Database-Analyzer im Install-Tool durchzuführen, damit das neue Feld auch in der Datenbank angelegt wird.

3. Die Anzeige im Backend festlegen

Wie es bei TYPO3 üblich ist, bedienen wir uns zur Definition von Feldern im Backend, dem Table Configuration Array (kurz TCA). Wir legen in unserer Erweiterung die Datei tx_news_domain_model_tag.php an, welche im Ordner typo3conf/ext/cs_news_extend/Configuration/TCA/Overrides/ liegt. Der folgende PHP-Code sorgt nun dafür, dass unser Feld entsprechend gerendert wird.

<?php
defined('TYPO3_MODE') or die();

// Feld definieren
$tempColumns = [
 'tx_csnewsextend_color' => [
 'label' => 'LLL:EXT:cs_news_extend/Resources/Private/Language/locallang_db.xlf:tx_news_domain_model_tag.tx_csnewsextend_color',
 'exclude' => 1,
 'config' => [
 'type' => 'input',
 'eval' => 'trim',
 ]
 ]
];

// Feld der allgemeinen Datensatzbeschreibung hinzufügen - noch keine Ausgabe im Backend!
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tx_news_domain_model_tag', $tempColumns);

// Feld einer neuen Palette hinzufügen
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
 'tx_news_domain_model_tag',
 'tx_csnewsextend_fields',
 'tx_csnewsextend_color'
);

// Neue Palette dem Tag hinzufügen, nach dem Titel - Dadurch Anzeige im Backend
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
 'tx_news_domain_model_tag',
 '--palette--;LLL:EXT:cs_news_extend/Resources/Private/Language/locallang_db.xlf:tx_news_domain_model_tag.palette.tx_csnewsextend_fields;tx_csnewsextend_fields',
 '',
 'after:title'
);

Für die Labels des Feldes und der Palette ist eine Sprachdatei locallang_db.xlf anzulegen und ensprechend zu befüllen. Dazu eignet sich der LFE-Editor.

Ist die Datei angelegt muss noch der System-Cache geleert werden, damit das TCA neu gerendert wird. Anschließend sehen wir das neue Feld im Backend.

Neues Feld im Backend

Somit sind die Vorbereitungen für den Redakteur getroffen. Nun muss das Feld verarbeitet und im Frontend ausgegeben werden können.

4. Ein eigenes Model definieren

Um die neue Eigenschaft in Extbase nutzen zu können, legen wir ein eigenes Model an, welches von der existierenden Klasse die Eigenschaften erbt. Wir fügen lediglich das neue Feld hinzu.

Wir legen eine PHP-Datei namens Tag.php in cs_news_extend/Classes/Domain/Model/ an. Der Inhalt sieht wie folgt aus.

<?php

namespace Clickstorm\CsNewsExtend\Domain\Model;


class Tag extends \GeorgRinger\News\Domain\Model\Tag
{
 /**
 * @var string
 */
 protected $txCsnewsextendColor;

 /**
 * @return string
 */
 public function getTxCsnewsextendColor()
 {
 return $this->txCsnewsextendColor;
 }

 /**
 * @param string $txCsnewsextendColor
 */
 public function setTxCsnewsextendColor($txCsnewsextendColor)
 {
 $this->txCsnewsextendColor = $txCsnewsextendColor;
 }
}

 

5. Das Model via TypoScript registrieren

Jetzt muss nur noch TYPO3 beigebracht werden, dass unser Tag-Model anstelle des News-Tag-Models genommen werden soll. Das registrieren wir im TypoScript.

config.tx_extbase {
 objects {
 GeorgRinger\News\Domain\Model\Tag {
 className = Clickstorm\CsNewsExtend\Domain\Model\Tag
 }
 }
 persistence {
 classes {
 Clickstorm\CsNewsExtend\Domain\Model\Tag {
 mapping {
 tableName = tx_news_domain_model_tag
 }
 }
 }
 }
}

Fertig! Nun können wir die neue Eigenschaft nutzen, beispielsweise im FLUID-Template mit {tag.tsCsnewsextendColor}.  Mit <f:debug>{tag}</f:debug> erhalten wir die folgende Ausgabe.

Debug-Ausgabe des Extbase-Objekts im TYPO3

Anhand der Objektangabe ist gut zu erkennen, dass nun unser Model samt Eigenschaften genutzt wird und demnach auch eingesetzt werden kann.

Erweitern von Subklassen je nach Typ

Ein Sonderfall ist, wenn wir ein Model erweitern möchten, dass selbst unterschiedliche Typen umfasst. Bei den News beispielsweise, gibt es neben den normalen News mit einer Detailansicht auch die Typen interne und externe Verlinkung. Je nachdem welcher Typ ausgewählt ist, können unterschiedliche Felder angezeigt werden.

Auswahl der News-Typen im TYPO3 Backend

Um zu erkennen, ob ein Datensatz so eine Unterscheidung vornimmt, schauen wir im TCA, ob bei der jeweilige Tabelle $GLOBALS['TCA']['tx_news_domain_model_news']['ctrl']['type'] gesetzt ist. Ist das der Fall, dann kann zu jedem Typ ein eigenes Extbase-Model bestimmt werden. Das geschieht wieder über TypoScript. Möchten wir nun, dass unser Extbase-Model genutzt wird, legen wir auch für jeden Typ ein Model an, was wiederum vom jeweiligen Typ erbt. Wem das jetzt zu schnell ging, der schaut sich am besten hierfür den Code bei GitHub an. Den Link findet ihr weiter unten in diesem Beitrag.

Sind die Models angelegt, müssen wir wieder die Registrierung im TypoScript angehen. Die Notation weicht hier von der obigen ab. Wir überschreiben nicht mehr das Objekt an sich, sondern die Subklassen.

config.tx_extbase {
 persistence {
 classes {
 
 // Überschreiben der Klassen
 GeorgRinger\News\Domain\Model\News {
 subclasses {
 0 = Clickstorm\CsNewsExtend\Domain\Model\NewsDefault
 1 = Clickstorm\CsNewsExtend\Domain\Model\NewsInternal
 2 = Clickstorm\CsNewsExtend\Domain\Model\NewsExternal
 }
 }

 // Mapping
 Clickstorm\CsNewsExtend\Domain\Model\NewsDefault {
 mapping {
 recordType = 0
 tableName = tx_news_domain_model_news
 }
 }

 Clickstorm\CsNewsExtend\Domain\Model\NewsInternal {
 mapping {
 recordType = 1
 tableName = tx_news_domain_model_news
 }
 }

 Clickstorm\CsNewsExtend\Domain\Model\NewsExternal {
 mapping {
 recordType = 2
 tableName = tx_news_domain_model_news
 }
 }
 }
 }
}

 

Wichtig ist, dass dieses TypoScript nach dem TypoScript der News-Extension geladen wird. Abschließend kann der Inhalt der neuen Felder wieder im Fluid ausgegeben werden.

Ausblick

Die Beispielextension cs_news_extend haben wir auf GitHub veröffentlicht. Dadurch lassen sich die Code-Beispiele sicherlich noch besser nachvollziehen.

Wir hoffen, dass wir euch mit diesem Tutorial einfach verdeutlichen konnten, wie Extbase-Objekte überschrieben werden. Falls Ihr Fragen oder Anmerkungen zum Artikel habt, dann hinterlasst gerne einen Kommentar. Wir freuen uns stets über Feedback.

Ansonsten wünschen wir allen Lesern ein schönes Osterfest und ein paar erholsame Feiertage.

TYPO3 Verstärkung gesucht! Bewirb dich jetzt.

Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.