DataGrid: Data Editing (Massenaktionen)
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: Massenaktionen [Live]. Editierbare Einzelzellen sind [Live] (Abschnitt 8, kein Code) — die DevExpress-Demo-Kategorie „Data Editing„ deckt beide Fälle ab, hier bewusst auf einer Seite gehalten statt zwei nahezu leeren Vertragsseiten.
Vertieft $opts['bulkActions'] des
dataGrid()-Basiskontrakts:
eine Auswahl-Toolbar für Bulk-Operationen auf mehreren markierten Zeilen.
2. Voraussetzungen
- Ein Server-Endpunkt, der
selection[]-POSTs mitsectok-Prüfung und erneuter ACL-Validierung je Schlüssel entgegennimmt.
3. Konzepte
Client-Auswahl ist nie autoritativ: die Auswahl-Toolbar ist reine Anzeige/Bequemlichkeit — jede Aktion muss serverseitig erneut gegen ACL/Existenz jedes einzelnen Schlüssels geprüft werden (Abschnitt 7, Sicherheit).
Grid-lokal, nicht modulweit: die Auswahl-Toolbar erscheint direkt am Grid, mit der Auswahl; modulweite Aktionen gehören in die Command-Bar-Region der Shell (admin-layout → „Command-Bar als Shell-Region") — beide sind bewusst getrennt.
4. Erste Schritte
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'Gruppe zuweisen', 'element' => '<button type="submit" name="do" value="assign-group" class="wk-btn">Gruppe zuweisen</button>'], ], ]);
Falsch: dem POST-Handler blind vertrauen, dass alle
selection[]-Werte zur ACL des aktuell angemeldeten Nutzers gehören.
Ein manipulierter POST kann beliebige rowKey-Werte enthalten (CWE-639,
Broken Access Control) — jeder Schlüssel muss serverseitig erneut gegen die
Berechtigung des Nutzers geprüft werden, nicht nur gegen Existenz.
5. Verwendung
| Aktionstyp | Farbe (Contract v3) | Beispiel |
|---|---|---|
| gewöhnliche Massenaktion | weiß | „Gruppe zuweisen“ |
| Sonderaktion | blau | „CSV-Export der Auswahl„ |
| destruktive Massenaktion | rot, erfordert Bestätigungsdialog | „Zugriff deaktivieren“ |
6. API-Referenz: bulkActions
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'Zugriff deaktivieren', 'element' => '<button type="submit" name="do" value="deactivate" class="wk-btn wk-btn--danger">Zugriff deaktivieren</button>'], ['label' => 'Gruppe zuweisen', 'element' => '<button type="submit" name="do" value="assign-group" class="wk-btn">Gruppe zuweisen</button>'], ['label' => 'CSV-Export der Auswahl', 'element' => '<button type="submit" name="do" value="export-csv" class="wk-btn wk-btn--accent">CSV-Export der Auswahl</button>'], ], ]);
Mit 'bulkActions' => [...] rendert das Grid eine Auswahl-Toolbar
(.wk-datagrid__bulkbar, intern ein toolbar()-Aufruf) oberhalb
des Grid-Bodys: links der Zähler „n ausgewählt„ plus „Auswahl aufheben“,
rechts die Aktions-Buttons.
7. Parameter, Optionen und Zustände
| Schlüssel | Typ | Bedeutung |
|---|---|---|
$opts['bulkActions'] | array, toolbar()-Item-Schema | rendert die Auswahl-Toolbar; nur wirksam bei selection => 'multi' |
Zustände: ohne Auswahl ist die Leiste ausgeblendet (No-JS: immer sichtbar, Buttons wirken auf die angehakten Checkboxen).
Sicherheit:
- Destruktive Massenaktionen öffnen vor der Ausführung einen Bestätigungsdialog (
modal()), der die Anzahl und eine Stichprobe der betroffenen Einträge nennt („17 Benutzerzugriffe deaktivieren?„); „Abbrechen“ trägt den Default-Fokus. - Server-Seite: jede Massenaktion ist ein normaler Formular-POST der
selection[]-Schlüssel mitsectok-Prüfung (bzw. derselbe Endpunkt über das ajax.php-Muster); der Server validiert jeden Schlüssel erneut gegen ACL/Existenz und antwortet mit einer Ergebnis-Zusammenfassung („17 deaktiviert, 2 übersprungen: …„) als Statuszeile über dem Grid.
Fehlerverhalten: bulkActions gesetzt, aber selection !== 'multi'
→ die Auswahl-Toolbar rendert nicht, kein Fehler.
8. Vollständige Beispiele: Grid-Editing (editierbare Zellen)
dataGrid() rendert ausschließlich Anzeige-Zellen — kein Inline-Editing,
keine Editor-Zellen, kein Undo/Redo. Das ist eine bewusste
Architekturentscheidung (getrennte Zuständigkeit zwischen Anzeige und
Bearbeitung), kein Versehen:
- Editierbare Tabellen liefert das eigenständige
declarativeTable()(Widgets → Basis-Widget-Katalog): native Formularfelder je Zelle ({name}[{i}][{key}]), postet ohne JavaScript als ein Array — nichtdataGrid()-basiert. - Bestehendes Live-Beispiel derselben Container-Optik: die Table-Designer-Tabs in
wksqliteds— hand-gebaute Tabellen, die die Tabellen-Optik über die Container-Struktur erben. - Referenz für Verhaltensdetails: DevExpress ExpressQuantumGrid/XtraGrid „In-place Editing“.
9. Einschränkungen und Randfälle
- Kein Undo/Redo für Massenaktionen — jede Aktion ist sofort wirksam (nach Bestätigung bei destruktiven Aktionen).
- Kein Fortschrittsanzeiger für lang laufende Massenaktionen — der Aufrufer muss selbst entscheiden, ob eine Aktion synchron (Formular-POST + Reload) oder asynchron (AJAX + Fortschrittsanzeige) läuft.
10. Accessibility und Kompatibilität
- Vollständiger Überblick: Accessibility (konsolidiert, nicht hier dupliziert).
- Ohne JavaScript bleibt die Auswahl-Toolbar dauerhaft sichtbar (statt nur bei aktiver Auswahl) — funktional identisch, nur ohne die Zähler-Blende.
11. Troubleshooting
Symptom: Auswahl-Toolbar erscheint nicht trotz gesetztem
bulkActions.
Ursache: $opts['selection'] ist nicht multi — bulkActions
wirkt nur bei Mehrfachauswahl.
Lösung: selection => 'multi' und rowKey setzen (s.
Selection).
12. Verwandte Themen
- Demo-Übersicht — alle Kategorien
- DataGrid: Selection — Voraussetzung
selection => 'multi' - FluentUI: Öffentliche Helper-API —
toolbar()-Methodenvertrag - Styles-Contract (--wk-*) — Aktionsfarben-Semantik
- FluentUI: Basis-Widget-Katalog — DeclarativeTable/Table-Designer (Tier-2-Katalog)