NOCH NICHT FÜR DEN PRODUKTIVEINSATZ GEDACHT!
Projektübergreifende Bootstrap 5 Module und Templates für REDAXO
In diesem Addon befinden sich Vorlagen für Bootstrap 5-Module und Templates in Form von Fragmenten und Hilfsklassen.
Bootstrap 5 selbst wird mitinstalliert, kann jedoch auch von Entwicklern händisch oder über einen eigenen Build-Prozess ersetzt und angepasst werden.
Templates und deren Fragmente können in eigenen Addons überschrieben werden.
Alle Module und Templates erhalten das Namensschema bs5/xxxxx
, z.B. bs5/text
, bs5/image
usw.
Die Ordner-Struktur der Fragmente ist immer /bs5/
+ passende Fragmente, passend zum Namespace der Modul-Keys und Tempalte-Keys.
z.B. /bs5/text
als Modul-Key sucht nach /bs5/text.php
als Ausgabe-Fragment.
Ein Tempalte, das die wichtigsten Elemente einbindet, die für den Betrieb notwendig sind:
template/head.php
, template/header.php
, template/main.php
und template/footer.php
Ein Template, das verwendet wird, wenn der Maintenance-Modus aktiv ist.
Ein Template, das wie Standard [1]
funktioniert, jedoch kein Navigationsmenü ausgibt.
Die Eingabe wird i.d.R. über MForm gebaut. Die Ausgabe findet ausschließlich in Fragmenten statt und enthält grundsätzlich die REX_SLICE_ID und REX_ARTICLE_ID.
Unter https://chatgpt.com/g/g-cYIHRaDWy-steve-redaxo-mform-builder findest du ein angepasstes ChatGPT-Modell für Modul-Eingabe und -Ausgabe.
Bsp.:
<?php
use Alexplusde\BS5\Fragment;
use Alexplusde\BS5\Helper;
/* Benötigte Addons */
$requiredAddons = ['school', 'mform'];
if (!Helper::packageExists($requiredAddons)) {
echo rex_view::error(rex_i18n::rawMsg('bs5_missing_addon', implode(', ', $requiredAddons)));
return;
};
/** Variablen */
$modul = rex_var::toArray("REX_VALUE[1]");
$modul_yform = rex_var::toArray("REX_VALUE[2]");
/* Fragment */
$fragment = new Fragment();
$fragment->setVar('slice_id', "REX_SLICE_ID");
/* Modulspezifische Variablen */
$fragment->setVar('headline' , "REX_VALUE[1]");
$fragment->setVar('headline_level' , "REX_VALUE[2]");
$fragment->setVar('text' , "REX_VALUE[4 output=html]", false);
$fragment->setVar('cta' , "REX_VALUE[8 output=html]", false);
$fragment->setVar('image' , "REX_MEDIA[1]");
/* Ausgabe */
echo $fragment->parse('bs5/text/index.php');
?>
Eigene Labels sollten, wenn möglich, mehrspachig sein, da die Module auch mehrsprachig eingesetzt werden:
$field->setLabel('translate:test');
bei der Eingabe wird zunächst auf verfügbare verwendete Pakete geprüft, um ein Whoops im Backend zu verhindern, sollten diese Pakete nicht mehr installiert sein.
<?php
/**
* Dieses Modul wird über das Addon plus_bs5 verwaltet und geupdatet.
* Um das Modul zu entkoppeln, ändere den Modul-Key in REDAXO. Um die
* Ausgabe zu verändern, genügt es, das passende Fragment zu überschreiben.
*/
use Alexplusde\BS5\Helper;
use Alexplusde\BS5\MForm as BS5MForm;
use FriendsOfRedaxo\MForm;
/* Addon-Prüfung */
$requiredAddons = ['mform', 'redactor'];
if (!Helper::packageExists($requiredAddons)) {
echo rex_view::error(rex_i18n::rawMsg('bs5_missing_addon', implode(', ', $requiredAddons)));
return;
};
/* MForm-Formular */
$mform = BS5MForm::defaultFactory();
echo $mform->show();
Durch die Methode `packageExists() wird eine passende Fehlermeldung ausgegeben.
VALUE | Beschreibung | Ausgabe | Fragment / Ausgabe |
---|---|---|---|
REX_VALUE[1] | Überschriften | Text | $output->setVar("headline", "REX_VALUE[1]", false); |
REX_VALUE[2] | Überschriften-Ebene (h1, h2, h3) | Tag / Attribut | $output->setVar("level", "REX_VALUE[2]", false); |
REX_VALUE[3] | Teaser (Kurztext) | Text | $output->setVar("teaser", "REX_VALUE[3]", false); |
REX_VALUE[4] | Langtext | HTML | $output->setVar("text", "REX_VALUE[4 output="html"]", false); |
REX_VALUE[5] | Langtext 2 (oder Sonstiges) | HTML | $output->setVar("text2", "REX_VALUE[5 output="html"]", false); |
REX_VALUE[6] | Langtext 3 (oder Sonstiges) | HTML | $output->setVar("text3", "REX_VALUE[6 output="html"]", false); |
REX_VALUE[7] | Langtext 4 (oder Sonstiges) | HTML | $output->setVar("text4", "REX_VALUE[7 output="html"]", false); |
REX_VALUE[8] | CTA-Button (oder Sonstiges) | HTML | $output->setVar("cta", "REX_VALUE[8 output="html"]", false); |
REX_VALUE[9] | Ausgabe-Optionen (via Checkbox / Select) | Attribut(e), kommasepariert | $output->setVar("options", "REX_VALUE[9]", false); |
REX_VALUE[10] | Ausgabe-Optionen (Fragmente) | Dateipfad | $output->setVar("fragment", "REX_VALUE[10]", false); |
REX_MEDIA[1] | Bild / Datei | Dateiname | $output->setVar("image", "REX_MEDIA[1]", false); |
REX_MEDIA[2] | Hintergrund | Dateiname | $output->setVar("bg_image", "REX_MEDIA[2]", false); |
REX_MEDIA[3] | Hintergrund (mobil) | Dateiname | $output->setVar("bg_image_mobile", "REX_MEDIA[3]", false); |
REX_MEDIALIST[1] | Bilder / Dateien (z.B. Downloads) | Dateinamen, kommasepariert | $output->setVar("images", "REX_MEDIALIST[1]", false); |
REX_LINK[1] | Kategorie | Dateiname | $output->setVar("category", "REX_LINK[1]", false); |
REX_LINK[2] | Ein Artikel | Dateiname | $output->setVar("article", "REX_LINK[2]", false); |
REX_LINKLIST[1] | Kategorien | Dateiname | `$output->setVar("categories", "REX_LINKLIST[1]", false); |
REX_LINKLIST[2] | Artikel | Dateiname | $output->setVar("articles", "REX_LINKLIST[2]", false); |
Eine Liste von Fragen und Antworten aus dem Addon
qanda
. Benötigtmform
,qanda
.
Die Ordner-Struktur der Fragmente ist immer /bs5/
+ passende Fragmente, passend zum Namespace der Modul-Keys.
z.B. /bs5/text
als Modul-Key sucht nach /bs5/text.php
als Ausgabe-Fragment.
Einige Module und Templates bieten zusätzlich eine Layout-Optionswahl aus, z.B. Kategorien-Übersicht, Artikelübersicht, Bildergalerie, Bilder und Video. dabei werden Unterordner mit den jeweiligen Layouts erstellt und als Subfragment aufgerufen.
Überprüft, ob bestimmte REDAXO-Addons installiert und aktiviert sind, bevor sie aufgerufen werden. Gibt eine Fehlermeldung aus, wenn dies nicht der Fall ist. Hauptsächlich eingsetzt in Modul-Eingabe und Modul-Ausgabe.
Werden beim Installieren und Updaten des Addons aufgerufen, um die neuste Version der Moduleingaben und Ausgaben zu installieren.
Diese Methode kann auch für darauf aufbauende Addons verwendet werden. Beispiele dazu finden sich in der install.php und update.php des Addons stellenangebote
.
Für Addon-Entwickler: Schreibt die neusten Module und Templates ins Dateisystem des Addons. Benötigt aktivierten Debug-Modus und aktivierten Schreib-Modus im Addon.
Diese Methode kann auch für darauf aufbauende Addons verwendet werden. Beispiele dazu finden sich in der install.php und update.php des Addons stellenangebote
.
Für Addon-Entwickler: Schreibt von Modulen und Templates Backups Addons. Benötigt aktivierten Debug-Modus und aktivierten Schreib-Modus im Addon.
Diese Methode kann auch für darauf aufbauende Addons verwendet werden. Beispiele dazu finden sich in der install.php und update.php des Addons stellenangebote
.
Shortcut zum Aufrufen von rex_config::get('plus_bs5', $key)
und rex_config::set('plus_bs5', $key, $value)
Aus Sicherheitsgründen sollte ein CSP-Header gesetzt werden, um XSS-Angriffe zu verhindern. Hier ein Beispiel für einen CSP-Header, der für die gesamte Website (Frontend) gilt. Der Header wird in der .htaccess
-Datei des Servers gesetzt.
<IfModule mod_headers.c>
# Set CSP header for the entire site
Header set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: *.youtube.com *.google.com *.githubusercontent.com; font-src 'self' data:; connect-src 'self'; media-src 'self'; object-src 'none'; child-src 'none'; frame-src 'self' *.youtube-nocookie.com *.youtube.com *.google.com; worker-src 'self'; frame-ancestors 'none'; form-action 'self'; block-all-mixed-content; base-uri 'none'; manifest-src 'self'"
# Unset CSP header for specific files in the subdirectory
<FilesMatch "^/redaxo/.*$">
Header unset Content-Security-Policy
</FilesMatch>
</IfModule>
Youtube und Google (für Maps) sind hier als Beispiel für erlaubte Quellen für Bilder und Videos eingetragen. Die *.google.com
-Quelle ist für Google Fonts. Die *.githubusercontent.com
-Quelle ist für Bilder, die auf GitHub gehostet werden (Addon-Dokus).
unsafe-inline ist für die Verwendung von Inline-Styles und Inline-Scripts notwendig, da Add-ons wie Redactor oder Watson darauf zurückgreifen. Es sollte jedoch vermieden werden, Inline-Styles und Inline-Scripts zu verwenden, da dies die Sicherheit des Systems beeinträchtigen kann.
- Alexander Walther für Fragmente, Module und Templates