Migration von tt_news zu news unter Berücksichtigung von selbst erstellten tt_news Feldern

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}

den Button 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!