TreeView: osnove
Nazaj: predstavitveni pregled
Navigacijsko drevo iz vgrajenih razširitvenih elementov brskalnika: zgrajeno rekurzivno in v celoti uporabno brez JavaScripta.
1. Pregled in namen
Stanje: [Live]. Vir:
lib/plugins/wkfluentui/helper/widgets.php, metoda tree()
(vrstica 44).
tree() izriše rekurzivno navigacijsko drevo iz gnezdenih
<details>/<summary> elementov – povsem uporabno brez
JavaScripta. Ciljna publika: vsak vtičnik, ki potrebuje hierarhično
navigacijo strani/predmetov (npr. drevo predmetov v stranski vrstici),
brez gradnje lastne logike tipkovnice/razširjanja-strnjevanja.
Pomembno razmejevanje: tree() je navigacijsko drevo – vsako
vozlišče s href je povezava na drugo stran, ne odjemalsko izbirljivo
podatkovno drevo z lastnim stanjem (za to glej
Selection /
Checkboxes).
2. Predpogoji
- DokuWiki z omogočenim vtičnikom
wkfluentui. helper_plugin_wkfluentui_widgetsnaložen prekplugin_load('helper', 'wkfluentui_widgets').
3. Pojmi
Nativna semantika namesto obnove ARIA: <details>/<summary>
brezplačno ponuja razširjanje/strnjevanje, upravljanje s tipkovnico
(Enter/preslednica) in implicitno semantiko za bralnik zaslona – obnova
role="tree" ni potrebna, dokler ni aktivna nobena izbira (glej
Accessibility
za razliko, ko se doda selection).
Rekurzija: vozlišče z children se samo znova izriše prek
tree() – ista metoda gradi hierarhije poljubne globine.
4. Prvi koraki
/** @var helper_plugin_wkfluentui_widgets $widgets */ $widgets = plugin_load('helper', 'wkfluentui_widgets'); echo $widgets->tree([ ['label' => 'Povezave', 'href' => wl($ID, ['ns' => 'connections'])], [ 'label' => 'Tabele', 'children' => [ ['label' => 'naloge', 'href' => wl($ID, ['t' => 'naloge']), 'active' => true], ['label' => 'uporabniki', 'href' => wl($ID, ['t' => 'uporabniki'])], ], ], ]);
Napačno: ustvariti vozlišče brez href IN brez children, v
pričakovanju, da se bo pojavilo kot klikljivo mesto za zapolnitev. Brez
obojega se vozlišče izriše kot golo, neinteraktivno besedilo – to je
pravilna, dokumentirana degradacija, ne napaka.
5. Uporaba
| Primer uporabe | Vzorec |
|---|---|
| Drevo predmetov v stranski vrstici | tree() neposredno v regiji stranske vrstice – prvi porabnik wksqliteds |
| Oznaka trenutne strani | nastaviti active ⇒ true na ustreznem listnem vozlišču |
| Kontekstni podatki na povezavi | dataSql za prosto uporabne atribute data-sql (konvencija SQL Workbencha) |
6. API referenca
| Metapodatek | Vrednost |
|---|---|
| Jezik | PHP |
| Imenski prostor | helper_plugin_wkfluentui_widgets |
| Datoteka | lib/plugins/wkfluentui/helper/widgets.php |
| Vidnost | public |
| Stabilnost | stabilno (raven 1) |
public function tree(array $nodes): string
Povzetek: izriše rekurzivno, brez JavaScripta delujoče navigacijsko drevo iz gnezdenih definicij vozlišč.
Vrnjena vrednost: string – <ul class="wk-tree">…</ul>.
Prazen niz pri praznem $nodes.
7. Parametri, možnosti in stanja
$nodes (na vnos, rekurzivno)
| Ključ | Tip | Obvezno | Pomen |
|---|---|---|---|
label | string | Da | besedilo vozlišča (ubežano prek hsc()) |
href | string | Ne | ciljni URL; če manjka, je vozlišče golo združevalno besedilo (brez povezave) |
active | bool | Ne | označi trenutno vozlišče (.wk-tree__link–active, krepko + poudarjeno ozadje); pri skupinskem vozlišču brez lastnega open dodatno odpre njegov <details> (glej open spodaj) |
open | bool | Ne | od 2026-07-17, neodvisno od active: vsili odprto ali zaprto stanje skupinskega vozlišča, ne da bi nastavil videz aktivnega vozlišča. Če ključ manjka, velja vrednost active (100-odstotno združljivo za nazaj) – potrebno, kadar naj bo vozlišče prikazano razširjeno, NE da bi pomenilo »trenutno stran« (npr. ročno razširjen, a neobiskan imenski prostor) |
dataSql | string | Ne | prosto uporaben atribut data-sql na povezavi (prvi porabnik: SQL Workbench) |
children | array | Ne | gnezdena vozlišča, ista shema – spremeni vozlišče v skupino <details>/<summary> |
lazy + lazyUrl | bool + string | Ne | od 2026-07-17: vozlišče brez children, a z lazy ⇒ true in lazyUrl, se kljub temu izriše kot razširljiva skupina (prazen nadomestni <ul>, data-wk-tree-lazy-src). scripts/treeview.js ob odprtju naloži lazyUrl prek fetch() in zamenja nadomestek – odgovor mora priti s statusom 2xx in biti sam spet fragment tree(), ne cela stran; kaj se zgodi ob neuspehu, opisuje razdelek Vedenje ob napaki. Brez JavaScripta: ostane običajna povezava, če je href nastavljen; globlje poddrevo brez JavaScripta ostane nedosegljivo. Ne kombinirajte z open ⇒ true – glej Vedenje ob napaki spodaj. |
statusClass | string | Ne | od 2026-07-17: ena sama beseda, preverjena proti ^[a-z][a-z0-9-]*$ (neveljavne vrednosti se tiho zavržejo), izrisana kot wk-tree__status–<statusClass> na <li>. tree() sam temu razredu ne pripisuje pomena – videz določi klicatelj z lastnim CSS (prvi porabnik: stanja imenskih prostorov partial/divert/collection v wkacmenu) |
Generiran izris
<ul class="wk-tree"> → na vozlišče <li>, pri
children gnezdeno kot
<details><summary>Label</summary><ul>…</ul></details>.
Vedenje ob napaki
| Pogoj | Vedenje |
|---|---|
$nodes prazen | vrne prazen niz, brez napake |
Vozlišče brez href in brez children | izriše se kot golo, neinteraktivno besedilo – brez napake |
active ⇒ true na več vozliščih hkrati | brez preverjanja – vsa označena vozlišča dobijo aktivni razred, klicatelj je odgovoren za enoličnost |
statusClass krši ^[a-z][a-z0-9-]*$ | se tiho prezre (brez atributa razreda), brez napake |
Nadomestno vozlišče (lazy + lazyUrl, brez children) z open ⇒ true | open se pri tej kombinaciji prezre (nadomestek se vedno izriše zaprt) – utemeljitev v razdelku 9 |
Nalaganje ne uspe (status zunaj 2xx, omrežna napaka, odgovor brez ul.wk-tree ali cela stran – npr. prijavna stran po poteku seje) | v nadomestku se pojavi vrstica stanja li.wk-tree__loaderror (besedilo tree_lazy_error iz jezikovnih datotek, barva napake), ki jo bralnik zaslona napove prek vljudne žive regije nadomestka; naslednje razširjanje jo odstrani in nalaganje ponovi. Dokler zahteva teče, nosi vozlišče aria-busy="true" in ne sproži druge; nalaganje vozlišča se konča šele, ko ravan prispe. |
8. Popolni primeri
echo $widgets->tree([ [ 'label' => 'de', 'children' => [ ['label' => 'wiki', 'href' => wl($ID, ['ns' => 'de:wiki']), 'active' => true], ['label' => 'blog', 'href' => wl($ID, ['ns' => 'de:blog'])], ], ], ['label' => 'en', 'href' => wl($ID, ['ns' => 'en'])], ]);
9. Omejitve in robni primeri
activeoznači le trenutni ogled strani; pravo izbiro (radio/checkbox na vozlišče, form-POST) zagotavlja načinselection– Selection / Checkboxes.- Leno nalaganje prek
lazy/lazyUrl(od 2026-07-17, glej razdelek 7) pokrije zelo velika drevesa, saj se globlje ravni naložijo šele po potrebi – brez te možnosti morajo biti vsichildrenob klicu še vedno v celoti prisotni. lazy+open ⇒ truena istem vozlišču: nalaganje se ne zgodi (nativni dogodektoggle, ki gascripts/treeview.jsuporablja za nalaganje, se ne sproži za stanje, ki je odprto že ob nalaganju strani) – nadomestek bi ostal trajno prazen. Te kombinacije ne potrebuje noben primer uporabe;tree()zato za nadomestna vozliščaopennamenoma nikoli ne izriše.- Premikanje vozlišč: Drag & Drop (vidne povezave ▲/▼ plus izbirna plast vlečenja).
10. Dostopnost in združljivost
- Celoten pregled: Accessibility (konsolidirano, tu ni podvojeno).
- Povsem uporabno brez JavaScripta – brez odvisnosti od postopnega izboljšanja za osnovno funkcijo.
- Združljivost brskalnikov: odvisno od nativne podpore za
<details>(vsi trenutni brskalniki; starejši brskalniki brez podpore prikažejo vsebino trajno razširjeno namesto zložljive – degradirano, ne neuporabno).
11. Odpravljanje težav
Simptom: skupinsko vozlišče se ne odpre samodejno, čeprav ima
podrejeno vozlišče active ⇒ true.
Vzrok: active mora biti nastavljen na samem skupinskem
vozlišču, da se njegov <details> izriše odprt – označitev
podrejenega vozlišča ne odpre samodejno nadrejene skupine.
Rešitev: dodatno nastaviti active ⇒ true na nadrejenem vozlišču,
če naj bo skupina začetno odprta.
12. Sorodne teme
- predstavitveni pregled – vsaka kategorija
- FluentUI: javni API pomočnika – popolna pogodba metod
- SQLite Data Studio – prvi porabnik (drevo predmetov v stranski vrstici)