Multiuploader für REDAXO basierend auf Uppy 5.0.
- ✅ Moderne UI: Responsive File-Upload-Oberfläche mit Drag & Drop
- ✅ Chunk-Upload: Unterstützung für sehr große Dateien durch Aufteilung in kleine Pakete (umgeht PHP
upload_max_filesize) - ✅ Client-seitige Bildoptimierung: Automatisches Resizing und EXIF-Korrektur vor dem Upload
- ✅ Image Editor: Integrierte Bildbearbeitung (Zuschneiden, Drehen, Spiegeln) mit festen Seitenverhältnissen
- ✅ Webcam-Integration: Direkte Foto-Aufnahme im Browser
- ✅ Metadaten-Verwaltung: Automatische Erkennung und Editor für MetaInfo-Felder (inkl. Mehrsprachigkeit)
- ✅ Dark Theme: Automatische Erkennung und manuelle Umschaltung
- ✅ Lokaler Build: Keine externen CDN-Abhängigkeiten (DSGVO-konform)
- REDAXO >= 5.17.1
- PHP >= 8.1
- AddOn über den REDAXO-Installer herunterladen und installieren.
- AddOn aktivieren.
Die globalen Einstellungen befinden sich unter Uppy → Einstellungen:
- Erlaubte Dateitypen: Definition der zulässigen MIME-Types.
- Der Button "Dateitypen auswählen" ermöglicht die Auswahl aus einer Liste gängiger Formate (Bilder, Dokumente, Video, Audio).
- Maximale Dateigröße: Obergrenze pro Datei in MB.
- Maximale Anzahl Dateien: Limit pro Upload-Vorgang.
- Standard-Kategorie: Zielkategorie im Mediapool (falls keine spezifische gewählt wird).
- Chunk-Upload: Ermöglicht den Upload von Dateien, die größer sind als das PHP-Limit (
upload_max_filesize). - Bildoptimierung: Aktiviert das client-seitige Verkleinern von Bildern (spart Bandbreite und Server-Ressourcen).
- Image Editor: Aktiviert die Bildbearbeitungswerkzeuge.
Uppy kann einfach über data-Attribute in einem hidden Input-Feld aktiviert werden. Das Widget kümmert sich um die Darstellung und das Speichern der Dateinamen.
<input type="hidden"
name="REX_INPUT_VALUE[1]"
value="REX_VALUE[1]"
data-widget="uppy"
data-category-id="1"
data-max-files="10"
data-max-filesize="200"
data-allowed-types="image/*,application/pdf">Verfügbare Attribute:
data-widget="uppy": Aktiviert das Dashboard Widgetdata-category-id="1": Ziel-Kategorie ID im Mediapooldata-max-files="5": Maximale Anzahl Dateiendata-max-filesize="200": Max. Dateigröße in MB (nicht Bytes!)data-allowed-types="image/*": Erlaubte Typen (MIME-Types oder Extensions)data-enable-image-editor="true": Image Editor aktivieren (optional)data-enable-webcam="true": Webcam-Integration aktivieren (optional)data-allow-mediapool="true": Medienpool-Auswahl Button aktivieren (optional)data-lang="de_DE": Sprache erzwingen (optional)
In YForm lässt sich das Uppy-Widget über das Feld "Attribute" konfigurieren. Hierzu wird ein JSON-Objekt verwendet.
Beispiel 1: Standard Dashboard
{
"data-widget": "uppy",
"data-category-id": "1",
"data-max-files": "10"
}Beispiel 2: Custom Widget (Minimal UI)
{
"class": "uppy-upload-widget",
"data-category-id": "1",
"data-max-files": "5",
"data-allowed-types": "image/*",
"data-allow-mediapool": "true"
}Das AddOn stellt einen eigenen YForm-Value-Typ uppy_uploader bereit. Dieser kann in YForm-Tablemanager-Feldern verwendet werden:
Feld-Parameter:
category_id- Ziel-Kategorie im Mediapool (optional, Standard aus Einstellungen)max_files- Maximale Anzahl Dateien (optional, Standard aus Einstellungen)max_filesize- Maximale Dateigröße in MB (optional, Standard aus Einstellungen)allowed_types- Erlaubte Dateitypen als JSON (optional, Standard aus Einstellungen)enable_webcam- Webcam aktivieren:1oder0(optional, Standard aus Einstellungen)enable_image_editor- Image Editor aktivieren:1oder0(optional, Standard aus Einstellungen)allow_mediapool- Medienpool-Auswahl aktivieren:1oder0(optional, Standard: deaktiviert)
Beispiel im Tablemanager:
Field: uppy_uploader
Name: gallery
Label: Bildergalerie
category_id: 5
max_files: 10
enable_image_editor: 1
allow_mediapool: 1
Die hochgeladenen Dateien werden als komma-separierte Liste der Dateinamen gespeichert. In der Listenansicht werden Vorschaubilder (bei Bildern) oder Icons (bei anderen Dateitypen) mit einem kompakten Design angezeigt.
Listenansicht Features:
- Zeigt bei Einzeldateien: Thumbnail/Icon + Medienpool-Titel
- Zeigt bei mehreren Dateien: Icon (Bilder/Dokumente) + Anzahl + Dateiendungen
- Kompaktes Design mit inline-flex Layout für bessere Übersicht in Tabellen
Alternativ kann das Feld auch programmatisch über setValueField() hinzugefügt werden:
$yform->setValueField('uppy_uploader', [
'uppyupload', // Name des Felds
'upload', // Label
'0', // Kategorie-ID (0 = Standard)
'10', // Max. Anzahl Dateien (0 = unbegrenzt)
'200', // Max. Dateigröße in MB
'image/*,application/pdf', // Erlaubte Dateitypen
'1', // Image Editor aktivieren (1/0)
'0', // Webcam aktivieren (1/0)
'1' // Medienpool-Button aktivieren (1/0)
]);Parameter:
- Feldname
- Label
- Kategorie-ID (0 = Standard aus Einstellungen)
- Max. Anzahl Dateien (0 = unbegrenzt)
- Max. Dateigröße in MB
- Erlaubte Dateitypen (kommasepariert)
- Image Editor (1 = aktiviert, 0 = deaktiviert)
- Webcam (1 = aktiviert, 0 = deaktiviert)
- Medienpool-Button (1 = aktiviert, 0 = deaktiviert)
Optional kann das automatische Löschen nicht mehr verwendeter Dateien aktiviert werden (Uppy → Einstellungen → Automatisches Cleanup).
Wichtig: Diese Funktion löscht Dateien automatisch und unwiderruflich aus dem Mediapool, sobald YForm-Einträge gespeichert werden und Dateien aus uppy_uploader-Feldern entfernt wurden.
Sicherheitsmerkmale:
- Prüft vor dem Löschen, ob die Datei noch in anderen YForm-Feldern oder MetaInfo-Feldern verwendet wird
- Ist standardmäßig deaktiviert
- Protokolliert alle Löschvorgänge im REDAXO-Logger
Schutz vor versehentlichem Löschen:
Das AddOn verhindert auch das manuelle Löschen von Dateien im Mediapool, die noch in YForm-Feldern verwendet werden (via MEDIA_IS_IN_USE Extension Point).
Tipp: Mit
data-allow-mediapool="true"(JSON),allow_mediapool: 1(Tablemanager) oder Parameter 9 = '1' (setValueField) erscheint ein zusätzlicher Button, um bestehende Dateien aus dem Mediapool auszuwählen, statt neue hochzuladen.
Für die Verwendung im Frontend (z.B. in eigenen Formularen) steht das Custom Widget zur Verfügung. Es ist leichtgewichtig und initialisiert sich automatisch.
Der Upload-Handler unterstützt drei Authentifizierungsmethoden (in dieser Reihenfolge geprüft):
1. Backend-User (automatisch)
- Wenn ein REDAXO Backend-User eingeloggt ist, funktioniert der Upload automatisch
- Keine zusätzliche Konfiguration nötig
2. API-Token (Session-basiert)
- Für öffentliche Frontend-Formulare ohne User-Login
- Token wird serverseitig in der PHP-Session gespeichert (nie im Browser sichtbar!)
// Im Template oder Modul EINMALIG ausführen
rex_set_session('uppy_token', rex_config::get('uppy', 'api_token'));3. YCom-User (automatisch)
- Wenn YCom installiert ist und ein User eingeloggt ist
- Funktioniert automatisch ohne weitere Konfiguration
Sicherheitshinweis: Der Session-Token wird nie im Browser-DOM oder in Cookies übertragen. Er bleibt serverseitig in der PHP-Session und wird bei jedem Upload validiert.
-
Assets einbinden: Das CSS und JS Bundle muss im Template oder Modul eingebunden werden.
$uppy = rex_addon::get('uppy'); // CSS Bundle (im <head>) echo '<link rel="stylesheet" href="'. $uppy->getAssetsUrl('dist/uppy-frontend-bundle.css') .'">'; // JS Bundle (am Ende des <body>) echo '<script src="'. $uppy->getAssetsUrl('dist/uppy-custom-widget-bundle.js') .'"></script>';
-
HTML Markup: Ein
input type="hidden"mit der Klasseuppy-upload-widgetwird verwendet. Das Skript erkennt diese Klasse automatisch.<input type="hidden" class="uppy-upload-widget" name="my_upload_field" value="" data-category-id="1" data-max-files="5" data-max-filesize="10" data-allowed-types="image/jpeg,image/png" >
-
Verfügbare Attribute (Frontend Widget):
data-category-id="1": Ziel-Kategorie ID im Mediapooldata-max-files="5": Maximale Anzahl Dateiendata-max-filesize="10": Max. Dateigröße in MBdata-allowed-types="image/*": Erlaubte Typen (MIME-Types oder Extensions)data-enable-image-editor="true": Image Editor aktivieren (optional)data-enable-webcam="true": Webcam aktivieren (optional)data-allow-mediapool="true": Medienpool-Auswahl Button aktivieren (optional)
Mit data-allow-mediapool="true" wird ein zusätzlicher Button "Aus Medienpool wählen" angezeigt:
<input
type="hidden"
class="uppy-upload-widget"
name="my_upload_field"
value=""
data-category-id="1"
data-max-files="5"
data-allow-mediapool="true"
>Features:
- Auswahl bestehender Dateien aus dem REDAXO Mediapool
- Unterstützt Einzelauswahl (max_files=1) und Mehrfachauswahl
- Respektiert die
max-filesEinschränkung automatisch - Zeigt eine Anzahl-Anzeige (z.B. "Anzahl: 2/5") neben den Buttons
Standardmäßig werden Einschränkungen wie data-max-filesize oder data-allowed-types nur client-seitig im Browser geprüft. Ein versierter Nutzer könnte diese Werte über die Entwicklertools manipulieren.
Um dies zu verhindern, lassen sich die Parameter serverseitig signieren. Dabei wird ein Hash über die erlaubten Werte generiert. Der Server prüft beim Upload, ob die Signatur zu den gesendeten Parametern passt.
- Die Parameter werden in PHP definiert.
- Die Klasse
FriendsOfRedaxo\Uppy\Signatureerstellt einen Hash (HMAC-SHA256) mit einem geheimen Schlüssel. - Die Signatur wird im Attribut
data-uppy-signatureübergeben. - Das Widget sendet die Signatur und die Parameter beim Upload mit.
- Der Server validiert die Signatur und lehnt den Upload ab, wenn die Regeln verletzt wurden.
<?php
use FriendsOfRedaxo\Uppy\Signature;
// Parameter definieren
$params = [
'category_id' => 1,
'allowed_types' => 'image/jpeg,image/png',
'max_filesize' => 500 // in MB
];
// Signatur erstellen
$signature = Signature::create($params);
?>
<!-- Widget mit Signatur ausgeben -->
<input type="hidden"
name="REX_INPUT_VALUE[1]"
value="REX_VALUE[1]"
data-widget="uppy"
data-category-id="<?= $params['category_id'] ?>"
data-allowed-types="<?= $params['allowed_types'] ?>"
data-max-filesize="<?= $params['max_filesize'] ?>"
data-uppy-signature="<?= $signature ?>">Hinweis: Wenn eine Signatur vorhanden ist, werden die signierten Parameter (
category_id,allowed_types,max_filesize) serverseitig strikt durchgesetzt.
Eine ausführliche Demo mit Live-Beispielen und Quellcode befindet sich im Backend unter Uppy → Demo.
Das AddOn unterstützt automatisch alle im System definierten Metainfo-Felder (med_...).
Mehrsprachige Felder werden erkannt und können direkt im Upload-Dialog für alle Sprachen gepflegt werden. Die Speicherung erfolgt als JSON-String in der Datenbank.
Das Uppy AddOn erkennt automatisch folgende MetaInfo-Feldtypen und rendert diese mit passender UI:
Text-Felder:
text- Einzeiliges Textfeldtextarea- Mehrzeiliges Textfeldselect- Auswahlfeld (Dropdown)
Datums-Felder (NEU):
date- Datumswahl mit HTML5 Date-Picker (nur Datum, ohne Uhrzeit)datetime- Datum + Uhrzeit mit HTML5 DateTime-Pickertime- Nur Uhrzeit mit HTML5 Time-Picker
Mehrsprachige Felder:
lang_text- Mehrsprachiges Textfeld (alle Sprachen)lang_textarea- Mehrsprachiges Textarea (alle Sprachen)
Vorteile der HTML5 Date-Picker:
- ✅ Native Browser-UI (touchscreen-optimiert für mobile Geräte)
- ✅ Automatische Validierung
- ✅ Keine zusätzlichen JavaScript-Abhängigkeiten
- ✅ Bessere UX als Select-Dropdowns
- ✅ Speicherung als Unix-Timestamp (kompatibel mit REDAXO Standard)
Hinweis: Date/DateTime/Time Felder werden als Unix-Timestamp gespeichert, genau wie die Standard REDAXO MetaInfo-Felder. Die Konvertierung erfolgt automatisch.
Der Chunk-Upload teilt große Dateien in kleine Blöcke (Standard: 5MB) und sendet diese sequenziell an den Server. Dies verhindert Timeouts und Memory-Limits bei großen Uploads.
SVG-Dateien werden automatisch vom client-seitigen Resizing ausgeschlossen, um eine Rasterisierung (Umwandlung in PNG) zu verhindern. Sie bleiben als Vektorgrafiken erhalten.
Das AddOn verwendet moderne Frontend-Tools, um JavaScript und CSS zu bündeln. Es werden keine externen CDNs verwendet (DSGVO-konform).
- Node.js (>= 18)
- npm
cd redaxo/src/addons/uppy
npm install# Kompletten Build ausführen (JS & CSS Bundles)
npm run build
# Nur JavaScript bauen
npm run build:js
# Nur CSS-Bundles erstellen
node build.js # erstellt uppy-backend-bundle.css & uppy-frontend-bundle.cssDer Build-Prozess (build.js) erstellt folgende Bundles:
JavaScript:
assets/dist/uppy-backend-bundle.js- Backend Dashboard Widgetassets/dist/uppy-custom-widget-bundle.js- Frontend Custom Widget
CSS:
assets/dist/uppy-backend-bundle.css- Alle Backend Styles (8 Dateien kombiniert)assets/dist/uppy-frontend-bundle.css- Minimales Frontend CSS
assets/
├── src/ # JavaScript Quellcode (ES Modules)
│ ├── uppy-backend.js # Backend Dashboard Widget
│ ├── uppy-custom-widget.js # Custom Widget (Frontend & Backend)
│ ├── chunk-uploader.js # Chunk-Upload Implementierung
│ └── uppy-dashboard-styles.css # Custom Animations
│
├── dist/ # Kompilierte Bundles (generiert via build.js)
│ ├── uppy-backend-bundle.js
│ ├── uppy-backend-bundle.css
│ ├── uppy-custom-widget-bundle.js
│ └── uppy-frontend-bundle.css
│
├── css/ # Uppy Core Styles (kopiert aus node_modules)
│ ├── uppy-core.min.css
│ ├── uppy-dashboard.min.css
│ ├── uppy-custom.css
│ └── ...
│
└── locales/ # Sprachdateien (kopiert aus node_modules)
├── de_DE.min.js
└── en_US.min.js
Friends Of REDAXO
Projektleitung
MIT
