Migration von Version 1.x auf Version 2.x

Der Grund für die neue Major-Version 2 ist ein Refactoring von Links und Teasern. Es hat sich herausgestellt, dass die Kapselung von Links und Teasern in eigene Komponenten nicht flexibel genug ist. In den meisten Fällen werden Links und Teaser innerhalb vom Listen verwendet und dabei ist Schachtelung in Unterkomponenten zum Teil sehr unhandlich.

Ziel des Refactoring ist die Links und Teaser nur noch als Models zu behandeln. Eine Anforderung von Links und Teasern ist das anreichern von Informationen zur Laufzeit, die nicht über einen Aggregator ermittelt werden können/sollen. Hierzu zählt z.B. der Kicker, der sich Aufgrund von Navigations-Verknüpfungen vererben kann. Oder Charakteristiken von Links (enthält die Seite auf der der Link zeigt ein Video) die zur Laufzeit ermittelt werden. Dieses anreichern von Informationen soll über die zentrale ModelFactory erfolgen. Ziel ist, das alle Models über die Factory erzeugt werden und so eine zentrale Stelle existiert, mit der noch Einfluss auf die Erstellung von Models genommen werden kann.

Eine weitere Anforderung ist die Darstellung von Suchergebnissen oder allgemein Artikel-Listen. Hier gibt es die Möglichkeit die Darstellung-Form zu wählen (als Link, als Teaser-Liste, als Teaser-Liste ohne Bild, als Kachel, …). Dieses Konzept ist mit Links und Teasern als Komponenten nicht sauber umgesetzt.

Noch eine Anforderung ist, dass es für Teaser unterschiedliche Darstellungsformen gibt. Z.B. Veranstaltungs-Teaser, News-Teaser, Immobilien-Expose-Teaser, Medien-Teaser, usw. Die Entscheidung, wie der Teaser dargestellt werden soll erfolgt entweder über den Seiten-Type des Artikels (objectType) oder über eine redaktionelle Entscheidung (Alle Teaser dieser Liste sollen als News dargestellt werden).

Durch die Refactoring-Maßnahmen ist das SiteKit 2.x nicht mehr kompatible mit SiteKit 1.x. Die Module, die auf SiteKit basieren müssen angepasst werden.

Nachfolgend werden die Anpassungen beschrieben, die notwendig sind.

Model-Funktionen

SPML-Dateien können mit Hilfe von sp:include und sp:argument wir Funktionen verwendet werden. Einige dieser Funktions-SPML-Dateien erzeugen Model-Daten, die auch so aggregiert werden. Funktionen liegen z.Z. in folgenden Ordnern

/functions
/aggregator/functions
/template/functions

Funktionen die Models erzeugen liegen ab Version 2.x unter

/models
/aggregator/models
/template/models

Diese Änderung hat zur Folgen das in den SiteKit-Abhängigkeiten Modulen die Pfade zu diesen Templates angepasst werden müssen.

Folgende Pfade sind geändert:

Alter Pfad Neuer Pfad
/functions/getAddressData.spml /models/getAddressData.spml
/functions/getColorGradient.spml /models/getColorGradient.spml
/functions/getLink.spml /models/getLink.spml
/functions/getImage.spml /models/getImage.spml
/functions/getPhoneNumber.spml /models/getPhoneNumber.spml
/functions/getPiwikCores.spml /models/getPiwikCores.spml
/functions/getTeaser.spml /models/getTeaser.spml
/aggregator/functions/getAlignDimensions.spml /aggregator/models/getAlignDimensions.spml
/aggregator/functions/getCards.spml /aggregator/models/getCards.spml
/aggregator/functions/getCategorization.spml /aggregator/models/getCategorization.spml
/aggregator/functions/getContactPoint.spml /aggregator/models/getContactPoint.spml
/aggregator/functions/getContact.spml /aggregator/models/getContact.spml
/aggregator/functions/getIllustrationImage.spml /aggregator/models/getIllustrationImage.spml
/aggregator/functions/getImageModel.spml /aggregator/models/getImageModel.spml
/aggregator/functions/getImageSource.spml /aggregator/models/getImageSource.spml
/aggregator/functions/getImageSources.spml /aggregator/models/getImageSources.spml
/aggregator/functions/getImage.spml /aggregator/models/getImage.spml
/aggregator/functions/getIntroImage.spml /aggregator/models/getIntroImage.spml
/aggregator/functions/getLink.spml /aggregator/models/getLink.spml
/aggregator/functions/getPiwikLink.spml /aggregator/models/getPiwikLink.spml
/aggregator/functions/getSchedule.spml /aggregator/models/getSchedule.spml
/aggregator/functions/getTeaserVariant.spml /aggregator/models/getTeaserVariant.spml
/aggregator/functions/getTree.spml /aggregator/models/getTree.spml

