Kacheln über ReferenceResolver auflösen
Die Daten für die Models der einzelnen Kacheln eines Kachelfeldes (o.ä.) müssen nicht zwingend aggregiert werden, sie können auch durch ReferenceResolver aus einer Referenz erstellt werden.
Das Aggregat
Zunächst muss aus dem Aggregat hervorgehen, was aufgelöst werden soll. Dazu gibt es für Kacheln zwei Möglichkeiten:
- Ganze Kacheln
Wenn die Kacheln selber keine zusätzlichen Parameter brauchen ist dies die einfachere variante.
"model" => [
/* ... */
"items" => [[
"modelType" => "reference.resource",
"objectType" => "content",
"url" => "/musterseiten/abschnitte/bild.php",
"ies" => [
"id" => "100060100000001217-1015"
]
]]
]
- Die Teaser der Kacheln
Wenn die Kacheln noch Parameter bekommen sollen oder wenn der Teaser einen ReferenceResolver-Handler bekommt, der Parameter, die durch die Konfiguration festlegbar sein sollen, bekommt, muss diese Variante verwendet werden.
Es ist aktuell nicht möglich, Daten per Konfiguration an einen Handler des InternalTeaser-ReferenceResolvers zu geben, wenn dieser durch den InternalTeaserCard-ReferenceResolver aufgerufen wird!
"model" => [
/* ... */
"items" => [[
"modelType" => "content.card.teaser",
/* ... */
"teaser" => [
"modelType" => "reference.resource",
"objectType" => "content",
"url" => "/musterseiten/abschnitte/bild.php",
"ies" => [
"id" => "100060100000001217-1015"
]
]
]]
]
Component
In der Komponente, die \SP\SiteKit\Component\Content\Cards
erweitert, muss die parent
-Methode von processComponent
aufgerufen werden, um die ReferenceResolver aufzurufen.
Nachträglich Attribute ändern
Müssen nach dem Auflösen der Referenz noch Attribute des Resultats geändert werden, ist dies entweder in der processComponent
-Methode der Komponente nach dem aufruf der parent
-Methode möglich oder durch einen ReferenceResolver-Handler, der ein im Aggregat aufgeführtes Attribut ausliest.
Letzteres muss dann verwendet werden, wenn der zusetzende Wert aus dem Template stammt.
In der Implementation sieht das Aggregat dann so aus:
"model" => [
/* ... */
"items" => [[
"modelType" => "content.card.teaser",
/* ... */
"teaser" => [
"modelType" => "reference.resource",
"objectType" => "content",
"url" => "/musterseiten/abschnitte/bild.php",
"ies" => [
"id" => "100060100000001217-1015"
],
"attributes" => [
"imageLegend" => "Die neue Bild-Legende!"
]
]
]]
]
Und die relevante Methode des Handlers für den (in diesem Fall InternalTeaser-) ReferenceResolver so:
public function handleResolvedInternal($reference, $resource, $model) {
$legend = $reference->getAttribute('imageLegend');
if ($legend !== null) {
$image = $model->getImage();
if ($image !== null) {
$image->setLegend($legend);
}
}
return $model;
}