rex_be_controller, rex_be_page, rex_be_navigation
Keywords: Backend, Controller, Navigation, Pages, Backend-Struktur, Main-Page, Subpage, Permissions
Übersicht
rex_be_controller: Zentrale Verwaltung für Backend-Pages. Ermittelt aktuelle Page (getCurrentPage()), Page-Objekte (getPageObject()), Page-Teile (getCurrentPagePart()). Erstellt System-Pages (System, Packages, Profile, Credits, Log).
rex_be_page: Repräsentiert eine Backend-Seite mit Title, Href, Path, Subpages, Permissions, Icon, Attributes. Unterstützt Popups, Pjax, Hidden-Pages. Klasse rex_be_page_main für Hauptmenü-Einträge mit Block+Prio.
rex_be_navigation: Factory für Navigation-Rendering. Sammelt Pages nach Blocks (default, system, addons), sortiert nach Prio, generiert verschachtelte Arrays für Fragment-Rendering.
rex_be_controller Methoden
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
setCurrentPage($page) |
string |
void |
Setzt aktuelle Page (z.B. myaddon/main) |
getCurrentPage() |
- | string |
Gibt aktuelle Page zurück |
getCurrentPagePart($part, $default) |
int\|null, string\|null |
string\|array |
Gibt Page-Teil zurück (Teil 1, 2, …) oder alle Teile |
getCurrentPageObject() |
- | rex_be_page\|null |
Gibt Page-Objekt zur aktuellen Page |
requireCurrentPageObject() |
- | rex_be_page |
Wie getCurrentPageObject(), wirft Exception bei null |
getPageObject($page) |
string\|array |
rex_be_page\|null |
Gibt Page-Objekt für Page-Key |
getPages() |
- | array |
Gibt alle registrierten Pages zurück |
setPages($pages) |
array |
void |
Setzt alle Pages (z.B. nach Modifikation) |
getPageTitle() |
- | string |
Gibt Browser-Titel zurück (Page · Server · REDAXO) |
getSetupPage() |
- | rex_be_page |
Gibt Setup-Page zurück |
getLoginPage() |
- | rex_be_page |
Gibt Login-Page zurück |
appendLoggedInPages() |
- | void |
Fügt System-Pages hinzu (System, Packages, Profile, Credits, Log) |
appendPackagePages() |
- | void |
Fügt Addon/Plugin-Pages aus page/pages Property hinzu |
rex_be_page Methoden
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
__construct($key, $title) |
string, string |
- | Erstellt Page (z.B. myaddon/main, Mein Addon) |
getKey() |
- | string |
Gibt Key zurück (z.B. main) |
getFullKey() |
- | string |
Gibt vollen Pfad zurück (z.B. myaddon/main) |
setTitle($title) |
string |
$this |
Setzt Titel |
getTitle() |
- | string |
Gibt Titel zurück |
setHref($href) |
string\|array |
$this |
Setzt Link-URL (String oder Parameter-Array) |
getHref() |
- | string |
Gibt URL zurück |
setPath($path) |
string |
$this |
Setzt Dateipfad (z.B. pages/main.php) |
setSubPath($path) |
string |
$this |
Setzt Dateipfad für Subpage |
setPopup($popup) |
bool\|string |
$this |
Markiert als Popup (optional onclick-Attr) |
isPopup() |
- | bool |
Prüft ob Popup |
setHidden($hidden) |
bool |
$this |
Versteckt Page in Navigation |
isHidden() |
- | bool |
Prüft ob versteckt |
setHasLayout($hasLayout) |
bool |
$this |
Aktiviert/deaktiviert Layout-Rendering |
hasLayout() |
- | bool |
Prüft ob Layout aktiv |
setHasNavigation($nav) |
bool |
$this |
Zeigt/versteckt Backend-Navigation |
hasNavigation() |
- | bool |
Prüft ob Navigation sichtbar |
setPjax($pjax) |
bool |
$this |
Aktiviert Pjax (Ajax-Page-Load) |
hasPjax() |
- | bool |
Prüft ob Pjax aktiv |
setIcon($icon) |
string |
$this |
Setzt Icon-CSS-Klasse |
getIcon() |
- | string |
Gibt Icon zurück |
setRequiredPermissions($perms) |
string\|array |
$this |
Setzt erforderliche Permissions |
checkPermission($user) |
rex_user |
bool |
Prüft User-Permissions |
addSubpage($page) |
rex_be_page |
$this |
Fügt Subpage hinzu |
getSubpage($key) |
string |
rex_be_page\|null |
Gibt Subpage zurück |
getSubpages() |
- | array |
Gibt alle Subpages zurück |
setIsActive($active) |
bool |
$this |
Markiert als aktiv |
isActive() |
- | bool |
Prüft ob aktiv |
addItemClass($class) |
string |
$this |
Fügt CSS-Klasse zu <li> hinzu |
addLinkClass($class) |
string |
$this |
Fügt CSS-Klasse zu <a> hinzu |
setItemAttr($name, $value) |
string, string |
$this |
Setzt <li>-Attribut |
setLinkAttr($name, $value) |
string, string |
$this |
Setzt <a>-Attribut |
rex_be_page_main Methoden (zusätzlich)
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
__construct($block, $key, $title) |
string, string, string |
- | Main-Page mit Block (z.B. system, addons) |
setBlock($block) |
string |
$this |
Setzt Block-Name |
getBlock() |
- | string |
Gibt Block zurück |
setPrio($prio) |
int |
$this |
Setzt Sortier-Priorität |
getPrio() |
- | int |
Gibt Prio zurück |
rex_be_navigation Methoden
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
factory() |
- | rex_be_navigation |
Erstellt Navigation-Instanz |
addPage($page) |
rex_be_page |
void |
Fügt Page zur Navigation hinzu |
getNavigation() |
- | array |
Gibt Navigation-Array zurück (für Fragment) |
setHeadline($block, $headline) |
string, string |
void |
Setzt Block-Überschrift |
getHeadline($block) |
string |
string |
Gibt Block-Überschrift zurück |
setPrio($block, $prio) |
string, int |
void |
Setzt Block-Priorität |
getPrio($block) |
string |
int\|null |
Gibt Block-Prio zurück |
Praxisbeispiele
Aktuelle Page ermitteln
// In Backend-Pages
$currentPage = rex_be_controller::getCurrentPage(); // "myaddon/main"
// Body-ID generieren
$bodyId = rex_string::normalize($currentPage, '-', ' '); // "myaddon-main"
Page-Teile auslesen
// Erste Ebene
$part1 = rex_be_controller::getCurrentPagePart(1); // "myaddon"
// Zweite Ebene
$part2 = rex_be_controller::getCurrentPagePart(2); // "main"
// Mit Default-Wert
$part3 = rex_be_controller::getCurrentPagePart(3, 'default'); // "default" wenn leer
// Alle Teile als Array
$parts = rex_be_controller::getCurrentPagePart(null); // ["myaddon", "main"]
Page-Objekt holen
// Aktuelles Page-Objekt
$pageObj = rex_be_controller::getCurrentPageObject();
if ($pageObj) {
echo $pageObj->getTitle();
}
// Oder mit Exception
$pageObj = rex_be_controller::requireCurrentPageObject();
Spezifisches Page-Objekt
// Page via String
$page = rex_be_controller::getPageObject('yform/yform_field_docs');
// Page via Array
$page = rex_be_controller::getPageObject(['yform', 'yform_field_docs']);
if ($page) {
echo $page->getTitle();
}
Browser-Titel
// Generiert: "Addon Title · example.com · REDAXO CMS"
$title = rex_be_controller::getPageTitle();
echo '<title>' . $title . '</title>';
Backend-Page erstellen (Addon boot.php)
// Basis-Page
$page = new rex_be_page('myaddon/main', rex_i18n::msg('myaddon_title'));
$page->setSubPath(rex_path::addon('myaddon', 'pages/main.php'));
rex_be_controller::getPages()['myaddon'] = $page;
// Oder als Main-Page mit Icon
$page = new rex_be_page_main('addons', 'myaddon', rex_i18n::msg('myaddon_title'));
$page->setPath(rex_path::addon('myaddon', 'pages/index.php'));
$page->setIcon('rex-icon fa-cogs');
$page->setPrio(50);
Subpage hinzufügen
$mainPage = rex_be_controller::getPageObject('myaddon');
// Settings-Subpage
$subpage = new rex_be_page('settings', rex_i18n::msg('myaddon_settings'));
$subpage->setSubPath(rex_path::addon('myaddon', 'pages/settings.php'));
$mainPage->addSubpage($subpage);
// Weitere Subpage
$subpage = new rex_be_page('docs', rex_i18n::msg('myaddon_docs'));
$subpage->setSubPath(rex_path::addon('myaddon', 'pages/docs.php'));
$mainPage->addSubpage($subpage);
Permissions setzen
$page = new rex_be_page('myaddon/admin', 'Administration');
$page->setRequiredPermissions('admin[]'); // Nur Admins
// Mehrere Permissions
$page->setRequiredPermissions(['myaddon[admin]', 'myaddon[edit]']);
// Prüfen
if ($page->checkPermission(rex::requireUser())) {
echo 'User hat Zugriff';
}
Popup-Page
$page = new rex_be_page('myaddon/popup', 'Popup');
$page->setPopup(true); // Öffnet in Popup
$page->setHasNavigation(false); // Keine Navigation
$page->setHasLayout(false); // Minimales Layout
Hidden Page (nicht in Navigation)
$page = new rex_be_page('myaddon/ajax', 'Ajax Endpoint');
$page->setHidden(true);
$page->setHasLayout(false);
$page->setSubPath(rex_path::addon('myaddon', 'pages/ajax.php'));
Pjax aktivieren
// Seite lädt via Ajax (schneller)
$page = new rex_be_page('myaddon/main', 'Main');
$page->setPjax(true);
Custom Href
// Externe URL
$page = new rex_be_page('docs', 'Dokumentation');
$page->setHref('https://example.com/docs');
// Interne URL mit Parametern
$page->setHref(['page' => 'myaddon/main', 'func' => 'edit', 'id' => 1]);
// Oder:
$page->setHref(rex_url::backendPage('myaddon/main', ['func' => 'edit']));
Icon setzen
$page = new rex_be_page_main('addons', 'myaddon', 'My Addon');
$page->setIcon('rex-icon fa-star'); // FontAwesome
$page->setIcon('rex-icon rex-icon-package'); // REDAXO Icon
CSS-Klassen hinzufügen
$page = new rex_be_page('special', 'Special');
$page->addItemClass('my-custom-class'); // <li class="my-custom-class">
$page->addLinkClass('btn btn-primary'); // <a class="btn btn-primary">
Navigation erstellen (Fragment)
$nav = rex_be_navigation::factory();
// Pages hinzufügen
$nav->addPage($page1);
$nav->addPage($page2);
// Navigation rendern
$navigation = $nav->getNavigation();
$fragment = new rex_fragment();
$fragment->setVar('navigation', $navigation, false);
echo $fragment->parse('core/navigations/main.php');
Block-Headline setzen
$nav = rex_be_navigation::factory();
$nav->setHeadline('custom_block', 'Meine Tools');
// Block-Prio setzen
$nav->setPrio('custom_block', 15);
package.yml Pages-Property
# package.yml
page: myaddon
pages:
main: { title: 'translate:myaddon_main' }
settings: { title: 'translate:myaddon_settings', perm: 'admin[]' }
docs: { title: 'translate:myaddon_docs', hidden: true }
Pages-Array im PHP
// In boot.php
rex_addon::get('myaddon')->setProperty('pages', [
'main' => [
'title' => rex_i18n::msg('myaddon_main'),
'icon' => 'rex-icon fa-home',
],
'settings' => [
'title' => rex_i18n::msg('myaddon_settings'),
'perm' => 'admin[]',
'pjax' => true,
],
]);
Dynamische Subpages
$mainPage = rex_be_controller::getPageObject('myaddon');
// Subpages durchlaufen
foreach ($mainPage->getSubpages() as $key => $subpage) {
echo $subpage->getTitle() . '<br>';
}
// Spezifische Subpage
$settingsPage = $mainPage->getSubpage('settings');
Aktive Page markieren
$page = rex_be_controller::getCurrentPageObject();
if ($page && $page->isActive()) {
echo '<li class="active">...</li>';
}
// Manuell setzen
$page->setIsActive(true);
$page->addItemClass('active');
System-Pages-Struktur
// appendLoggedInPages() erstellt:
// - profile (pages/profile.php)
// - credits (pages/credits.php)
// - system
// - settings (pages/system.settings.php)
// - lang (pages/system.clangs.php)
// - log
// - redaxo (pages/system.log.redaxo.php)
// - php (pages/system.log.external.php)
// - slow-queries (pages/system.log.slow-queries.php)
// - report
// - html (pages/system.report.html.php)
// - markdown (pages/system.report.markdown.php)
// - phpinfo (pages/system.phpinfo.php)
// - packages (pages/packages.php)
Page-Prüfung für Addon-Logik
// In boot.php: CSS nur auf eigener Page laden
if (rex::isBackend() && rex_be_controller::getCurrentPage() === 'myaddon/main') {
rex_view::addCssFile(rex_url::addonAssets('myaddon', 'backend.css'));
}
// Oder Teile prüfen
if (rex_be_controller::getCurrentPagePart(1) === 'myaddon') {
// Auf allen Addon-Pages
}
Login/Setup Pages
// Setup-Page (kein Layout)
$setupPage = rex_be_controller::getSetupPage();
// Page: "setup", Path: "pages/setup.php"
// Login-Page
$loginPage = rex_be_controller::getLoginPage();
// Page: "login", Path: "pages/login.php", hasNavigation: false
Packages-Page deaktivieren (Safe Mode)
// appendLoggedInPages() fügt packages nur hinzu wenn !rex::isLiveMode()
if (rex::isLiveMode()) {
// Keine Packages-Page
}
rex_list mit page-Parameter
$list = rex_list::factory('SELECT * FROM table');
// Automatisch aktuelle Page hinzufügen
$list->addParam('page', rex_be_controller::getCurrentPage());
// List-URLs enthalten jetzt ?page=myaddon/main
rex_form mit page-Parameter
$form = rex_form::factory('rex_table', '', 'id=' . $id);
// Automatisch in __construct:
$this->addParam('page', rex_be_controller::getCurrentPage());
Custom Attributes
$page = new rex_be_page('special', 'Special');
// <li>-Attribute
$page->setItemAttr('data-id', '123');
$page->setItemAttr('data-type', 'custom');
// <a>-Attribute
$page->setLinkAttr('target', '_blank');
$page->setLinkAttr('rel', 'noopener');
Conditional Page-Loading
// Nur laden wenn User spezielle Perm hat
if (rex::requireUser()->hasPerm('myaddon[advanced]')) {
$page = new rex_be_page('advanced', 'Advanced');
$mainPage->addSubpage($page);
}
First Subpage Leaf
// Wenn Page keine direkte Path hat, findet getHref() erste verfügbare Subpage
$page = new rex_be_page('myaddon', 'Main');
$page->addSubpage(new rex_be_page('sub1', 'Sub 1'));
$href = $page->getHref();
// Leitet zu erster Subpage: myaddon/sub1
Backend-Kontext-Prüfung
// In Fragmenten/Templates
$isLogin = ('login' === rex_be_controller::getCurrentPage());
$isSetup = ('setup' === rex_be_controller::getCurrentPage());
if ($isLogin || $isSetup) {
// Minimale Navigation
}