Link-Model geändert

Die Klasse

	\SP\Sitekit\Model\Content\Link

wurde verschoben nach

	\SP\Sitekit\Model\Content\Link\Link

Die Methoden

	\SP\Sitekit\Model\Content\Link::setType()
	\SP\Sitekit\Model\Content\Link::getType()

wurden entfernt.

Der Type lieferte internal, external, download oder email. Für download und email gibt es auch schon im SiteKit 1.0 die Klassen

	\SP\Sitekit\Model\Content\Link\Email
	\SP\Sitekit\Model\Content\Link\Download

Die Konstanten im Ling-Model

	const TYPE_INERNAL  = 'internal';
	const TYPE_EXTERNAL = 'external';
	const TYPE_DOWNLOAD = 'download';
	const TYPE_EMAIL    = 'email';

gib es nicht mehr.

Jetzt gibt es eine neue Methode

	\SP\Sitekit\Model\Content\Link::isExternal()

mit der ermittelt werden kann, ob der Link intern oder extern ist.

Immer ModelFactory für die Instanziierung von Models verwenden

Mit dem Refactoring bekommt die ModelFactory (SP\SiteKit\Controller\ModelFactory) eine zentrale Stelle. Der Grund dafür ist, dass es für Links und Teaser keine Komponenten mehr gibt und so die Stelle fehlt, wo erweiternde Logik für Links und Teaser hinterlegt werden kann.

Mit der ModelFactory (gibt es schon im SiteKit 1.x) wurde eine neue Zentrale Stelle geschaffen, über die die Models erzeugt werden. Hier kann die Möglichkeit geschaffen werden erweiterte Logik unterzubringen um Models zu erweitern und zu verarbeiten.

Models sollten immer von der ModelFactory erzeugt werden.

Bisher konnte man die die ModelFactory über die ComponentModel-Instanz kommen. Mit der Methode

\SP\SiteKit\ComponentModel\ComponentModel::getModelFacatory() # ja, hier gab es auch noch einen Tippfehler

Diese Methode ist mit Korrektur des Tippfehlers in die Klasse SP\SiteKit\Context::getModelFactory() verschoben worden.

Für allen Klassen, die von SP\SiteKit\Component\Component, SP\SiteKit\Controller\Controller und SP\SiteKit\Renderer\AbstractRenderer erben stehen die Methoden

$this->createModel($data);
$this->createModelByType($type, $data = null);

zur Verfügung.

Die Methode createModel() erwartet ein array mit einem key modelType über den die Instanz erzeugt wird. Bei der Methode createModelByType() wird der Typ direkt in der Methode übergeben. Der Type sollte immer über die Klassen-Konstante TYPE gesetzt werden.

$linkList = $this->createModelByType(\SP\SiteKit\Model\Content\LinkList::TYPE);

Damit das recursive erstellen vom Models innerhalb eines Models funktioniert muss jedes model die ModelFactory kennen. Dies ist nur der Fall, wenn das Model selber über die ModelFactory erstellt wurde. Im SiteKit 2.0 sind folgende Models verpflichtend über die ModelFactory zu instanziiren damit diese weitere Models über die ModelFactory erzeugen können:

