Wie erweitert man eine Extbase Extension um ein neues Datenbank-Feld? Und zwar ohne die Extension direkt anzufassen, ohne Quick’n'dirty Hacks und ohne Workarounds? Welche Schritte muss man befolgen, um ein neues Datenbankfeld am Datensatz anzuzeigen und es schlußendlich im Fluid Template auch benutzen zu können?
Das nachfolgende Beispiel setzt eine Extension „torr_news_ext“ voraus (ggf leer mit dem Extension Builder angelegt), in die das Resources-Verzeichnis der „news“-Extension kopiert wurde (die Templates) und in der die genannten Dateien aufgebaut werden.
ext_tables.sql
CREATE TABLE tx_news_domain_model_news (
new_field varchar(250) DEFAULT '' NOT NULL
);
ext_tables.php
<?php
$tempColumns = Array (
"new_field" => Array (
"exclude" => 1,
"label" => "LLL:EXT:torr_news_ext/Resources/Private/Language/locallang_db.xml:tx_torrnewsext_domain_model_news.new_field",
"config" => Array (
"type" => "input",
"size" => "30",
"eval" => "trim",
)
),
);
t3lib_div::loadTCA("tx_news_domain_model_news");
t3lib_extMgm::addTCAcolumns("tx_news_domain_model_news",$tempColumns,1);
t3lib_extMgm::addToAllTCAtypes("tx_news_domain_model_news","new_field;;;;1-1-1");
?>
Resources/Private/Language/locallang_db.xml
Hinweis: Liegen parallel xlf-Dateien (neues Format) in dem Verzeichnis werden deren Inhalte bevorzugt. Ggf hat die der Extension Builder angelegt. Damit das Beispiel funktioniert: die xlf-Dateien entfernen.
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<T3locallang>
<data type="array">
<languageKey index="default" type="array">
<label index="tx_torrnewsext_domain_model_news.new_field">The New Field</label>
</languageKey>
</data>
</T3locallang>
Configuration/TypoScript/constants.txt
plugin.tx_news {
view {
templateRootPath = EXT:torr_news_ext/Resources/Private/Templates/
partialRootPath = EXT:torr_news_ext/Resources/Private/Partials/
layoutRootPath = EXT:torr_news_ext/Resources/Private/Layout/
}
}
Configuration/TypoScript/setup.txt
plugin.tx_news {
persistence {
classes {
Tx_News_Domain_Model_News {
subclasses {
# hier wichtig: index 0 überschreiben für die
# normale News-Ansicht
# 0 == Typ-Auswahl an News-Datensatz
0 = Tx_TorrNewsExt_Domain_Model_NewsDefault
}
}
Tx_TorrNewsExt_Domain_Model_NewsDefault {
mapping {
recordType = 0
tableName = tx_news_domain_model_news
}
}
}
}
}
Classes/Domain/Model/NewsDefault.php
<?php
class Tx_TorrNewsExt_Domain_Model_NewsDefault
extends Tx_News_Domain_Model_NewsDefault
{
/**
* the new field
* @var string
*/
protected $newField;
/**
* Returns an array of orderings created from a given demand object.
*
* @param string $newField
* @return void
*/
public function setNewField($newField) {
$this->newField = $newField;
}
/**
* Get new field
*
* @return string
*/
public function getNewField() {
return $this->newField;
}
}
?>
ext_autoload.php
<?php
$extensionPath = t3lib_extMgm::extPath('torr_news_ext');
return array(
'tx_torrnewsext_domain_model_newsdefault' => $extensionPath . 'Classes/Domain/Model/NewsDefault.php',
);
Resources/Private/Templates/News/Detail.html
<f:section name="content">
...
<div class="new-field">
<h3>{newsItem.newField}</h3>
</div>
...
</f:section>
Hallo Rüdiger,
danke für den Code! Hat mir viel gebracht!
Eine Sache; Ich glaube an folgender Stelle fehlt ein Semikolon:
public function setNewField($newField) {
$this->newField = $newField ;;;;
}
Und noch eine Frage: Wie würdest du denn weitere Felder im Backend erstellen? Damit habe ich gerade einige Schwierigkeiten…
Liebe Grüße,
Manuel
Hi Manuel,
vielen Dank, habe ich gleich korrigiert.
So wie das im Beispiel in der ext_tables.php und ext_tables.sql gemacht wurde, geht das grundsätzlich auch bei allen anderen Tabellen.
Hier noch ein paar Links zum Thema eigene Felder an bestehende Datensätze:
http://typo3-blog.net/tutorials/news/addtoalltcatypes.html
http://www.opensource-podcast.de/2010/04/23/typo3-extensions-tca-erweitern-oder-uberschreiben/
Grüße
Rüdiger