DataGrid: Data Export
Nazaj: predstavitveni pregled
1. Pregled in namen
Stanje: kopiranje vrstice [Live]; izvoz CSV je
primer uporabe [Live] obstoječe pogodbe bulkActions (brez
lastne kode gradnika); namenski pomočnik za izvoz je [Live].
Referenca: DevExpress ASPxGridView „Data Export„ (CSV/XLSX/PDF).
2. Predpogoji
- Za Copy/Copy with Headers:
rowActions()nastavljen na mreži (odsek 6).
3. Koncepti
Brez vgrajene funkcije izvoza — ponovno uporabljeni dve obstoječi
pogodbi: kopiranje uporablja rowActions()/kontekstni meni, izvoz
CSV uporablja bulkActions. dataGrid() sam ne ustvari datoteke
CSV — to ostane stvar namenske končne točke strežnika.
4. Prvi koraki
$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]);
Napačno: dovoliti, da končna točka izvoza izvozi nefiltriran
celoten nabor namesto izbire, ker je bil „selection[] prazen,
torej izvozimo vse“ (glej odsek 7, varnost).
5. Uporaba
| Potreba | Vzorec |
|---|---|
| Posamezna vrstica v odložišče | Copy/Copy with Headers prek rowActions() — odsek 6 |
| Izbrane vrstice kot datoteka | Izvoz CSV kot množično dejanje prek bulkActions — odsek 6 |
| Posplošen pomočnik za izvoz | exportRows() — odsek 8 |
6. Referenca API
[Live] Copy / Copy with Headers
Prek rowActions() + scripts/contextmenu.js
(api →
rowActions()) vsaka vrstica izbirno nosi kontekstni meni s „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] izvoz CSV kot množično dejanje
Obstoječa pogodba bulkActions
(Data Editing
(množična dejanja)) uporabljena na končni točki izvoza:
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'Izvoz CSV izbire', 'element' => '<button type="submit" formaction="' . hsc(wl($ID, ['do' => 'export-csv'])) . '" class="wk-btn wk-btn--accent">Izvoz CSV izbire</button>'], ], ]);
7. Parametri, opcije in stanja
| Atribut | Učinek |
|---|---|
data-wk-copy | besedilo za odložišče pri Copy (edina dodatna funkcija v scripts/contextmenu.js brez ustreznice brez JS — odložišče je v osnovi funkcija odjemalca) |
data-wk-copy-headers | Copy, vključno z glavami stolpcev |
Ctrl+C pri aktivnem modelu izbire | kopira neposredno, brez odpiranja kontekstnega menija: pri selection => 'single' aktivno vrstico, pri 'multi' vse izbrane vrstice, vrstico za vrstico (ločeno z \n) |
Varnost: končna točka strežnika za izvoz znova preveri ključe
selection[] glede na ACL/obstoj (enako pravilo kot pri vsakem
množičnem dejanju, glej
množična dejanja →
stran strežnika), nato izpiše Content-Type: text/csv +
Content-Disposition: attachment s preverjenimi vrsticami.
Prazen POST selection[] je treba obravnavati kot napako
(sporočilo o stanju „ni izbire„), ne kot „izvozi vse“ —
sicer uporabnik po nesreči izvozi podatke, ki jih ni zahteval.
8. Popolni primeri: namenski pomočnik za izvoz [Live]
exportRows() posploši zgornji vzorec CSV,
tako da vsakemu klicatelju ni treba znova zgraditi ubežanja CSV:
exportRows(array $columns, array $rows, string $format = 'csv'): stringvhelper_plugin_wkfluentui_widgets— sprejme enake strukture$columns/$rowskotdataGrid()(en podatkovni model, dva prikaza) in ustvari CSV v obliki RFC-4180: konci vrstic CRLF, vsaka celica v narekovajih, podvojeni narekovaji, ločilo podpičje; celice z uvodnim=/+/-/@dobijo uvodni apostrof proti vbrizgu formul v Excel/LibreOffice (CWE-1236). Celice['html' => …]se izvozijo kot njihova besedilna vsebina, nikoli kot oznake.format: lecsv— vsaka druga vrednost vrne prazen niz; XLSX/PDF ostajata zunaj te pogodbe gradnika (zahtevala bi zunanje knjižnice).
// v končni točki izvoza, PO ponovni validaciji ACL/obstoja izbire: header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="export.csv"'); echo $widgets->exportRows($columns, $izbraneVrstice); exit;
9. Omejitve in robni primeri
exportRows()ustvari le niz CSV — glave HTTP, ime datoteke in ponovna validacija ACL izbire ostanejo stvar končne točke (odsek 7).- Brez izvoza XLSX/PDF (odsek 8).
10. Dostopnost in združljivost
navigator.clipboard.writeText()zahteva varen kontekst (HTTPS ali localhost) — na nevarnih povezavah HTTP kopiranje na strani odjemalca ni na voljo, kontekstni meni tedaj ne prikaže te možnosti.- Brez JavaScripta Copy/Copy with Headers ni dosegljiv (dokumentirana izjema od sicer veljavnega načela brez JS, glej odsek 7).
11. Odpravljanje težav
Simptom: izvoz CSV ustvari prazno/nepričakovano datoteko.
Vzrok: končna točka izvoza napačno obravnava prazen POST
selection[] kot „izvozi vse„ namesto kot napako.
Rešitev: preverite logiko končne točke glede na odsek 7 (varnost) — prazna izbira mora vrniti sporočilo o napaki, nikoli nefiltriran celoten izvoz.
12. Sorodne teme
- predstavitveni pregled — vse kategorije
- DataGrid: Data Editing (množična dejanja) — pogodba
bulkActions, pravilo validacije strežnika - FluentUI: javni API pomočnika — pogodba
rowActions()/kontekstnega menija