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.