TreeView: Selection / Checkboxes
Zurück: Demo-Übersicht
1. Übersicht und Zweck
Status: [Live].
Quelle: lib/plugins/wkfluentui/helper/widgets.php (tree()-Markup)
und lib/plugins/wkfluentui/scripts/treeview.js (Eltern-Ableitung,
Pfeiltasten). Referenz: DevExpress-Baum-Checkbox-Selection (rekursive
Eltern-/Kind-Zustandsableitung).
2. Voraussetzungen
TreeView-Basiskontrakt
bereits verstanden; jeder auswählbare Knoten braucht einen stabilen
key-Wert.
3. Konzepte
Client-Anzeige vs. Server-Wahrheit: die Eltern-Ableitung
(indeterminate/aria-checked=„mixed“ bei Teilauswahl) ist reine
Client-Anzeige, der POST enthält nur die tatsächlich angehakten
Blatt-Knoten — der Server berechnet Konsequenzen für übergeordnete Gruppen
selbst (dieselbe Regel wie bei der Dreizustands-Checkbox, s.
Eingabefelder →
Check box). Ein Klick auf eine Eltern-Checkbox kaskadiert als
Client-Komfort in den Teilbaum; gepostet werden trotzdem die Blätter
einzeln.
4. Erste Schritte
echo $widgets->tree([ ['label' => 'de', 'key' => 'de', 'children' => [ ['label' => 'wiki', 'key' => 'de:wiki', 'selected' => true], ['label' => 'blog', 'key' => 'de:blog'], ]], ], ['selection' => 'checkbox']);
Falsch: den indeterminate-Elternzustand als eigenen POST-Wert
behandeln (s. Abschnitt 7) — oder Knoten ohne key auswählbar erwarten
(ohne key rendert der Knoten keine Checkbox).
5. Verwendung
$opts['selection'] | Einsatz |
|---|---|
none (Default) | reine Navigation, unverändertes Verhalten |
single | genau ein Knoten wählbar — rendert ein Radio je Knoten (selectionName als Feldname) |
checkbox | Mehrfachauswahl — rendert eine Checkbox je Knoten (<selectionName>[]), rekursive Eltern-Ableitung |
6. API-Referenz
$opts['selection'] => 'none'|'single'|'checkbox'(dieselbe Werte-Idee wie bei dataGrid(), auf einen Baum übertragen). Bei aktivem Auswahlmodell trägt das äußere<ul>role=„tree“, jeder Knotenrole=„treeitem“+aria-level, Gruppenknotenaria-expanded.$opts['selectionName'](Defaulttree-selection): Formularfeldname —singlepostet einen Radio-Wert,checkboxein[]-Array. Knoten-Schlüsselselected(bool) setzt die Vorauswahl.checkbox: Eltern-Zustand leitet sich rekursiv aus den Kindern ab — alle Kinder an → Elternteil an, keines an → aus, teilweise an →indeterminate+aria-checked=„mixed“(scripts/treeview.js).- Tastatur: Pfeil hoch/runter wandern zwischen sichtbaren Knoten, Pfeil rechts/links öffnen/schließen eine Gruppe; die Checkbox selbst togglet mit der nativen Leertaste.
7. Parameter, Optionen und Zustände
| Schlüssel | Typ | Bedeutung |
|---|---|---|
$opts['selection'] | 'none'|'single'|'checkbox' | Auswahlmodell, s. Abschnitt 5/6 |
$opts['selectionName'] | string | Formularfeldname, Default tree-selection |
Knoten-key | string | stabiler Wert der Checkbox/des Radios — Pflicht für auswählbare Knoten |
Knoten-selected | bool | Vorauswahl beim Rendern |
No-JS-Fallback: alle Checkboxen sind unabhängige Formularfelder im
umschließenden <form> des Aufrufers (wie bei
dataGrid()
Selection) — die Eltern-Ableitung ist reine Client-Anzeige, die Auswahl
postet vollständig ohne JavaScript.
Fehlerverhalten (verbindlich): indeterminate darf nicht als
eigener POST-Wert behandelt werden — der Server sieht nur die tatsächlich
angehakten Blattknoten und leitet Gruppen-Konsequenzen selbst ab.
8. Vollständige Beispiele
echo '<form method="post" action="' . hsc(wl($ID)) . '">'; formSecurityToken(); echo $widgets->tree($namespaceBaum, [ 'selection' => 'checkbox', 'selectionName' => 'sichtbare-ns', ]); echo '<button type="submit" class="wk-btn wk-btn--primary">Übernehmen</button></form>';
9. Einschränkungen und Randfälle
- Knoten ohne
keyrendern kein Auswahl-Control (bewusst — bedeutungslose Werte würden posten). singlenutzt native Radio-Semantik — ein „Abwählen auf null„ braucht einen eigenen Leer-Radio des Aufrufers.
10. Accessibility und Kompatibilität
Vollständiger Überblick: Accessibility.
11. Troubleshooting
Symptom: Eltern-Checkbox zeigt nie den Mischzustand.
Ursache: JavaScript inaktiv (Mischzustand ist eine DOM-Property, kein
Attribut) — oder die Kind-Checkboxen liegen nicht unter demselben
<details>-Teilbaum.
Lösung: Verhalten mit aktivem JavaScript prüfen; Baumstruktur über
children verschachteln statt flach rendern.
12. Verwandte Themen
- Demo-Übersicht — alle Kategorien
- Eingabefelder: Check box — Dreizustands-Regel, hier auf Baum-Ebene übertragen
- DataGrid: Selection — No-JS-Formular-Muster für Mehrfachauswahl