DataGrid: Data Editing (množična dejanja)
Nazaj: predstavitveni pregled
1. Pregled in namen
Stanje: množična dejanja [Live]. Urejljive posamezne celice so [Live] (odsek 8, brez kode) — kategorija predstavitve DevExpress „Data Editing„ pokriva oba primera, tu namenoma ohranjena na eni strani namesto dveh skoraj praznih strani pogodbe.
Poglobi $opts['bulkActions'] iz
osnovne pogodbe dataGrid():
orodno vrstico izbire za množične operacije na več označenih vrsticah.
2. Predpogoji
- Končna točka strežnika, ki sprejme POST-e
selection[]s preverjanjemsectokin ponovno validacijo ACL na ključ.
3. Koncepti
Izbira na strani odjemalca nikoli ni merodajna: orodna vrstica izbire je čist prikaz/udobje — vsako dejanje je treba na strani strežnika znova preveriti glede na ACL/obstoj vsakega posameznega ključa (odsek 7, varnost).
Lokalno za mrežo, ne za cel modul: orodna vrstica izbire se pojavi neposredno ob mreži, z izbiro; dejanja za cel modul spadajo v območje ukazne vrstice lupine (admin-layout → „Ukazna vrstica kot območje lupine") — oboje je namenoma ločeno.
4. Prvi koraki
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'Dodeli skupino', 'element' => '<button type="submit" name="do" value="assign-group" class="wk-btn">Dodeli skupino</button>'], ], ]);
Napačno: slepo zaupati obravnavalcu POST, da vsaka vrednost
selection[] pripada ACL trenutno prijavljenega uporabnika.
Spremenjen POST lahko vsebuje poljubne vrednosti rowKey (CWE-639,
pokvarjen nadzor dostopa) — vsak ključ je treba na strani strežnika znova
preveriti glede na dovoljenje uporabnika, ne le glede na obstoj.
5. Uporaba
| Vrsta dejanja | Barva (pogodba v3) | Primer |
|---|---|---|
| navadno množično dejanje | belo | „Dodeli skupino“ |
| posebno dejanje | modro | „Izvoz CSV izbire„ |
| destruktivno množično dejanje | rdeče, zahteva pogovorno okno za potrditev | „Deaktiviraj dostop“ |
6. Referenca API: bulkActions
echo $widgets->dataGrid($columns, $rows, [ 'selection' => 'multi', 'rowKey' => 'id', 'bulkActions' => [ ['label' => 'Deaktiviraj dostop', 'element' => '<button type="submit" name="do" value="deactivate" class="wk-btn wk-btn--danger">Deaktiviraj dostop</button>'], ['label' => 'Dodeli skupino', 'element' => '<button type="submit" name="do" value="assign-group" class="wk-btn">Dodeli skupino</button>'], ['label' => 'Izvoz CSV izbire', 'element' => '<button type="submit" name="do" value="export-csv" class="wk-btn wk-btn--accent">Izvoz CSV izbire</button>'], ], ]);
Z nastavljenim 'bulkActions' => [...] mreža izriše orodno
vrstico izbire (.wk-datagrid__bulkbar, interno klic
toolbar()) nad telesom mreže: levo števec „n izbranih„ plus „počisti
izbiro“, desno gumbi dejanj.
7. Parametri, opcije in stanja
| Ključ | Tip | Pomen |
|---|---|---|
$opts['bulkActions'] | polje, shema elementov toolbar() | izriše orodno vrstico izbire; učinkovito le pri selection => 'multi' |
Stanja: brez izbire je vrstica skrita (brez JS: vedno vidna, gumbi delujejo na označena potrditvena polja).
Varnost:
- Destruktivna množična dejanja pred izvedbo odprejo pogovorno okno za potrditev (
modal()), ki navede število in vzorec prizadetih vnosov („Deaktivirati 17 uporabniških dostopov?„); „prekliči“ nosi privzeti fokus. - Stran strežnika: vsako množično dejanje je navaden POST obrazca ključev
selection[]s preverjanjemsectok(oz. ista končna točka prek vzorca ajax.php); strežnik ponovno preveri vsak ključ glede na ACL/obstoj in odgovori s povzetkom rezultata („17 deaktiviranih, 2 preskočena: …„) kot vrstico stanja nad mrežo.
Obnašanje ob napaki: bulkActions nastavljen, vendar
selection !== 'multi' → orodna vrstica izbire se ne izriše, brez
napake.
8. Popolni primeri: urejanje mreže (urejljive celice)
dataGrid() izriše izključno prikazovalne celice — brez urejanja v
vrstici, brez celic urejevalnika, brez razveljavitve/ponovitve. To je
namerna arhitekturna odločitev (ločena odgovornost med prikazom in
urejanjem), ne spregled:
- Urejljive tabele zagotavlja samostojen
declarativeTable()(widgets → osnovni katalog gradnikov): nativna polja obrazca po celici ({name}[{i}][{key}]), pošlje kot eno polje brez JavaScripta — ni temelječ nadataGrid(). - Obstoječ živ primer istega videza vsebnika: zavihki Table Designerja v
wksqliteds— ročno zgrajene tabele, ki videz tabele podedujejo prek strukture vsebnika. - Referenca za podrobnosti obnašanja: DevExpress ExpressQuantumGrid/XtraGrid „In-place Editing“.
9. Omejitve in robni primeri
- Brez razveljavitve/ponovitve za množična dejanja — vsako dejanje je takoj učinkovito (po potrditvi pri destruktivnih dejanjih).
- Brez kazalnika napredka za dolgotrajna množična dejanja — klicatelj mora sam odločiti, ali dejanje teče sinhrono (POST obrazca + ponovno nalaganje) ali asinhrono (AJAX + kazalnik napredka).
10. Dostopnost in združljivost
- Popoln pregled: accessibility (konsolidirano, tu ni podvojeno).
- Brez JavaScripta orodna vrstica izbire ostane trajno vidna (namesto le pri aktivni izbiri) — funkcionalno enako, le brez pojemanja števca.
11. Odpravljanje težav
Simptom: orodna vrstica izbire se ne pojavi kljub nastavljenemu
bulkActions.
Vzrok: $opts['selection'] ni multi — bulkActions
učinkuje le pri večkratni izbiri.
Rešitev: nastavite selection => 'multi' in rowKey (glej
selection).
12. Sorodne teme
- predstavitveni pregled — vse kategorije
- DataGrid: selection — predpogoj
selection => 'multi' - FluentUI: javni API pomočnika — pogodba metode
toolbar() - Styles Contract (--wk-*) — barvna semantika dejanj
- FluentUI: osnovni katalog gradnikov — DeclarativeTable/Table Designer (katalog Tier 2)