\SP\SiteKit\Model\Content\Teaser
\SP\SiteKit\Model\Content\ScheduledTeaser
\SP\SiteKit\Model\ContactPoint
\SP\SiteKit\Model\Content\Image
\SP\SiteKit\Model\Content\PictureGallery
\SP\SiteKit\Model\Content\WelcomeImage
\SP\SiteKit\Model\Content\NewsItem
\SP\SiteKit\Model\Rss\Item
\SP\SiteKit\Model\Rss\Channel

Models innerhalb von Models erzeugen.

Durch die Aggregatoren werden Model-Daten generiert, die über Komponenten in Models umgewandelt werden. Hierbei werden über die setter-Methoden der Models auch die tiefer verschachtelten Models erzeugt. Ein Model das von SP\SiteKit\Model\Model erbt hat, die Methode createModel(). Über diese Methode sollen Models erzeugt werden.

Beispielsweise wenn ein Modell weitere Models erzeugt

class MyModel extends Model {
	private $link;
	public function setLink($link) {
		$this->link = $this->createModel($link, Link::class);
	}
}

Models innerhalb von Komponenten und Controllern erzeugen.

Weiter können Controller oder Komponenten dynamisch neue Models erzeugen. Diese sollen ebenfalls über die Model erzeugt werden.

class MyComponent extends Component {
	public function initComponent() {

		/* @var $link Link */
		$link = $this->createModelByType(Link::TYPE);
		$link->setUrl($url);
		$link->setLabel($label);
		$link->setTitle($title);
	}
}

Refactoring von SP\SiteKit\Resource

Der Konstruktor wurde angepasst. von

new SP\SiteKit\Resource($config);

zu

new SP\SiteKit\Resource($context, $config);

Die Methode SP\SiteKit\Resource::init($context) wurde auf SP\SiteKit\Resource::init() geändert.

Refactoring des LinkList-Template und -Aggregator

Anpassungen sind notwendig, wenn Aggregator

/aggregator/sectionTypes/linkList.spml

und Template

/templates/sectionTypes/linkList.spml

verwendet werden.

Um Template und Aggregator universeller einsetzten zu können, wurde eine das Feld template.listField eingeführt, mit dem der Iterator-Feldname der Link-Liste bestimmt werden kann. Weiter wurde die Link-Konfiguration in eine eigene Ebene verschoben.

von

{
	"options" : {
		"max" : -1,
		"headline" : {
			"enabled" : true
		},
		"linkTypes" : ["internal", "internalWithParameters", "external", "download"],
		"downloadUpload" : {
			"enabled" : false
		},
		"linkNewWindow" : {
			"enabled":  true
		},
		"linkText" : {}
			"enabled":  true
		}
	}
}

nach

{
	"options" : {
		"max" : -1,
		"headline" : {
			"enabled" : true
		},
		"link" : {
			"linkTypes" : ["internal", "internalWithParameters", "external", "download"],
			"downloadUpload" : {
				"enabled" : false
			},
			"linkNewWindow" : {
				"enabled":  true
			},
			"linkText" : {}
				"enabled":  true
			}
		}
	}
}

Einführung von Flags/Conditions und Umstellung der Editor-Level Auswertung

Ähnlich wie bei Editor-Level können jetzt auch Fags (über Conditions) in der SectionType-Konfiguration ausgewertet werden. Da die Auswerte-Logik von Editor-Leveln und Conditions identisch ist wurde beide zusammengefasst. Daraus ergeben sich folgende Änderungen

Die Template-Funktion

/functions/isSectionTypeAllowed.spml

wurde nach

/functions/isAllowedByConfig.spml

umbenannt.

Die Methode

/functions/hasEditorLevel.spml

wurde durch die Methode

/functions/processCondition.spml

ersetzt.

Der Aufruf muss wie folgt geändert werden: von

<sp:include uri="/functions/hasEditorLEvel.spml" return="_result">
	<sp:argument name="_condition" object="_sectionType.editorLevel"/>
</sp:include>

