rex_view
Backend-UI-Komponenten (Messages, Content-Sections, Titel, Navigation)
Keywords: backend, ui, message, alert, content, title, clang-switch
Methodenübersicht
| Methode | Parameter | Rückgabe | Beschreibung |
|---|---|---|---|
info() |
string $message, string $cssClass = '' |
string |
Info-Meldung (blau) |
success() |
string $message, string $cssClass = '' |
string |
Erfolgs-Meldung (grün) |
warning() |
string $message, string $cssClass = '' |
string |
Warnung (gelb) |
error() |
string $message, string $cssClass = '' |
string |
Fehler (rot) |
content() |
string $content, string $title = '' |
string |
Content-Section mit optionalem Titel |
title() |
string $head, string\|array\|null $subtitle = null |
string |
Seiten-Titel mit Subnavigation |
addCssFile() |
string $file, string $media = 'all' |
void |
CSS-Datei hinzufügen |
addJsFile() |
string $file, array $options = [] |
void |
JS-Datei hinzufügen |
setJsProperty() |
string $key, mixed $value |
void |
JS-Property (global verfügbar) |
setFavicon() |
string $file |
void |
Favicon setzen |
clangSwitch() |
rex_context $context, bool $asDropDown = true |
string |
Sprach-Umschalter |
toolbar() |
string $content, string\|null $brand = null, string\|null $cssClass = null, bool $inverse = false |
string |
Toolbar erstellen |
JS-Options:
rex_view::JS_DEFERED='defer'rex_view::JS_ASYNC='async'rex_view::JS_IMMUTABLE='immutable'
Praxisbeispiele
Messages (Alerts)
// Info-Nachricht
echo rex_view::info('Dies ist eine Info-Nachricht.');
// Erfolg
echo rex_view::success('Erfolgreich gespeichert!');
// Warnung
echo rex_view::warning('Achtung: Diese Aktion kann nicht rückgängig gemacht werden.');
// Fehler
echo rex_view::error('Fehler beim Speichern der Daten.');
// Mit Custom-CSS-Klasse
echo rex_view::success('Gespeichert!', 'my-custom-class');
Messages mit HTML-Content
// Mehrzeilig
$message = '
<strong>Erfolgreich!</strong><br>
Die Daten wurden gespeichert.<br>
<a href="...">Zurück zur Übersicht</a>
';
echo rex_view::success($message);
// Liste von Fehlern
$errors = ['Feld 1 ist erforderlich', 'Feld 2 ist ungültig'];
echo rex_view::error('<ul><li>' . implode('</li><li>', $errors) . '</li></ul>');
Content-Sections
// Einfache Content-Section
$content = '<p>Lorem ipsum dolor sit amet...</p>';
echo rex_view::content($content, 'Überschrift');
// Formular in Section
$form = '<form>...</form>';
echo rex_view::content($form, 'Einstellungen');
// Section ohne Titel
$content = '<div>...</div>';
echo rex_view::content($content);
Seiten-Titel mit Subnavigation
// Einfacher Titel
echo rex_view::title('Mein Addon');
// Titel mit eigener Subnavigation (automatisch aus Backend-Pages)
echo rex_view::title('Mein Addon', null);
// Titel mit Custom-Subtitle (String)
echo rex_view::title('Mein Addon', '<small>Version 1.0.0</small>');
// Mit rex_be_page Array für Subnavigation
$pages = [
rex_be_controller::getPageObject('myaddon/overview'),
rex_be_controller::getPageObject('myaddon/settings')
];
echo rex_view::title('Mein Addon', $pages);
CSS/JS-Files hinzufügen
// CSS hinzufügen
rex_view::addCssFile($this->getAssetsUrl('styles.css'));
rex_view::addCssFile($this->getAssetsUrl('print.css'), 'print');
// JS hinzufügen
rex_view::addJsFile($this->getAssetsUrl('script.js'));
// Mit defer/async
rex_view::addJsFile($this->getAssetsUrl('script.js'), [
rex_view::JS_DEFERED => true
]);
rex_view::addJsFile($this->getAssetsUrl('script.js'), [
rex_view::JS_ASYNC => true,
rex_view::JS_IMMUTABLE => true
]);
JS-Properties (für Frontend-Zugriff)
// JS-Daten verfügbar machen
rex_view::setJsProperty('apiUrl', '/api/endpoint');
rex_view::setJsProperty('userId', rex::getUser()->getId());
rex_view::setJsProperty('config', [
'debug' => rex::isDebugMode(),
'lang' => rex_i18n::getLocale()
]);
// Im JavaScript zugreifen:
// rex.apiUrl
// rex.userId
// rex.config.debug
Clang-Switch (Sprach-Umschalter)
// Als Tabs (Standard)
$context = new rex_context([
'page' => 'content/edit',
'article_id' => $articleId,
'clang' => rex_clang::getCurrentId()
]);
echo rex_view::clangSwitch($context);
// Als Dropdown (bei 4+ Sprachen automatisch)
echo rex_view::clangSwitch($context, true);
// Als Buttons
echo rex_view::clangSwitchAsButtons($context, false);
Komplette Backend-Page
// pages/index.php
$addon = rex_addon::get('myaddon');
// Titel
echo rex_view::title($addon->i18n('title'));
// Erfolgs-Nachricht
if (rex_get('msg', 'string') === 'saved') {
echo rex_view::success($addon->i18n('saved'));
}
// Fehler-Nachricht
if ($error = rex_get('error', 'string')) {
echo rex_view::error($error);
}
// Content
$content = '
<div class="panel panel-default">
<div class="panel-body">
<p>Content hier...</p>
</div>
</div>
';
echo rex_view::content($content, 'Überschrift');
Toolbar
// Toolbar mit Brand
$buttons = '
<a href="..." class="btn btn-primary">Button 1</a>
<a href="..." class="btn btn-default">Button 2</a>
';
echo rex_view::toolbar($buttons, 'Meine Toolbar');
// Inverse Toolbar (dunkler Hintergrund)
echo rex_view::toolbar($buttons, null, 'my-toolbar', true);
Messages nach Form-Submit
$func = rex_request('func', 'string');
if ($func === 'save' && rex_request::isPOSTRequest()) {
// Speichern...
if ($success) {
// Redirect mit Message-Parameter
rex_response::sendRedirect(rex_url::currentBackendPage([
'msg' => 'saved'
]));
} else {
echo rex_view::error('Fehler beim Speichern.');
}
}
// Message aus URL-Parameter anzeigen
if (rex_get('msg', 'string') === 'saved') {
echo rex_view::success('Erfolgreich gespeichert!');
}
Fragment-Integration
// rex_view::content() nutzt intern rex_fragment
// Äquivalent:
$fragment = new rex_fragment();
$fragment->setVar('title', 'Überschrift');
$fragment->setVar('body', '<p>Content</p>', false);
echo $fragment->parse('core/page/section.php');
// Oder einfacher:
echo rex_view::content('<p>Content</p>', 'Überschrift');
Custom-CSS für Messages
// Sticky Message (bleibt oben)
echo rex_view::info('Wichtiger Hinweis', 'sticky-message');
// Custom Alert-Style
echo rex_view::warning('Warnung', 'alert-dismissible');
// CSS in eigenem Addon definieren:
// .sticky-message { position: sticky; top: 0; z-index: 1000; }
Conditional Messages
// Nur für Admins
if (rex::getUser()->isAdmin()) {
echo rex_view::warning('Admin-Modus aktiv!');
}
// Debug-Modus
if (rex::isDebugMode()) {
echo rex_view::info('Debug-Modus ist aktiviert.');
}
// Permission-Check
if (!rex::getUser()->hasPerm('myaddon[]')) {
echo rex_view::error('Keine Berechtigung für diese Aktion.');
}
rex_list/rex_form Integration
// rex_list mit Messages
$list = rex_list::factory('SELECT * FROM rex_user');
// Erfolgs-Nachricht aus rex_list
if ($msg = $list->getMessage()) {
echo rex_view::success($msg);
}
// Warnung aus rex_list
if ($warning = $list->getWarning()) {
echo rex_view::warning($warning);
}
$list->show();
Favicon anpassen
// In boot.php eines Addons
if (rex::isBackend()) {
rex_view::setFavicon($this->getAssetsUrl('favicon.ico'));
}
Mehrsprachige Messages
// Mit i18n
echo rex_view::success(rex_i18n::msg('myaddon_save_success'));
echo rex_view::error(rex_i18n::msg('myaddon_save_error'));
// Mit Platzhaltern
echo rex_view::info(rex_i18n::msg('myaddon_items_found', $count));
Extension Point für Messages
// Message via Extension Point ändern
rex_extension::register('PAGE_TITLE_SHOWN', function($ep) {
if (rex::isDebugMode()) {
return rex_view::warning('Debug-Modus aktiv!');
}
});
Best Practices:
- ✅
rex_view::content()für strukturierte Sections - ✅
rex_view::title()für konsistente Page-Header - ✅ Messages nach Redirects via URL-Parameter (
?msg=saved) - ✅
addCssFile()/addJsFile()inboot.php(Backend-Check!) - ✅
setJsProperty()für Config-Übergabe an Frontend - ⚠️ Messages sind nicht escaped →
rex_escape()bei User-Input! - ⚠️ CSS/JS nur bei
rex::isBackend()hinzufügen - ⚠️ Clang-Switch nur bei
rex_clang::count() > 1anzeigen
HTML-Struktur:
// rex_view::info() generiert:
<div class="alert alert-info">Message</div>
// rex_view::success() generiert:
<div class="alert alert-success">Message</div>
// rex_view::warning() generiert:
<div class="alert alert-warning">Message</div>
// rex_view::error() generiert:
<div class="alert alert-danger">Message</div>