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:

  1. 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"
		]
	]]
]
  1. 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;
}