AddOn-Tabs dynamisch ausblenden

Quell-ID: GitHub Discussion #33

Use Case

Tabs (Subpages), die über die package.yml eines AddOns definiert wurden, sollen dynamisch ausgeblendet werden – z.B. wenn ein anderes AddOn installiert ist.

Verwendete AddOns

  • REDAXO Core

Problemstellung

In der package.yml definierte Subpages werden standardmäßig immer angezeigt:

# package.yml
page:
  title: 'Mein AddOn'
  subpages:
    settings:
      title: 'Einstellungen'
    advanced:
      title: 'Erweitert'
    obsolete:
      title: 'Veraltet'  # Soll ausgeblendet werden

Lösung

Über den Extension Point PAGES_PREPARED können Seiten dynamisch manipuliert werden:

<?php
// In boot.php des AddOns

if (rex::isBackend()) {
    rex_extension::register('PAGES_PREPARED', function () {
        // Prüfen ob anderes AddOn aktiv ist
        if (rex_addon::get('other_addon')->isAvailable()) {
            // Seite entfernen
            $page = rex_be_controller::getPageObject('mein_addon/obsolete');
            if ($page) {
                $page->setHidden(true);
            }
        }
    });
}

Weitere Möglichkeiten

Tab nur für bestimmte Benutzer anzeigen

<?php
rex_extension::register('PAGES_PREPARED', function () {
    $user = rex::getUser();
    
    // Nur für Admins anzeigen
    if ($user && !$user->isAdmin()) {
        $page = rex_be_controller::getPageObject('mein_addon/admin_only');
        if ($page) {
            $page->setHidden(true);
        }
    }
});

Tab basierend auf Konfiguration

<?php
rex_extension::register('PAGES_PREPARED', function () {
    // Feature-Flag aus Konfiguration
    if (!rex_config::get('mein_addon', 'show_advanced', false)) {
        $page = rex_be_controller::getPageObject('mein_addon/advanced');
        if ($page) {
            $page->setHidden(true);
        }
    }
});

Mehrere Tabs auf einmal

<?php
rex_extension::register('PAGES_PREPARED', function () {
    $hiddenPages = ['mein_addon/obsolete', 'mein_addon/deprecated'];
    
    foreach ($hiddenPages as $pagePath) {
        $page = rex_be_controller::getPageObject($pagePath);
        if ($page) {
            $page->setHidden(true);
        }
    }
});

Besserer Ansatz: Dynamische package.yml

Für komplexere Szenarien kann die Seitenkonfiguration komplett in PHP erfolgen:

<?php
// In boot.php

if (rex::isBackend()) {
    $addon = rex_addon::get('mein_addon');
    $page = $addon->getProperty('page');
    
    // Subpages dynamisch aufbauen
    $subpages = [
        'settings' => ['title' => 'Einstellungen'],
    ];
    
    // Erweiterte Seite nur wenn konfiguriert
    if (rex_config::get('mein_addon', 'show_advanced', false)) {
        $subpages['advanced'] = ['title' => 'Erweitert'];
    }
    
    // Alte Seite nur wenn anderes AddOn NICHT installiert
    if (!rex_addon::get('new_addon')->isAvailable()) {
        $subpages['legacy'] = ['title' => 'Legacy'];
    }
    
    $page['subpages'] = $subpages;
    $addon->setProperty('page', $page);
}

Page-Objekt Methoden

Methode Beschreibung
setHidden(true) Seite ausblenden
setTitle('Neuer Titel') Titel ändern
setIcon('rex-icon fa-cog') Icon ändern
setPerm('admin[]') Berechtigung ändern
setRequiredPermissions(['admin[]']) Erforderliche Berechtigungen

Hinweis

Der Extension Point PAGES_PREPARED wird nach dem Laden aller AddOn-Seiten ausgeführt. Zu diesem Zeitpunkt sind alle Seiten-Objekte verfügbar und können modifiziert werden.