nach

<sp:include uri="/functions/processCondition.spml" return="_result">
	<sp:argument name="_condition" object="_sectionType.editorLevel"/>
	<sp:argument name="_flags" object="__env.editorLevel"/>
</sp:include>

Im Normalfall sollen nicht nur die Editor-Level, sondern auch die neuen Flags ausgewertet werden, dann sollte es wie folgt geändert werden.

<sp:include module="sitekit-module" uri="/functions/isAllowedByConfig.spml" return="_isAllowed">
	<sp:argument name="config" object="system.arguments.sectionType" />
</sp:include>

LinkButton-Renderer verschoben

Der LinkButton-Renderer ist ein Link-Renderer und wurde desshalb von

SP\\SiteKit\\Renderer\\Html\\Arvedui\\Content\\LinkButton
SP\\SiteKit\\Renderer\\Html\\Arvedui\\Content\\Link\\Button

JSON-Konfiguration für Links im Bild-Abschnitt

Die Konfigurationen des Links innerhalb des Link-Abschnitts sind jetzt in einem eigenen ‘link’-Bereich.

Von

{
	"image" : {
		"options" : {
			"linkTypes" : ["internal", "external", "formsolutions", "download"],
		}
	}
}

nach

{
	"image" : {
		"options" : {
			"link" : {
				"linkTypes" : ["internal", "external", "formsolutions", "download"],
			}
		}
	}
}

Contactable-Helper gelöscht

Funktionen des Helpers wurden nur intern vom Phone-Model verwendet und sind dorthin verschoben worden. Der Helper SP\SiteKit\Renderer\Html\Arvedui\Helper\Contactable wurde gelöscht

Teaser-Komponenten geändert

Im Normalfall werden Teaser in Listen dargestellt. Hierfür ist keine Teaser-Komponente mehr notwendig. Sollten einzel-Teaser verwendet werden (z.B. Top-Teaser). Wird nur noch die Teaser-Komponente

SP\\SiteKit\\Component\\Content\\Teaser

verwendet und über deren Model spezifiziert. Alle anderen Teaser-Komponenten wurden entfernt

SP\\SiteKit\\Component\\Content\\MediaTeaser
SP\\SiteKit\\Component\\Content\\NewsdesTeaser
SP\\SiteKit\\Component\\Content\\ScheduledTeaser
SP\\SiteKit\\Component\\Content\\TopTeaser

Teaser-Model geändert

Folgende Teaser-Models sind umbenannt:

SP\\SiteKit\\Model\\Content\\Teaser
SP\\SiteKit\\Model\\Content\\Teaser\Standard
SP\\SiteKit\\Model\\Content\\TopTeaser
SP\\SiteKit\\Model\\Content\\Teaser\Top
SP\\SiteKit\\Model\\Content\\MediaTeaser
SP\\SiteKit\\Model\\Content\\Teaser\Media
SP\\SiteKit\\Model\\Content\\NewsdeskTeaser
SP\\SiteKit\\Model\\Content\\Teaser\Newsdesk
SP\\SiteKit\\Model\\Content\\ScheduledTeaser
SP\\SiteKit\\Model\\Content\\Teaser\Scheduled

Teaser-Renderer geändert

Folgende Teaser-Models sind umbenannt:

SP\\SiteKit\\Renderer\\Html\Arvedui\\Content\\Teaser
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\Teaser\Standard
SP\\SiteKit\\Renderer\\Html\Arvedui\\Content\\TopTeaser
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\Teaser\Top
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\MediaTeaser
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\Teaser\Media
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\NewsdeskTeaser
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\Teaser\Newsdesk
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\ScheduledTeaser
SP\\SiteKit\\Model\\Html\Arvedui\\Content\\Teaser\Scheduled

Damit sind auch die Renderer-Typen geändert

content.teaser
content.teaser.standard
content.topTeaser
content.teaser.top
content.mediaTeaser
content.teaser.media
content.newsdeskTeaser
content.teaser.newsdesk
content.scheduledTeaser
content.teaser.scheduled

