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.