Vertical Grid: osnove
Nazaj: predstavitveni pregled
1. Pregled in namen
Stanje: povsem [Live] — osnovna mreža, skupine/odseki,
način samo za branje, stanje validacije in oznaka obveznega polja
so implementirani (vir: lib/plugins/wkfluentui/helper/widgets.php,
metoda propertyGrid()).
propertyGrid() prikaže en predmet kot dvostolpčno mrežo
oznaka/vrednost — atribute kot vrstice, ne kot stolpce (ustreznica
dataGrid()-u, ki
prikazuje veliko predmetov kot vrstice). Ciljna publika: vsak obrazec
ali inšpektor lastnosti, ki potrebuje pare oznaka+kontrolnik, brez
gradnje lastnega CSS-ja za mrežo obrazca.
2. Predpogoji
- DokuWiki z omogočenim vtičnikom
wkfluentui. helper_plugin_wkfluentui_widgetsnaložen prekplugin_load('helper', 'wkfluentui_widgets').- Kontrolnike (
controlHtml) priskrbi klicatelj —propertyGrid()ne izriše niti enega vnosnega polja, le okvir okoli njega (glej polja obrazca za ustrezne gradnike kontrolnikov).
3. Pojmi
Dve vlogi, en gradnik: mreža obrazca (vnosna polja s stolpcem oznak)
in inšpektor lastnosti (kontekstno občutljiv prikaz izbranega predmeta,
tipično v auxbarju) uporabljata isto metodo — razlika je le v
$opts['mode'] (odsek 7).
Navadno besedilo proti zaupanja vrednemu HTML-ju: label je
ubežan (escape) prek hsc(); controlHtml je zaupanja vreden HTML,
ki ga je že izdelal klicatelj — enaka konvencija kot povsod v tem API-ju
(glej api → odsek „pojmi").
Povratna združljivost: propertyGrid($rows) brez naknadno dodanih
ključev (section/value/state/required) se izriše bajtno
identično prvotni različici z enim parametrom.
4. Prvi koraki
/** @var helper_plugin_wkfluentui_widgets $widgets */ $widgets = plugin_load('helper', 'wkfluentui_widgets'); echo $widgets->propertyGrid([ ['label' => 'Ime', 'controlHtml' => '<input type="text" name="name" required>'], ['label' => 'Aktivno', 'controlHtml' => '<input type="checkbox" name="active">'], ]);
Napačno: neposredno posredovanje surovega uporabniškega vnosa kot
controlHtml ('controlHtml' => $_POST['x']). controlHtml
se izpiše nepreverjen — klicatelj tu nosi polno odgovornost za
XSS (CWE-79).
5. Uporaba
| Primer uporabe | Vzorec |
|---|---|
| Obrazec v predalu/pogovornem oknu | drawer()/modal() kot lupina, propertyGrid() kot telo — referenca: pogovorno okno „Connect to…„ in Table Designer (wksqliteds, 6 mest klica v dbadmin/*.php) |
| Inšpektor lastnosti v auxbarju | propertyGrid() s čistimi prikaznimi vrsticami (mode' ⇒ 'display') v panelu .wk-shell-auxbar; posodobitev prek klika za ponovno nalaganje oziroma prek dogodka wk-selectionchange DataGrida (datagrid → API izbire) |
| Ne uporabljati za | veliko podobnih predmetov (→ dataGrid()) ali dolgo besedilno dokumentacijo (→ navadna wiki-stran) |
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 propertyGrid(array $rows, array $opts = []): string
Povzetek: izriše dvostolpčno mrežo obrazca oznaka/kontrolnik
(CSS-mreža, fit-content(22rem) minmax(0, 1fr)) iz definicij vrstic, po
izbiri združenih v zložljive odseke in/ali v načinu samo za branje.
Stolpec oznak se sme prilegati svoji vsebini, ne sme pa je določati. Do
25. 08. 2026 je tu stalo max-content 1fr skupaj z white-space: nowrap
na oznaki. Kjer je oznaka cel stavek — in v tem paketu je to pri vsaki
nastavitvi paketa —, je bil max-content širina tega stavka, stolpec s
kontrolnikom pa je bil potisnjen izven vidnega območja.
Izmerjeno na sliki, zaslon z nastavitvami: pri širini okna 768 px je bil desni rob kontrolnika pri 1402 px, pri 1280 px pri 1646 px. Območje vsebine se ne pomika vodoravno — kontrolniki torej niso bili zunaj slike, ampak nedosegljivi. Pri 390 px na celotnem zaslonu ni bil viden niti eden.
fit-content(<dolžina>) je max-content z zgornjo mejo: kratka oznaka še
naprej določa svojo širino, dolga se pri meji ustavi in se prelomi. Oboje
gre skupaj — brez white-space: normal se oznaka, ki ne prelamlja, ne
skrči, ampak izteče iz svoje celice, in kontrolnik je eno raven nižje prav
tako izgubljen.
Vrnjena vrednost: string — celoten HTML-fragment
(<div class="wk-property-grid">…</div>). Prazen niz pri praznem
$rows.
7. Parametri, možnosti in stanja
$rows (na vrstico)
| Ključ | Tip | Obvezno | Pomen |
|---|---|---|---|
label | string | Ne | besedilo oznake (ubežano prek hsc()) |
controlHtml | string | Ne | zaupanja vreden HTML kontrolnika — ubeže ga klicatelj |
fullRow | bool | Ne | vrstica se razteza čez oba stolpca (pomožno besedilo, ločila, široki kontrolniki) |
section | string | Ne | združi zaporedne vrstice v zložljiv odsek (glej „skupine/odseki“ spodaj); ponovljeno ime po drugih vrsticah namerno začne novo skupino |
value | string | Ne | le pri mode => 'display' in brez controlHtml-ja: prikazna vrednost, ubežana prek hsc() |
mono | bool | Ne | monospace izris za value |
state | 'error'|'warning' | Ne | 3px poudarjen trak; čist prikaz, strežnik ostaja avtoriteta validacije |
stateText | string | Ne | vrstica sporočila pod kontrolnikom, ko je state aktiven |
required | bool | Ne | rdeča zvezdica + besedilo .a11y za bralnik zaslona na oznaki — ne nastavi atributa required na HTML-ju klicatelja (glej vedenje ob napaki) |
controlId | string | Ne | ID kontrolnika znotraj controlHtml-ja: oznaka dobi for="<controlId>", vrstica sporočila stanja dobi ID <controlId>__statetext; če controlHtml vsebuje natanko eno ujemanje id="<controlId>" brez lastnega aria-describedby-ja, vtičnik vrine povezavo — sicer HTML klicatelja ostane nedotaknjen in klicatelj sam nastavi aria-describedby="<controlId>__statetext". Brez controlId-ja: izris je bajtno identičen prejšnji različici |
$opts
| Ključ | Tip | Pomen |
|---|---|---|
mode | 'display' | način samo za branje, modifikator vsebnika –display |
persistKey | string | odprto stanje odseka preživi ponovna nalaganja prek scripts/propertygrid.js v localStorage-u pod wk-propertygrid:<persistKey> |
Generiran izris (razredi)
| Razred | Vloga |
|---|---|
.wk-property-grid | vsebnik — CSS-mreža, fit-content(22rem) minmax(0, 1fr) |
.wk-property-grid__section-body | telo odseka — lastna mreža z istimi definicijami stolpcev (display: contents na vrstici pomeni, da mora vsaka mreža svoje stolpce navesti sama) |
.wk-property-grid--display | modifikator vsebnika za način samo za branje |
.wk-property-grid__row | ena vrstica oznaka/kontrolnik |
.wk-property-grid__row--full | vrstica čez oba stolpca (fullRow) |
.wk-property-grid__row--error / …--warning | vrstica s stanjem validacije |
.wk-property-grid__label | celica oznake |
.wk-property-grid__required | rdeča zvezdica na oznaki obveznega polja |
.wk-property-grid__control | celica kontrolnika |
.wk-property-grid__value (--mono) | prikazna vrednost v načinu display |
.wk-property-grid__section | odsečna skupina <details open> |
.wk-property-grid__section-body | dvostolpčna mreža znotraj odseka |
.wk-property-grid__statetext | vrstica sporočila pod kontrolnikom vrstice stanja |
Skupine/odseki
Vrstice z isto vrednostjo section se združijo pod naslovom odseka
(polna širina, polkrepko s tanko ločnico — videz fieldset-legend iz
_admin-forms.css); naslov je zložljiv s klikom/Enter-jem (temelji
na <details>-u, deluje brez JavaScripta). Vrstice brez
section se izrišejo pred prvim odsekom. Referenca: kategorije
DevExpress VerticalGrid, skupine Table Designerja ADS.
Način samo za branje
propertyGrid($rows, ['mode' => 'display']): vrstice brez
controlHtml-ja sprejmejo value (odsek zgoraj); vsebnik nosi
.wk-property-grid--display (brez vnosnega chroma, vrednosti so
izbirljive, lebdenje vrstice prek --wk-admin-hover). To je
privzeto za inšpektor lastnosti — slog obrazca le tam, kjer se vsebina
dejansko ureja.
Vedenje ob napaki
| Pogoj | Vedenje |
|---|---|
$rows prazen | vrne prazen niz, brez napake |
required ⇒ true brez atributa required v controlHtml-ju | brez samodejnega popravka — vtičnik izriše le vizualno/a11y oznako; nativna validacija brskalnika izhaja izključno iz atributa required v HTML-ju klicatelja samega (namerna ločitev, brez implicitnega vrivanja atributov v tuj HTML) |
value nastavljen, mode pa manjka | value se prezre, namesto tega se izriše controlHtml oziroma prazna celica |
8. Popolni primeri
Obrazec z dvema odsekoma, validacijo obveznega polja in obstojnostjo stanja odseka:
echo $widgets->propertyGrid([ ['section' => 'Povezava', 'label' => 'Gostitelj', 'controlHtml' => '<input type="text" name="host" required>', 'required' => true], ['section' => 'Povezava', 'label' => 'Vrata', 'controlHtml' => '<input type="number" name="port" value="3306">'], ['section' => 'Poverilnice', 'label' => 'Uporabnik', 'controlHtml' => '<input type="text" name="user">'], ['section' => 'Poverilnice', 'label' => 'Geslo', 'controlHtml' => '<input type="password" name="pass">', 'state' => 'warning', 'stateText' => 'Shranjeno šifrirano.'], ], ['persistKey' => 'connect-dialog']);
9. Omejitve in robni primeri
- Brez ponovne izvedbe DevExpress-ovega načina primerjave več zapisov (več predmetov kot stolpci) — po potrebi samostojna pobuda; do takrat en
propertyGrid()na predmet, drug ob drugem. - Vedenje zapolnjevanja panela (mreža zapolni predal/auxbar, se pomika znotraj) — podrobnosti: adaptivity.
aria-describedbymedstateText-om in kontrolnikom nastane le z nastavljenim ključemcontrolIdvrstice (glej odsek 7) — starejši klicatelji brez tega ključa se izrišejo nespremenjeno; podrobnosti: accessibility.
10. Dostopnost in združljivost
- Celoten pregled: accessibility (konsolidirano, tu ni podvojeno).
- Brez JavaScripta vsak odsek ostane odprt in upravljiv (nativna semantika
<details>); izgubi se le obstojnost odprtega stanja med ponovnimi nalaganji. - Združljivost brskalnikov: brez zahtev onkraj osnovne podpore CSS Grid.
11. Odpravljanje težav
Simptom: obvezno polje ne prikaže rdeče zvezdice kljub
required ⇒ true.
Vzrok: required v definiciji vrstice in required kot
HTML-atribut v controlHtml-ju sta dve ločeni stvari — le prvo
upravlja zvezdico.
Rešitev: nastaviti 'required' => true na vrstici in
sam dodati atribut required v controlHtml-ju, če je želena
nativna validacija brskalnika.
Simptom: odprto stanje odseka se izgubi ob vsakem ogledu strani.
Vzrok: $opts['persistKey'] manjka.
Rešitev: nastaviti persistKey, ki je stabilen med ogledi strani
in enoličen na obrazec.
12. Sorodne teme
- predstavitveni pregled — vsaka kategorija
- FluentUI: javni API pomočnika — popolna pogodba metod
- FluentUI: osnovni katalog gradnikov — razvrstitev FormLayout (ADS)
- form-fields — vnosna polja za
controlHtml - Vodnik: gradnja prvega skrbniškega zaslona z FluentUI — vodnik po korakih
- FluentUI: skrbniško območje podrobno — metrika obrazcev/barvna semantika