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.