DataGrid: Data Export
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: Zeilen-Copy [Live]; CSV-Export ist ein
[Live]-Anwendungsfall des bestehenden bulkActions-Kontrakts (kein
eigener Widget-Code); ein dedizierter Export-Helper ist [Live].
Referenz: DevExpress ASPxGridView „Data Export„ (CSV/XLSX/PDF).
2. Voraussetzungen
- Für Copy/Copy with Headers:
rowActions()am Grid gesetzt (Abschnitt 6).
3. Konzepte
Kein eingebautes Export-Feature — zwei bestehende Kontrakte
wiederverwendet: Copy nutzt rowActions()/Kontextmenü, CSV-Export
nutzt bulkActions. dataGrid() erzeugt selbst keine CSV-Datei —
das bleibt Sache eines eigenen Server-Endpunkts.
4. Erste Schritte
$rowActions = function (array $row) { return $this->rowActions([ ['label' => 'Copy', 'element' => '<button type="button" data-wk-copy="' . hsc($row['name']) . "\t" . hsc($row['status']) . '">Copy</button>'], ]); }; echo $widgets->dataGrid($columns, $rows, ['rowActions' => $rowActions]);
Falsch: den Export-Endpunkt die ungefilterte Gesamtmenge statt der
Auswahl exportieren lassen, weil „selection[] leer war, dann eben
alles“ (s. Abschnitt 7, Sicherheit).
5. Verwendung
| Bedarf | Muster |
|---|---|
| Einzelne Zeile in die Zwischenablage | Copy/Copy with Headers über rowActions() — Abschnitt 6 |
| Ausgewählte Zeilen als Datei | CSV-Export als Massenaktion über bulkActions — Abschnitt 6 |
| Verallgemeinerter Export-Helper | exportRows() — Abschnitt 8 |
6. API-Referenz
[Live] Copy / Copy with Headers
Über rowActions() + scripts/contextmenu.js
(api →
rowActions()) trägt jede Zeile optional ein Kontextmenü mit „Copy„/„Copy
with Headers“:
$rowActions = function (array $row) { return $this->rowActions([ ['label' => 'Copy', 'element' => '<button type="button" data-wk-copy="' . hsc($row['name']) . "\t" . hsc($row['status']) . '">Copy</button>'], ['label' => 'Copy with Headers', 'element' => '<button type="button" data-wk-copy-headers="1">Copy with Headers</button>'], ]); }; echo $widgets->dataGrid($columns, $rows, ['rowActions' => $rowActions]);
[Live] CSV-Export als Massenaktion
Der bestehende bulkActions-Kontrakt
(Data Editing
(Massenaktionen)) angewendet auf einen Export-Endpunkt:
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'CSV-Export der Auswahl', 'element' => '<button type="submit" formaction="' . hsc(wl($ID, ['do' => 'export-csv'])) . '" class="wk-btn wk-btn--accent">CSV-Export der Auswahl</button>'], ], ]);
7. Parameter, Optionen und Zustände
| Attribut | Wirkung |
|---|---|
data-wk-copy | Zwischenablage-Text für Copy (einzige Zusatzfunktion in scripts/contextmenu.js ohne No-JS-Äquivalent — Zwischenablage ist grundsätzlich ein Client-Feature) |
data-wk-copy-headers | Copy inklusive Spaltenüberschriften |
Strg+C bei aktivem Auswahlmodell | kopiert direkt, ohne Kontextmenü zu öffnen: bei selection => 'single' die aktive Zeile, bei 'multi' alle gewählten Zeilen zeilenweise (\n-getrennt) |
Sicherheit: der Export-Server-Endpunkt validiert die
selection[]-Schlüssel erneut gegen ACL/Existenz (gleiche Regel wie
bei jeder Massenaktion, s.
Massenaktionen →
Server-Seite), gibt dann Content-Type: text/csv +
Content-Disposition: attachment mit den validierten Zeilen aus.
Ein leerer selection[]-POST muss als Fehlerfall behandelt
werden (Statusmeldung „keine Auswahl„), nicht als „exportiere alles“ —
sonst exportiert ein Nutzer versehentlich Daten, die er nicht angefordert
hat.
8. Vollständige Beispiele: Dedizierter Export-Helper [Live]
exportRows() verallgemeinert das CSV-Muster oben,
statt dass jeder Aufrufer CSV-Escaping selbst nachbaut:
exportRows(array $columns, array $rows, string $format = 'csv'): stringinhelper_plugin_wkfluentui_widgets— nimmt dieselben$columns/$rows-Strukturen wiedataGrid()entgegen (ein Datensatz, zwei Darstellungen) und liefert RFC-4180-förmiges CSV: CRLF-Zeilenenden, jede Zelle gequotet, Anführungszeichen verdoppelt, Semikolon-Trenner; Zellen mit führendem=/+/-/@erhalten ein vorangestelltes Apostroph gegen Formel-Injection in Excel/LibreOffice (CWE-1236).['html' => …]-Zellen werden als Textinhalt exportiert, nie als Markup.format: nurcsv— jeder andere Wert liefert den leeren String; XLSX/PDF bleiben außerhalb dieses Widget-Kontrakts (externe Bibliotheken).
// im Export-Endpunkt, NACH ACL-/Existenz-Revalidierung der Auswahl: header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="export.csv"'); echo $widgets->exportRows($columns, $gewaehlteZeilen); exit;
9. Einschränkungen und Randfälle
exportRows()erzeugt nur den CSV-String — HTTP-Header, Dateiname und die ACL-Revalidierung der Auswahl bleiben Sache des Endpunkts (Abschnitt 7).- Kein XLSX/PDF-Export (Abschnitt 8).
10. Accessibility und Kompatibilität
navigator.clipboard.writeText()erfordert einen sicheren Kontext (HTTPS oder localhost) — auf unsicheren HTTP-Verbindungen ist Copy clientseitig nicht verfügbar, das Kontextmenü zeigt die Option dann nicht an.- Ohne JavaScript ist Copy/Copy with Headers nicht erreichbar (dokumentierte Ausnahme vom sonstigen No-JS-Grundsatz, s. Abschnitt 7).
11. Troubleshooting
Symptom: CSV-Export liefert leere/unerwartete Datei.
Ursache: der Export-Endpunkt behandelt ein leeres
selection[]-POST fälschlich als „alles exportieren„ statt als
Fehlerfall.
Lösung: Endpunkt-Logik gegen Abschnitt 7 (Sicherheit) prüfen — leere Auswahl muss eine Fehlermeldung liefern, nie eine ungefilterte Gesamtexport.
12. Verwandte Themen
- Demo-Übersicht — alle Kategorien
- DataGrid: Data Editing (Massenaktionen) —
bulkActions-Kontrakt, Server-Validierungsregel - FluentUI: Öffentliche Helper-API —
rowActions()/Kontextmenü-Vertrag