Hier sind ggf. Kundenspezifische Renderer-Mappings anzupassen

Teaser-Listen sind keine Container mehr

Dadurch ändert sich die Konfiguration in den Renderer. Die Teaser werden jetzt über einen partial-Renderer gerendert und die Konfiguration muss ggf. angepasst werden. alte Konfiguration

	'itemConfig' => [
		'*' => [
			'classes' => [
				'fileinfo' => '',
				'filetype' => 'SP-Link--download__fileType',
				'filesize' => 'SP-Link--download__fileSize'
			]
		]
	]

neue Konfiguration

	'teaser' => [
		'classes' => [
			'fileinfo' => '',
			'filetype' => 'SP-Link--download__fileType',
			'filesize' => 'SP-Link--download__fileSize'
		]
	]

oder da hier nur Werte für den Medien-Teaser konfiguriert werden geht auch

	'media' => [
		'classes' => [
			'fileinfo' => '',
			'filetype' => 'SP-Link--download__fileType',
			'filesize' => 'SP-Link--download__fileSize'
		]
	]

TeaserBuilder wurde durch Reference-Resolver ersetzt

Der Teaser-Builder war nicht flexibel genug, um Anforderungen zur Darstellung von Suchergebnissen zu erfüllen. Hierbei müssen Suchergebnisse nicht nur durch Teaser-Listen sondern auch durch Link-Listen und Kachel-Felder dargestellt werden.

Daher ist der TeaserBuilder durch einen Reference-Builder ersetzt worden.

Dadurch sind noch folgende Methoden in entfernt worden

	\SP\SiteKit\ComponentModel::createComponentByModel()
	\SP\SiteKit\ComponentModel::getTeaserBuilderManager()
	\SP\SiteKit\ComponentModel::createResultTeaserComponent()
	\SP\SiteKit\ComponentModel::getTeaserBuilder()

Weitergehende Beschreibung zum Reference-Resolver ist hier zu finden.

RSS-Konfiguration geändert

Über allowedTypes konnte bisher bestimmt werden welche Komponenten RSS-Einträge erzeugen sollen. Durch die Umstellung der Link- und Teaser-Listen musst dies noch umgestellt werden. Jetzt kann die Konfiguration nur noch an der Komponente über die Option ‘rss.allowed’ vorgenommen werden.

Step ‘Verknüpfung’ (assignment) durch Step ‘Einstellungen’ (settings) ersetzt

Der Step Name und dessen ID wurden umbenannt.

	Name: Verknüpfung -> Einstellungen
	ID: assignment -> settings

Text-Aggregator geändert

Der Text Aggregator musste bisher für interne Links eine PHP-lamda-Funktion aggregieren um das URL-Rewriting auch für Links die über den TinyMCE definiert wurden sicher zu stellen. Dies wird jetzt anders gelöst, in dem die entsprechenden Text-Stellen markiert und über PHP nachprozesiert werden. Hier werden jetzt auch für die Email- und Link-Ausgaben die PHP-Renderer verwendet. Daher müssen diese Renderer ggf. in den Kunden-Modulen nachkonfiguriert werden.

Die Konfiguration erfolgt in der Datei src/publish/php/config/renderer/html/arvedui/content/text.php Z.B.

return [
	'classes' => [
		'base' => 'SP-Text',
		'email' => 'SP-encrypted-email'
	],
	'attributes' => [
		'content' => [
			'data-sp-table' => true
		]
	],
	'link' => [
		'renderIcon' => false
	]
];

Container-Model nach ModelList umbenannt

SP\\SiteKit\\Model\\Container
nach
```php
SP\\SiteKit\\Model\\ModelList

umgenannt.

/aggregator/functions/putText.spml enfernt

Die Aggregator-Technik für den Text-Abschnitt wurde refactored. In diesem Zuge wurde die putText.spml-Funktion entfernt. Ab jetzt muss die Aggregator-Funktion

aggregator/models/getText.spml

verwendet werden.