Trenutno dejavna stran: start » sl » Interna dokumentacija » Razširitve DokuWikija (WvdS) » FluentUI (knjižnica oblikovalskega sistema) » FluentUI: reference komponent » FluentUI: namizni DataGrid — predstavitveni pregled » DataGrid: sorting

DataGrid: sorting

1. Pregled in namen

Stanje: [Live]. Vir: lib/plugins/wkfluentui/helper/widgets.php (oznake glave) in lib/plugins/wkfluentui/scripts/datagrid.js (razvrščanje na strani odjemalca).

Poglobi ključa sort/sortUrl iz osnovne pogodbe dataGrid(): dve medsebojno izključujoči poti razvrščanja na stolpec — na strani odjemalca (privzeto) in na strani strežnika (nadomestilo brez JS oz. za straničene/filtrirane podatke).

2. Predpogoji

  • Že razumljena osnovna pogodba dataGrid() ($columns/$rows/$opts).
  • Za razvrščanje na strani strežnika: shema parametrov zahtevka (npr. sort/dir), ki jo klicatelj sam določi in preveri.

3. Koncepti

Medsebojno izključujoče na stolpec: ko je nastavljen $opts['sortUrl'], vsak razvrstljiv stolpec izriše povezavo namesto gumba za razvrščanje — razvrščanje na strani odjemalca ostane izklopljeno za celotno tabelo, brž ko je nastavljen sortUrl (brez mešanega načina na stolpec).

Ločevanje izrisovanja in razvrščanja: pri razvrščanju na strani strežnika dataGrid() ne razvrsti $rows sam — sortUrl zagotovi le povezavo; klicatelj razvrsti podatke pred klicem (tipično prek SQL ORDER BY).

4. Prvi koraki

echo $widgets->dataGrid($columns, $rows, [
    'sort' => ['name', 'asc'],
]);

Napačno: posredovati $_GET['sort'] brez preverjanja kot ključ stolpca v stavek SQL ORDER BY (glej odsek 7, varnost).

5. Uporaba

Primer uporabe Vzorec
Mreža s podatki, ki so v celoti prisotni v DOM razvrščanje na strani odjemalca (privzeto), glej odsek 6
Straničeni/filtrirani podatki, kjer odjemalec ne pozna vseh vrstic sortUrl, glej odsek 7
Stolpec z vnaprej izrisanim HTML brez smiselne vrednosti za razvrščanje z navadnim besedilom sortable ⇒ false na tem stolpcu

6. Referenca API: razvrščanje na strani odjemalca (privzeto)

echo $widgets->dataGrid($columns, $rows, [
    'sort' => ['name', 'asc'],   // začetno razvrščanje: stolpec 'name', naraščajoče
]);

Klik na razvrstljivo glavo stolpca znova razvrsti vrstice, ki so že v DOM — številčno zavedno („10“ se razvrsti za „9“, ne leksikografsko pred njim), s kazalnikom puščice in atributom aria-sort. Če je dodatno nastavljen $opts['persistKey'], si mreža zapomni nazadnje izbrano razvrščanje med ogledi strani (podrobnosti: osnove → širine stolpcev in obstojnost).

7. Parametri, opcije in stanja

Ključ Tip Pomen
$opts['sort'] polje [key, 'asc'|'desc'] začetno stanje; izriše aria-sort na ustrezni celici glave
$opts['sortUrl'] callable (string $key): string povezave za razvrščanje na strani strežnika = nadomestilo brez JS; onemogoči razvrščanje na strani odjemalca za vse stolpce
$columns[]['sortable'] bool privzeto true; false zatre gumb/povezavo za razvrščanje in aria-sort za ta stolpec
$sortUrl = function ($key) {
    return wl($ID, ['sort' => $key, 'dir' => ($_GET['sort'] ?? '') === $key
        && ($_GET['dir'] ?? '') === 'asc' ? 'desc' : 'asc']);
};
 
echo $widgets->dataGrid($columns, $rows, [
    'sort'    => [$_GET['sort'] ?? 'name', $_GET['dir'] ?? 'asc'],
    'sortUrl' => $sortUrl,
]);

Varnost: wl() ustvari notranji URL, varen glede na CWE-601 (brez odprte preusmeritve prek uporabniškega vnosa v ciljnem URL-ju). Vrednost $_GET['sort'] mora klicatelj pred vsako uporabo SQL preveriti glede na znan seznam stolpcev (in_array($_GET['sort'], array_column($columns, 'key'), true)) — sicer je mogoč vbrizg SQL prek parametra razvrščanja (CWE-89). dataGrid() sam tega preverjanja ne izvede, ker stolpca nikoli ne primerja s poizvedbo SQL.

Obnašanje ob napaki: nerazvrstljiv stolpec (sortable ⇒ false) z nastavljenim sort kot začetnim razvrščanjem → brez napake, stolpec se kljub temu izriše brez uporabniškega vmesnika za razvrščanje, aria-sort ostane nenastavljen nanj.

8. Popolni primeri

$columns = [
    ['key' => 'id',     'label' => 'ID'],
    ['key' => 'status', 'label' => 'Stanje', 'sortable' => false],
];

9. Omejitve in robni primeri

  • Razvrščanje po več stolpcih (razvrsti po stolpcu A, nato B) ni izvedeno — vsako razvrščanje popolnoma nadomesti prejšnjega.
  • Razvrščanje na strani odjemalca bere vidno besedilo celice; stolpci s celicami ['html' => …] se razvrstijo po besedilni vsebini HTML, ne po ločeni vrednosti za razvrščanje.

10. Dostopnost in združljivost

  • aria-sort je pravilno nastavljen le na trenutno razvrščenem, razvrstljivem stolpcu — popoln pregled: accessibility.
  • Brez JavaScripta stolpec z nastavljenim sortUrl ostane povsem uporaben (prava povezava); stolpec brez sortUrl ostane nerazvrstljiv brez JavaScripta — to je dokumentirano stanje brez JS, ne napaka.

11. Odpravljanje težav

Simptom: klik na glavo stolpca ne razvrsti.

Vzrok: bodisi sortable ⇒ false na tem stolpcu, bodisi je nastavljen $opts['sortUrl'] (onemogoči razvrščanje na strani odjemalca za celo mrežo) in končna točka strežnika za povezavo dejansko ne razvrsti podatkov znova.

Rešitev: preverite vrednost sortable stolpca; pri nastavljenem sortUrl preverite, ali ciljna končna točka dejansko razvrsti $rows glede na parameter zahtevka, preden znova pokliče dataGrid().

12. Sorodne teme

sl/wiki/dwe/wkfluentui/component/datagrid/sorting.txt · Zadnja sprememba: uporabnika 0.0.0.0