FluentUI: Einstellungs-Editor
Zurück: FluentUI: Bereichs-Shells · Bibliotheks-Übersicht
Status: vollständig [Live seit 2026-08-25] (Quelle: Screen/Settings.php,
helper/settings.php, scripts/settings.js).
Verwandt: Admin-Layout ·
Beitragsvertrag v1 ·
Eigenschaftsraster
Was er ersetzt, und warum das kein Geschmacksurteil war
DokuWikis Konfigurationsmanager zeichnet seine ganze Antwort in einem Durchgang:
ein <fieldset> je Gruppe, eine Tabelle darin, jede Gruppe offen. Auf der
Live-Instanz am 25.08.2026 gemessen: 368 Einstellungen in 36 Gruppen auf einer
Seite, Median der Gruppengröße 8, größte 63. 48 davon weichen vom Standard ab,
und nichts auf dem Bildschirm sagte welche.
Die Länge war nicht das Schlimmste. Die Zeilen lagen im
Eigenschaftsraster,
dessen Beschriftungsspalte max-content war und dessen Beschriftung
white-space: nowrap trug. Jedes Paket dieser Suite schreibt einen ganzen
Erklärungssatz in Setting::prompt() — und der ist die Beschriftung. Die
erste Spalte wurde damit so breit wie der längste Satz ihrer Gruppe und schob die
Steuerelementspalte aus dem Sichtbereich:
| Fensterbreite | rechte Kante der Beschriftung | rechte Kante des Steuerelements |
|---|---|---|
| 768 px | 1374 px | 1402 px |
| 1280 px | 1618 px | 1646 px |
Der Inhaltsbereich scrollt nicht seitwärts. Die Steuerelemente waren also nicht
außerhalb des Bildes, sondern unerreichbar. Bei 390 px war auf dem gesamten
Bildschirm kein einziges sichtbar — achtzehn Beschriftungen, null Eingabefelder.
Gruppen mit kurzen Prompts (wrap) rendern korrekt, und genau deshalb sah es
monatelang nach einem Paketfehler aus statt nach einer Rasterregel.
Ein Ausschnitt darf gespeichert werden — die Mitführung
Das ist die Voraussetzung für alles Übrige und war nicht offensichtlich.
Configuration::updateSettings($input) läuft über jede Einstellung und
übergibt jeder $input[$key] ?? null. Die Basisklasse fängt null ab —
vier Unterklassen tun das nicht:
| Klasse | deutet ein Fehlen als |
|---|---|
SettingOnoff | 0 — der Schalter geht aus |
SettingMulticheckbox | leere Menge |
SettingDisableactions | dieselbe Klasse, dieselbe Wirkung |
SettingImConvert | leere Zeichenkette |
SettingSavedir | Fehler — und der Manager verwirft den ganzen Vorgang |
Ein Formular, das nur einen Ausschnitt zeigt, schaltet also stillschweigend jeden Schalter außerhalb des Ausschnitts ab. Auf der Live-Instanz: 86 Einstellungen dieser Klassen, 54 davon mit einem Wert, den ein Fehlen ändern würde.
Vier Läufe gegen denselben unveränderten Schreibweg, Bereich wkmail,
12 von 368 Einstellungen sichtbar:
| Lauf | Felder | Ergebnis |
|---|---|---|
| Vollformular (was der mitgelieferte Manager selbst sendet) | 339 | 7 Zuweisungen geändert — die Bezugsgröße |
| Ausschnitt mit Mitführung | 66 | 0 Änderungen über die Bezugsgröße hinaus |
| Ausschnitt ohne Mitführung | 12 | Validierung schlägt fehl, nichts wird gespeichert |
| Ausschnitt, Mitführung ohne die Schalter | 15 | 51 Änderungen über die Bezugsgröße hinaus |
Unter den 51: useacl = 0, securecookie = 0, iexssprotect = 0,
relnofollow = 0, sneaky_index = 0. Der erste schaltet die
Zugriffsverwaltung des gesamten Wikis ab — ausgelöst durch das Speichern von
zwölf Mail-Einstellungen.
Der dritte Lauf war nötig, weil der zweite irreführt: ohne Mitführung fällt
savedir mit hinein, dessen Fehler den ganzen Vorgang verwirft, und null
Änderungen sieht dann aus wie Unbedenklichkeit.
Der Editor führt deshalb für genau diese Klassen verborgene Felder mit dem aktuellen Wert mit — 54 Stück, rund 4 kB. Nur für sie: alle 368 mitzuführen wäre größer, bräuchte eine Serialisierung je Klasse und schriebe verschlüsselte Kennwörter in das Dokument.
Die Klassenliste ist ein Literal, und ein Literal, das veralten kann, ist ein
Defekt, der auf eine DokuWiki-Aktualisierung wartet. _test/SettingsCarryTest.php
hält sie deshalb in beide Richtungen gegen den Quelltext des
Konfigurationspakets: eine fünfte solche Klasse lässt den Prüfstand fallen, und
eine aufgeführte, die inzwischen eine Wache bekommen hat, ebenfalls.
Zurücksetzen ist ein Anzeigezustand, kein zweiter Schreibweg
Setting::shouldBeSaved() lässt einen Wert weg, sobald er der Vorgabe gleicht.
„Zurücksetzen„ und „die Vorgabe senden“ sind für den Schreiber also dasselbe.
Der Verweis &wkreset=<schlüssel> löscht deshalb nur den lokalen Wert am
anfrage-eigenen Objekt; das Steuerelement zeigt danach die Vorgabe, und das
gewöhnliche Speichern entfernt den Schlüssel aus conf/local.php. Drei
Eigenschaften folgen daraus, und jede ist der Grund für diese Form:
- es geht ohne JavaScript, für jede Setting-Klasse einschließlich der mehrwertigen, die ein Absendeknopf nicht ausdrücken könnte;
- ein GET schreibt nie — ein Vorablader, ein Lesezeichen oder ein Sammler, der dem Verweis folgt, ändert nichts;
- der Leser sieht vor dem Speichern, was er speichern wird.
&wkreset=* setzt alle Abweichungen des gezeigten Bereichs zurück, mit
Rückfrage und Nennung der Anzahl.
Der Bereich ist eine Adresse und wird gemerkt
&scope= nennt den Bereich: dokuwiki, tpl:<name>,
plugin:<name>, dazu die beiden Sichten !changed und !undefined.
Das Ausrufezeichen trennt sie baulich von einem Paketnamen — ein Paketverzeichnis
kann so nicht heißen, weil der Manifestlader es gegen [A-Za-z0-9_-]+
prüft.
Der Bereich wird je Benutzer gemerkt, und das ist keine Bequemlichkeit.
admin_plugin_config::handle() leitet nach erfolgreichem Speichern auf
?do=admin&page=config — ohne Bereich, und nichts in diesem Paket kann
das ändern, weil es in preProcess() geschieht, lange bevor der Bildschirm
existiert. Ohne das Merken landete jedes Speichern in den Kerneinstellungen
zurück, gleich welches Paket man gerade bearbeitet hat.
Die Überschrift ist der Schlüssel, kein Satzanfang
Setting::prompt() liefert eine Zeichenkette, und eine Zeile braucht zwei
Dinge: etwas zum Überfliegen und etwas zum Lesen.
Der erste Versuch schnitt den Prompt an seiner ersten Klauselgrenze ab. Gemessen ergab das Überschriften wie „Absendername, den Empfänger sehen, z„ — der Schnitt landete in „z. B.“ — und „Verlangt den zweiten Faktor eines bereits enrollten Benutzers bei jedem„. Ein Satzfragment ist schlechter als keine Überschrift: es liest sich wie eine und ist keine. Und jede Regel, die diese beiden Fälle behebt, ist eine Regel über deutsche Abkürzungen, in einem Feld, das in fünf Sprachen existiert.
Die Überschrift ist deshalb der Schlüssel selbst — das, was die Dokumentation nennt, was der Support erfragt und was ein Administrator in die Suche tippt. Der Prompt bleibt ganz und steht als Erklärung darunter. Dieselbe Aufteilung, die der Einstellungs-Editor von VS Code trifft, aus demselben Grund: eine Kennung ist stabil, ein Satz nicht.
Was nicht gebaut wurde, und warum
Kein „veraltet“-Filter. DokuWiki hat kein solches Feld. Das Wort aus einem
Prompt zu lesen wäre eine Vermutung im Gewand von Metadaten: sie hinge an der
Übersetzung, schlüge bei jedem Satz an, der ein veraltetes Verfahren nur
erwähnt, und antwortete in fünf Sprachen verschieden. Stattdessen liest der
Editor einen optionalen Metadatenparameter _deprecated, den ein Paket in
seiner conf/metadata.php setzen kann; die Gruppe erscheint, wenn etwas darin
ist.
Dafür gibt es zwei Sichten, für die eine Quelle existiert: Geändert
(Setting::isDefault()) und Unbekannte Schlüssel
(Configuration::getUndefined() — Schlüssel, die in der Datei stehen und die
kein Paket deklariert; sie sind nicht editierbar und bleiben beim Speichern
erhalten).
Die Aktivitätsleiste ist weiterhin eine Paketliste. Der Umbau auf administrative Arbeitsbereiche ändert das Vokabular einer gemeinsamen Fläche — er berührt den Markenvertrag und die je Benutzer gespeicherte Anordnung. Er läuft als eigener Vorgang.
Kleine Bildschirme
Beide Rasterspuren einer Zeile sind minmax(0, …). Keine Spur kann von
ihrem Inhalt bemessen werden, und damit kann keine Beschriftung, kein Satz und
kein Wert ein Steuerelement aus dem Sichtbereich schieben — das ist nicht
Geschmack, sondern genau der Defekt, gegen den dieser Bildschirm gebaut wurde.
Unter 1024 px wandert das Steuerelement unter den Text; unter 768 px wird das
Zeilenmenü zum Bogen und ein Kontrollkästchen 24 px groß. Die Umschaltpunkte
sind die dieser Installation (768/1024/1280), nicht die 700/1200 der ursprünglichen
Vorgabe: die vorhandene Leiter wird in Schale und Hausvorlage zwanzigmal
verwendet und ist im Kopf von wiki-layout.css als Stufenmodell beschrieben.
Abgenommen am Bild bei 320, 390, 768 und 1280 px, in drei Sprachen — Deutsch und Italienisch, weil beide je eine der zwei Kennzahlen anführen (Deutsch die meisten Einzelspitzen, Italienisch die größte Summe), und Englisch als Ausgangslage. Kein Element ragt über den Fensterrand.
Barrierefreiheit
<label for>nur, wo es stimmt. Eine mehrwertige Einstellung rendert ein Eingabefeld je Auswahl, und keines davon trägt die Kennung der Einstellung selbst; ein Label, das dorthin zeigt, verknüpfte die Beschriftung mit nichts — schlechter als eine einfache Beschriftung, weil ein Screenreader die Verknüpfung ansagt.- Zustand nie nur über Farbe. „Geändert„ ist ein Balken und eine Textmarke.
- Das Zeilenmenü ist ein
<details>— mit der Tastatur bedienbar und ohne Skript. - Meldungen laufen über eine Live-Region, auch wenn zusätzlich ein Toast erscheint: die Toast-Auszeichnung dieser Suite ist keine.
- Trefferflächen mindestens
–wk-touch-min(40 px, unter grobem Zeiger 44).
Verwandte Themen
- FluentUI: Admin-Bereich (vertieft) — die Regionen, in die dieser Bildschirm liefert
- Workbench Plugin Contract v1 — die vier Haken eines Ersatzbildschirms
- Vertical Grid: Grundlagen — die berichtigte Spurdefinition
- FluentUI: Design-Tokens —
–wk-touch-minund die Berührungstoken