Die Migration von tt_news
zu news
ist mit der Extension tt_news importer (news_ttnewsimport)
eigentlich sehr einfach umzusetzen. Wie aber migriert man die Felder, die man zuvor bei tt_news
mit Hilfe einer eigenen Extension hinzugefügt hat?
Zunächst benötigt man wiederum eine eigene Extension, die news
um die gewünschten Felder erweitert. Eine gute Anleitung dazu findet man in der news-Dokumentation https://docs.typo3.org/typo3cms/extensions/news/DeveloperManual/ExtendNews/ProxyClassGenerator/Index.html.
In unserem Beispiel soll es um zwei Felder gehen, ein input Feld (tx_ttnewsfield_place
) und eine Checkbox (tx_ttnewsfield_button
).
news um zwei Felder erweitern
Nennen wir die Extension addnewsfields
und schauen uns analog zur News Doku die benötigten Dateien an. Den Extension Builder verwenden wir nicht sondern erstellen die Dateien in einem Verzeichnis namens addnewsfields
, das wir dann per FTP ins Verzeichnis typo3conf/ext
hochladen und über den Extensionmanager installieren.
ext_emconf.php
<?php $EM_CONF[$_EXTKEY] = array( 'title' => 'Unsre News Erweiterung', 'description' => 'fügt news zwei Felder hinzu', 'category' => 'plugin', 'author' => 'Matthias Haack', 'author_email' => '', 'state' => 'alpha', 'uploadfolder' => FALSE, 'createDirs' => '', 'clearCacheOnLoad' => TRUE, 'version' => '1.0.0', 'constraints' => array( 'depends' => array( 'typo3' => '7.6.13-8.7.99', 'news' => '6.2.0-6.9.99', ), 'conflicts' => array(), 'suggests' => array(), ), ); |
ext_tables.sql
# TABLE STRUCTURE FOR TABLE 'tx_news_domain_model_news ' # CREATE TABLE tx_news_domain_model_news ( tx_ttnewsfield_place VARCHAR(64) DEFAULT '' NOT NULL, tx_ttnewsfield_button tinyint(3) DEFAULT '0' NOT NULL ); |
ext_localconf.php
<?php defined('TYPO3_MODE') or die(); $GLOBALS['TYPO3_CONF_VARS']['EXT']['news']['classes']['Domain/Model/News'][] = 'addnewsfields'; |
addnewsfields
ist der Extensionkey, also der Name des Verzeichnisses.
Für die folgenden beiden Dateien müssen wir in unserer Extension auch die entsprechenden Verzeichnisse erstellen:
Configuration/TCA/Overrides/tx_news_domain_model_news.php
<?php defined('TYPO3_MODE') or die(); $fields = Array ( "tx_ttnewsfield_place" => Array ( "exclude" => 0, "label" => "Ort:", "config" => Array ( "type" => "input", "size" => "15", "max" => "64", "eval" => "trim", ) ), "tx_ttnewsfield_button" => Array ( "exclude" => 0, "label" => "Button:", "config" => Array ( "type" => "check", ) ), ); \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tx_news_domain_model_news', $fields); // Feld einer neuen Palette hinzufügen \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette( 'tx_news_domain_model_news', 'tx_ttnewsfield_addfields', 'tx_ttnewsfield_place, tx_ttnewsfield_button' ); // Neue Palette dem Tag hinzufügen, nach dem Titel - Dadurch Anzeige im Backend \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes( 'tx_news_domain_model_news', '--palette--;Weitere Felder;tx_ttnewsfield_addfields', '', 'after:bodytext' ); |
Classes/Domain/Model/News.php
<?php namespace Mhaack\addnewsfields\Domain\Model; /** * News */ class News extends \GeorgRinger\News\Domain\Model\News { /** * @var string */ protected $txTtnewsfieldPlace; /** * @return string */ public function getTxTtnewsfieldPlace() { return $this->txTtnewsfieldPlace; } /** * @param string $txTtnewsfieldPlace */ public function setTxTtnewsfieldPlace($txTtnewsfieldPlace) { $this->txTtnewsfieldPlace = $txTtnewsfieldPlace; } /** * @var string */ protected $txTtnewsfieldButton; /** * @return string */ public function getTxTtnewsfieldButton() { return $this->txTtnewsfieldButton; } /** * @param string $txTtnewsfieldButton */ public function setTxTtnewsfieldButton($txTtnewsfieldButton) { $this->txTtnewsfieldButton = $txTtnewsfieldButton; } } |
Mhaack
in namespace Mhaack\addnewsfields\Domain\Model
ist ein beliebiger String.
addnewsfields
in namespace Mhaack\addnewsfields\Domain\Model
ist wiederum der Extensionkey.
Fertig!
Nach der Installation der Extension sollten in jedem Newsdatensatz die beiden Felder vorhanden sein und zwar unter dem Reiter Allgemein
nach dem RTE (wie in Configuration/TCA/Overwrites/tx_news_domain_model_news.php
definiert).
Ob alles funktioniert hat, kann man am einfachsten ermitteln, indem man in der Datei /typo3conf/ext/news/Resources/Private/Partials/List/Item.html
ein
<f:debug>{_all}</f:debug> |
schreibt, ein Plugin im Modus LIST VIEW
anlegt und dann das array newsItem
aufklappt – dort sollten die beiden Felder vorhanden sein. Damit ist auch klar, wie man die Felder im Template ausgibt:
{newsItem.txTtnewsfieldPlace} |
die Checkbox kann man für eine condition verwenden:
<f:if condition="{newsItem.txTtnewsfieldButton} == 1">Button angehakt</f:if> |
Migration von tt_news zu news
In beiden Extensions, news
und news_ttnewsimport
müssen vor der Migration Änderungen gemacht werden.
Folgende Ergänzung muss in news
gemacht werden:
in Classes/Domain/Service/NewsImportService.php
muss folgendes hinzugefügt werden (etwa in Zeile 150):
... $news->setTxTtnewsfieldPlace($importItem['tx_ttnewsfield_place']); $news->setTxTtnewsfieldButton($importItem['tx_ttnewsfield_button']); ... |
In news_ttnewsimport
muss diese Ergänzung gemacht werden:
in Classes/Service/Import/TTNewsNewsDataProviderService.php
muss in der Funktion getImportData
hinzugefügt werden (etwa in Zeile 90):
... 'tx_ttnewsfield_place' => $row['tx_ttnewsfield_place'], 'tx_ttnewsfield_button' => $row['tx_ttnewsfield_button'], ... |
Sind alle Extensions vorhanden und vorbereitet, kann die Migration angestoßen werden. Einfach bei den Konfigurationsoptionen von news
im Extensionmanager unter dem Reiter Import Module
ein Häkchen bei Show importer
setzen, speichern, eventuell das Backend neu laden und dann über das Modul News Import
den Import der Datensätze anstoßen.
Damit sollte alles erledigt sein. Hier eine Kurzfassung des Ganzen in Form einer Frage: https://stackoverflow.com/questions/51537675/import-from-tt-news-with-additional-fields-in-tt-news-and-news-typo3-8-lts
Die Tatsache, dass man news
sozusagen gepatched hat, stellt eigentlich kein Problem dar – nach erfolgreichem Import benötigt man die dort gemachten Änderungen nicht mehr und kann die Extension getrost updaten.
Wer dennoch news
nicht patchen möchte, kann Slots verwenden.
Noch ein Hinweis: Man kann über den Planer auch die Plugin Datensätze migrieren!