CTYPE bei Artikeleinbindung ermitteln
Quell-ID: GitHub Discussion #3
Use Case
Ein Artikel wird per PHP in einen anderen CTYPE eingebunden. Die Module im eingebundenen Artikel sollen wissen, in welchem CTYPE sie dargestellt werden, um gestalterisch darauf reagieren zu können.
Verwendete AddOns
- REDAXO Core
- project-AddOn (empfohlen für Properties)
Zielbeschreibung
Bei der Artikeleinbindung soll der CTYPE des einbindenden Containers an die eingebundenen Module weitergegeben werden.
Lösung
Über eine Property des project-AddOns kann der CTYPE temporär gespeichert und in den Modulen abgefragt werden.
Modul, das den Artikel einbindet
<?php
$project = rex_addon::get('project');
$project->setProperty('inctype', "REX_CTYPE_ID");
// Artikel einbinden
echo $article->getArticle(1);
// Property zurücksetzen
$project->setProperty('inctype', 0);
Module im eingebundenen Artikel
<?php
$inctype = 0;
$project = rex_addon::get('project');
$inctype = $project->getProperty('inctype', "REX_CTYPE_ID");
if ($inctype == 2) {
// Spezielle Darstellung für CTYPE 2
echo '<div class="ctype-2-style">';
}
Besserer Ansatz
Eine robustere Lösung ist die Verwendung einer dedizierten Helper-Klasse:
<?php
// In lib/ArticleContext.php des project-AddOns
class ArticleContext
{
private static array $contextStack = [];
public static function pushCtype(int $ctype): void
{
self::$contextStack[] = $ctype;
}
public static function popCtype(): ?int
{
return array_pop(self::$contextStack);
}
public static function getCurrentCtype(): int
{
return end(self::$contextStack) ?: 0;
}
}
Verwendung im einbindenden Modul
<?php
ArticleContext::pushCtype(REX_CTYPE_ID);
echo $article->getArticle(1);
ArticleContext::popCtype();
Verwendung im eingebundenen Modul
<?php
$parentCtype = ArticleContext::getCurrentCtype();
if ($parentCtype === 2) {
// Spezielle Darstellung
}
Diese Stack-basierte Lösung unterstützt auch verschachtelte Artikeleinbindungen.