Trenutno dejavna stran: start » sl » Interna dokumentacija » Razširitve DokuWikija (WvdS) » FluentUI (knjižnica oblikovalskega sistema) » FluentUI: reference komponent » FluentUI: Vertical Grid (Property Grid) — predstavitveni pregled » Vertical Grid: osnove

Vertical Grid: osnove

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_widgets naložen prek plugin_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-describedby med stateText-om in kontrolnikom nastane le z nastavljenim ključem controlId vrstice (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

sl/wiki/dwe/wkfluentui/component/property-grid/basics.txt · Zadnja sprememba: uporabnika rollout