Sie befinden sich hier: start » de » Interne Dokumentation » DokuWiki-Erweiterungen (WvdS) » DevOps Core

DevOps Core

DevOps Core ist die fachliche Grundlage der DevOps-Suite: Projekte, Rollen, Naben-Navigation und Merkmalschalter, auf denen alle DWDO-Pakete aufsetzen. Ein Projekt ist dabei kein Datensatz, sondern ein Namensraum. Gedacht ist das Paket für Verwalter, die Projekte und Rollen einrichten, und für Plugin-Entwickler, die ein eigenes Paket in die Suite einhängen.

Erste Schritte

Schnelleinstieg: Das erste Projekt anlegen und öffnen — der kürzeste Weg zum ersten Ergebnis, in drei Schritten.

Projektwurzel festlegenRollen zuordnenNaben prüfen

Häufige Aufgaben

Was Sie wollen Für wen Wo Sie das tun Anleitung
ein Projekt anlegen Verwaltung Namensraum unterhalb der Projektwurzel Projekte kommen aus Namensräumen
Rollen und Gruppen zuordnen Verwaltung Konfigurationsmanager Rollen
eine Nabe ein- oder ausblenden Verwaltung Merkmalschalter Vorrang der Merkmalschalter
herausfinden, warum eine Nabe fehlt Verwaltung Wann eine Nabe erscheint
die Projektauflösung nachvollziehen Entwickler do=wkdocore_diag Diagnose
ein eigenes Paket in die Suite einhängen Entwickler Erweiterungspunkte
eine Projektübersicht auf eine Seite setzen Verwaltung Wiki-Seite Arbeitsbereich
ein eigenes Backend in den Repository-Explorer einhängen Entwickler Arbeitsbereich
nachsehen, wofür die Suite gedacht ist alle Anwendungsfälle

Definition

Das Fundament der DWDO-Schicht: Was ein Projekt ist, wer darin was darf, und wie die Navigation innerhalb eines Projekts aussieht. Jedes DWDO-Paket baut darauf auf, statt seine eigene Vorstellung davon mitzubringen.

Das Paket rendert von sich aus keinen eigenen Bildschirm. Es registriert fünf Dienste an der Registratur von Core Plugin und stellt sie damit allen übrigen Paketen zur Verfügung.

Dienst Klasse Beantwortet
dwdo.context Model\DwdoContext Projekt, Rolle, aktive Nabe und Merkmalschalter der laufenden Anfrage
dwdo.projects Domain\ConfigProjectRegistry Welche Projekte gibt es, und welcher Namensraum gehört zu welchem
dwdo.permissions Domain\PermissionResolver Welche Rolle hat der angemeldete Nutzer in diesem Projekt
dwdo.hubs Domain\HubRegistry Welche Naben gibt es, in welcher Reihenfolge
dwdo.nav die Hilfskomponente des Pakets Rendert die Nabenleiste

Alle fünf sind über registerFactory() angemeldet: Ein Objekt entsteht erst beim ersten get() auf seine Kennung. Eine Anfrage, die kein DWDO-Projekt berührt, baut also keines davon.


Anwendungsfälle

  • Ein Wiki soll mehrere Projekte führen, die einander nicht sehen sollen, ohne dass jedes eine eigene Rechteverwaltung mitbringt.
  • Mehrere DWDO-Pakete sollen dieselbe Vorstellung davon teilen, was „das aktuelle Projekt„ ist.
  • Eine Projektleiste soll nur die Einträge zeigen, deren Bildschirme in dieser Installation überhaupt existieren.
  • Ein Fremdpaket soll eine eigene Nabe oder eine eigene Rolle beisteuern können, ohne dass wkdocore davon wissen muss.

Nicht Gegenstand dieses Pakets: die Bildschirme selbst. Arbeitselemente, Abfragen, Pipelines und Datenhaltung liegen in eigenen Paketen (siehe Siehe auch).


Projekte kommen aus Namensräumen

Ein Projekt ist zuallererst ein Namensraum unterhalb der Projektwurzel. Damit erbt es alles, was DokuWiki für Namensräume kann — ACL, Suche, Sicherung, Versionierung —, ohne dass irgendetwas davon nachgebaut werden müsste.

Die Wurzel darf einen Platzhalter tragen

projectroot ist nicht auf einen festen Namensraum festgelegt. Enthält der Wert den Platzhalter {lang}, löst action_plugin_wkdocore::roots() ihn einmal je Sprache aus projectlangs auf und liefert entsprechend viele Wurzeln zurück.

projectroot projectlangs ergibt
projects beliebig projects — der Platzhalter fehlt, projectlangs bleibt wirkungslos
{lang}:projects de,en de:projects und en:projects
{lang}:projects leer nur die aktive Wiki-Sprache

Warum das mehr ist als Ordnungsliebe. Eine Vorlage, die die Anzeigesprache aus dem führenden xx:-Abschnitt der Seitenkennung ableitet, bekommt von einer Seite unter einer sprachlosen Wurzel nichts. Ihre Aufwärtssuchen — Seitenleiste, Thema — verlassen dann die Sprache und greifen ins ganze Wiki. Der Platzhalter ist der Weg, Projektseiten innerhalb der Sprachnamensräume zu führen (de:projects:acme:…) statt in einer sprachlosen Wurzel daneben.

Die Reihenfolge der Wurzeln ist bedeutsam. roots() stellt die aktive Wiki-Sprache voran; die übrigen behalten die Reihenfolge, in der sie eingetragen sind. Der Grund liegt eine Klasse weiter: ConfigProjectRegistry legt ein über knownprojects vorgesetztes Projekt nur unter der ersten Wurzel an. Ohne diese Sortierung entstünde ein vorgesetztes Projekt in einer Sprache, in der der Leser gar nicht ist. Für bestehende Seiten spielt die Reihenfolge keine Rolle — der Auflöser probiert jede Wurzel.
Eine leere projectlangs-Liste bedeutet „dieses Wiki hat eine Sprache“, nicht „keine Sprachen„. Der Code fällt deshalb ausdrücklich auf die aktive Wiki-Sprache zurück. Würde er stattdessen auf nichts expandieren, verschwände jedes Projekt — ein deutlich schlimmerer Ausfall als eine ignorierte Einstellung.

Voreinstellung und Migration

Ausgeliefert wird projectroot = projects, also ohne Platzhalter. Das ist Absicht: Eine bestehende Installation behält ihre Anordnung beim Aktualisieren. Der Platzhalter ist eine Entscheidung, die der Betreiber trifft — und er trifft sie einmal, denn eine nachträgliche Umstellung ist ein Umzug des Seitenbestands, kein Wechsel einer Einstellung.

Ein Namensraum allein genügt nicht überall. Sobald ein Datensatz auf das Projekt verweist — etwa eine ADO-Verbindung, ein Arbeitselement oder eine Pipeline —, braucht es zusätzlich eine Zeile in dwdo_projects (siehe DevOps Storage Plugin). Alle Tabellen mit Projektbezug führen FOREIGN KEY(project_key) REFERENCES dwdo_projects(project_key) ON DELETE CASCADE. Fehlt die Zeile, scheitert das Speichern mit einer Fremdschlüssel-Meldung, die den eigentlichen Grund nicht nennt.

Rollen

Über die DokuWiki-ACL legt sich eine Rollenschicht aus Gruppen der Form @dwdo_<projekt>_maintainers / _contributors / _readers. Das Präfix dwdo_ ist über roleprefix einstellbar.

Rolle Stufe Bedeutung
none 0 kein Zugriff; zugleich der Rückfall, wenn kein Projekt aufgelöst wird
reader 10 Lesezugriff auf das Projekt
contributor 20 darf Inhalte anlegen und bearbeiten
maintainer 30 verwaltet Mitgliedschaft und Einstellungen des Projekts
admin 40 globaler DokuWiki-Administrator
Die Stufen zählen in Zehnerschritten, nicht in Einerschritten. Die Vorfassung dieser Seite nannte 0/1/2/3/4. Das war nicht bloß eine falsche Zahl, sondern nahm der Leiter genau die Eigenschaft, für die sie so gebaut ist: Role::defineLevel() erlaubt einem anderen Paket, eine eigene Rolle zwischen zwei eingebaute zu setzen. Bei Einerschritten ist dazwischen kein Platz.

Die Rollen ersetzen die ACL nicht, sie liegen darüber: Wer eine Seite nach ACL nicht lesen darf, sieht sie auch mit hoher Rolle nicht. Die Rolle entscheidet, welche Funktionen eines Projekts jemand bedienen darf.

Der Vergleich versagt geschlossen

Role::atLeast() vergleicht zwei Rollen über ihre Stufe. Steht eine von beiden nicht auf der Leiter, liefert der Vergleich false — es wird weder eine Ausnahme geworfen noch eine Vorgabestufe angenommen.

Das ist eine bewusste Sicherheitsentscheidung: Eine Nabe oder ein Merkmal, das auf einen unbekannten Rollennamen abgesichert ist — Tippfehler, oder eine Rolle aus einem Paket, dessen defineLevel()-Aufruf nie lief —, wird verborgen, nicht freigegeben.

Role::defineLevel() schreibt in eine statische Leiter, die alle Rollenobjekte des Prozesses teilen. Der Aufruf gehört genau einmal und früh in die Anfrage, üblicherweise in einen *_REGISTER_SERVICES-Behandler — nicht in eine Schleife und nicht in einen Renderer.

Naben-Navigation

Die Leiste innerhalb eines Projekts. HubRegistry::defaults() liefert acht Naben:

Schlüssel Ordnung Ziel Mindestrolle ACL Braucht Paket
hub.overview 10 Startseite des Projekts reader lesen
hub.dashboard 15 dashboard reader lesen Dashboard
hub.boards 20 boards reader lesen Boards
hub.repos 30 repos reader lesen
hub.pipelines 40 pipelines reader lesen Pipelines
hub.wiki 50 wiki:start reader lesen
hub.queries 60 queries reader lesen Queries
hub.settings 70 settings maintainer bearbeiten
Die Vorfassung dieser Seite nannte sieben Naben und ließ hub.dashboard aus. Die Zahl stammte aus zwei Kommentaren im Quellcode selbst, die stehen geblieben waren, als die Nabe an Ordnung 15 dazukam. Beide sind mit dieser Überarbeitung berichtigt — eine Dokumentation ist nur so gut wie der Kommentar, aus dem sie geschrieben wird.

hub.settings ist die einzige Nabe, die nicht bei reader und Leserecht steht. Sie verlangt maintainer und Bearbeitungsrecht. Beide Prüfungen laufen unabhängig voneinander, ausdrücklich als gestaffelte Absicherung.

Wann eine Nabe erscheint

Vier der acht Naben zeigen auf einen Bildschirm, den ein eigenes Paket besitzt — sie verschwinden, wenn dieses Paket fehlt oder abgeschaltet ist. Die anderen vier zeigen auf gewöhnliche Wiki-Seiten, die ein Team selbst schreibt; sie brauchen kein Paket und erscheinen deshalb immer.

Die Vorfassung schrieb, ein Eintrag erscheine „nur, wenn das zuständige Plugin installiert und die Rolle ausreichend ist“. Für overview, repos, wiki und settings ist das falsch — für diese vier gibt es kein zuständiges Paket, und es soll auch keines geben.

„Installiert„ heißt dabei installiert und eingeschaltet: Die Prüfung läuft über plugin_isdisabled(), und DokuWiki meldet ein unbekanntes Paket als abgeschaltet. Ein im Erweiterungsmanager deaktiviertes Paket ist damit genauso unerreichbar wie ein fehlendes — und seine Nabe verschwindet in beiden Fällen.

Der Grund, warum eine Nabe ohne Bildschirm verschwindet statt ins Leere zu führen, steht im Code ausgeschrieben und gehört hierher: Eine sichtbare Nabe, die nirgendwohin führt, kostet einen Klick und bringt dem Leser bei, dass die Navigation lügt. Eine ausgeblendete sagt „hier nicht“, und das stimmt.

Vorrang der Merkmalschalter

FeatureFlags::resolve() entscheidet je Schlüssel in dieser Reihenfolge; die erste zutreffende Stufe gewinnt:

  1. Projektbezogene Übersteuerung — gewinnt immer, auch über ein fehlendes Paket. Grund: reserved
  2. Paket meldet sich als nicht verfügbar — schaltet ab, gleich was die Vorgabe sagt. Grund: plugin-missing
  3. Wiki-weite Vorgabe aus disabledhubs — Grund: default bzw. suite-disabled
  4. Keine Stufe hat etwas gesagt — der Schalter steht an. Grund: default
disabledhubs kann einen Schalter nur abschalten, nie einschalten. Einen konfigurationsseitigen Weg, ein Merkmal zu erzwingen, gibt es nicht. Und disabledhubs ist nicht das letzte Wort: Eine projektbezogene Übersteuerung steht eine Stufe darüber und kann eine wiki-weit abgeschaltete Nabe für ein einzelnes Projekt zurückholen.
Auf dieser Instanz zeichnet die Nabenleiste in die rechte Rail der Wiki-Schale; das übernimmt wkfluentui über die Regionen-Übergabe. Ohne eine Schale mit Aufnahmestelle greift fallbacknav und die Leiste erscheint oberhalb des Inhalts.
Eine Nabe nennt ihr Symbol als Alias, und zwar als dritten Konstruktorparameter — nicht über einen icon()-Aufruf. Wer die benötigten Aliase durch Suche nach icon() ermittelt, übersieht genau diese Form. Siehe Dienste für die WvdS-DW-Registry.

Arbeitsbereich Projekte und Repositories

Die Naben führen zu den Bereichen eines Projekts. Wer zuerst wissen muss, welche Projekte und Repositories es überhaupt gibt, braucht eine Ebene davor — dafür gibt es zwei Verzeichnisdienste und drei Syntaxbausteine.

Zwei Verzeichnisse

Dienst Antwortet auf Sichtbarkeitsregel
dwdo.projectdirectory Welche Projekte sieht dieses Konto? Leserecht auf der Projektwurzel oder mindestens ein sichtbares Repository
dwdo.repodirectory Welche Repositories sieht dieses Konto, projektübergreifend? die Prüfung des jeweiligen Backends, danach ein zweites Mal die ACL des Einhängenamensraums

Das Projektverzeichnis führt vier Quellen zusammen — vorgesetzte Kürzel, den Namensraum-Durchlauf, gespeicherte Projektdatensätze und das Ereignis WKDOCORE_PROJECT_DISCOVER. Es beantwortet Einzelabfrage und Auflistung aus derselben Menge: Ein Projekt, das die Liste nicht zeigt, ist auch über die Einzelabfrage nicht nachweisbar. Andernfalls wäre die Abfrage ein Auskunftsmittel über Projekte, die der Fragende nicht sehen darf.

Das Leserecht auf der Wurzel allein genügt nicht als Grund, ein Projekt aufzulisten: Wo die ACL * @user 1 setzt, ist jede Projektwurzel für jedes angemeldete Konto lesbar, und die Übersicht bestünde aus leeren Karten. Gelistet wird ein Projekt, wenn es mindestens ein sichtbares Repository hat, eine Startseite besitzt oder das Konto darin mindestens Contributor ist.

Vier Bausteine für Seiten

Baustein Zeigt
{{wk:explore>}} den Einstieg: beide Zahlen, die eigenen Rollen, die Anleitungen und darunter beide Listen
{{wk:projects>}} die Projektübersicht mit Suche, Statusfilter und „Meine Projekte„
{{wk:repos>}} die projektübergreifende Repository-Liste mit Suche, Projektwahl und Seitenblättern
{{wk:contribute}} den nächsten Schritt zur Mitarbeit, passend zur Rolle des Lesenden

Alle vier rufen nocache(): Ihre Ausgabe hängt vom Konto ab, und eine zwischengespeicherte Seite zeigte dem nächsten Besucher die Auswahl des vorigen.

{{wk:explore>}} ist keine dritte Umsetzung derselben Listen, sondern ruft die beiden anderen Bausteine auf. Filter, Beschriftungen, Leerzustände und die Berechtigungsprüfung gibt es deshalb genau einmal. Die Abfrageparameter beißen sich nicht: Die Projektliste liest pq/pscope/pstatus, die Repository-Liste rq/rp/ro, und q bleibt der Volltextsuche des Wikis. Beide Filter arbeiten daher auf einer gemeinsamen Seite unabhängig voneinander, und eine gefilterte Ansicht ist eine Adresse, die sich weitergeben lässt.

Option: size=<n> setzt die Seitengröße der Repository-Tabelle. Die Repository-Liste steht in diesem Baustein fest auf alle Projekte — sie ist hier der projektübergreifende Einstieg, auch wenn die Seite in einem Projektnamensraum liegt.

{{wk:repos>}} richtet sich nach der Seite, auf der es steht. Innerhalb eines Projekts zeigt es die Repositories dieses Projekts, außerhalb alle. Das war einmal umgekehrt, und so entstand eine Seite, die Die Repositories dieses Projekts überschrieben war und die aller Projekte auflistete. Das Gegenmittel war, das Projektkürzel von Hand einzutragen: ableitbar aus dem Namensraum der Seite, bei einem Tippfehler still zu einer leeren Liste führend, und etwas, das eine schreibende Person wissen muss statt etwas, das die Seite über sich selbst weiß. Aus demselben Grund setzt {{wk:explore>}} oben ausdrücklich project=all: ein Einstieg, der die ganze Landschaft zeigen soll, darf das nicht davon abhängig machen, wo er zufällig liegt.

Angabe Wirkung
keine das Projekt der Seite; außerhalb einer Projektwurzel alle Projekte
project=<kürzel> genau dieses Projekt, ohne Projektauswahl
project=all alle Projekte, auch von einer Projektseite aus
size=<n> andere Seitengröße, höchstens 100

Beide Listen verweisen neben ihrer Ergebniszeile auf die geschriebene Anleitung zu ihrem Bildschirm, und zwar nur dann, wenn es diese Seite auf dieser Installation wirklich gibt. Eine nicht geschriebene Anleitung kostet den Verweis und erzeugt niemals einen toten Link.

Mitgliederverwaltung je Projekt

do=wkdocore_members&project=<kürzel> zeigt, wer in einem Projekt welche Rolle hat, und gibt sie aus. Kein Bildschirm der Wiki-Verwaltung, sondern eine eigene Aktion — und das ist der entscheidende Unterschied: Der Verwaltungsbereich prüft den wikiweiten Manager-Status, dieser Bildschirm prüft die Projektrolle. Ein Maintainer kommt hinein, ohne Wiki-Administrator zu sein; ein Wiki-Administrator, der in keinem Projekt eine Rolle hat, kommt trotzdem hinein.

Wer Darf
Maintainer des Projekts Leser und Contributor vergeben, ändern und entziehen
Wiki-Administration zusätzlich Maintainer ernennen und entziehen
alle anderen den Bildschirm nicht sehen

Die Grenze steht in Domain/ProjectMembership, nicht in der Oberfläche: Der Bildschirm bietet eine Stufe, die der Betrachter nicht vergeben darf, gar nicht erst an, und die Prüfung weist eine von Hand gebaute Absendung derselben Stufe ebenfalls ab. Zwei Ebenen, weil die erste Auszeichnung ist und Auszeichnung keine Rechteprüfung.

Eine Rollenvergabe ersetzt die bisherige Stufe, statt sie zu ergänzen: Die Rollenauflösung nimmt den ersten Treffer von oben, eine zusätzliche schwächere Gruppe entscheidet also nichts mehr und wäre nur eine Angabe, die der Wirklichkeit widerspricht. Bereits bestehende Doppelungen werden je Zeile benannt, aber nicht ungefragt entfernt.

Der Anfrage-Verteiler von wkrequest zeigt für ROLE_REQUEST und ACCESS_REQUEST auf diesen Bildschirm. Vorher zeigte er auf die Benutzerverwaltung des Wikis — weshalb jede Mitgliedsanfrage jedes Projekts bei einer einzigen Person endete, unabhängig davon, wer das Projekt betreut.

{{wk:repos>}} blendet Spalten aus, die keine Zeile füllen kann. Der Standardbranch steht zur Verfügung, weil ihn eine einzige Sammelauskunft je Verbindung liefert — bei 61 eingebundenen Repositories sind das vier Anfragen, nicht 61, und die Antwort wird zwischengespeichert. Sprache und letzte Änderung würden je Zeile eine eigene Anfrage kosten; die Einhängequelle lässt sie deshalb weiterhin offen, und die Spalten erscheinen gar nicht erst, statt leer zu bleiben.


Konfiguration

Acht Einstellungen, im Konfigurationsmanager unter plugin » wkdocore. Die Spalte Vorgabe nennt den ausgelieferten Wert, nicht den auf dieser Installation gesetzten.

Projekte finden

Einstellung Vorgabe Wirkung Bei Fehleingabe
projectroot projects Namensraum-Wurzel, unter der Projekte liegen. Darf {lang} enthalten. leer = keine Wurzel, also kein Projekt
projectlangs leer Sprachen, zu denen {lang} expandiert (Kommaliste) ohne Platzhalter in projectroot wirkungslos; leer = aktive Wiki-Sprache
knownprojects leer Komma-Liste vorgesetzter Kürzel leer = reine Auto-Erkennung
autodiscover 1 jeder Namensraum unter der Wurzel gilt als Projekt aus = nur knownprojects zählt

Jeder Wert wird durch cleanID() normalisiert, leere Einträge fallen weg, Doppelungen werden zusammengefasst. Eine Kommaliste mit Leerzeichen um die Einträge ist also zulässig.

Rollen und Navigation

Einstellung Vorgabe Wirkung Bei Fehleingabe
roleprefix dwdo_ Präfix der Rollen-Gruppen: @<präfix><projekt>_maintainers ein Präfix ohne passende Gruppen ergibt für jeden die Rolle none
fallbacknav 1 Nabenleiste in den Inhalt einfügen, wenn die Vorlage keine Aufnahmestelle bietet aus = die Leiste erscheint nur dort, wo eine Vorlage sie selbst zeichnet
disabledhubs leer Komma-Liste abgeschalteter Nabenschlüssel, z. B. hub.pipelines ein unbekannter Schlüssel schaltet nichts ab und meldet nichts
guideroot {lang}:wiki:projects Namensraum, in dem die Leseanleitungen des Arbeitsbereichs liegen zeigt der Namensraum ins Leere, entfällt der jeweilige Verweis, statt einen toten Link zu zeichnen
guideroot zeigt bewusst nicht unter die Projektwurzel. Die Anleitungen erklären, wie man Projekte findet und Zugang bekommt — wer sie unter projects: legte, verlangte für die Erklärung genau das Leserecht, dessen Fehlen die Erklärung behandelt. Die Blattnamen der Anleitungen sind im Paket festgelegt und englisch; nur der Namensraum davor ist konfigurierbar, und nur sein {lang}-Segment wechselt zwischen den Sprachfassungen.
fallbacknav greift ausschließlich bei act=show. Bearbeiten, Vergleichen und Suchen bekommen die Leiste nicht — sie ist Inhaltsnavigation und in diesen Ansichten ohne Gegenstand. Doppelt gezeichnet wird sie nie: Eine Vorlage mit eigener Aufnahmestelle ruft den Renderer selbst, und löst sich kein Projekt auf, liefert er eine leere Zeichenkette und es wird nichts eingefügt.

Erweiterungspunkte für andere Pakete

Fünf Stellen, an denen ein Fremdpaket beitragen kann, ohne dass wkdocore es kennen muss:

Punkt Form Wofür
WKDOCORE_REGISTER_HUBS Ereignis, BEFORE eigene Nabe über $event→data→register(new Hub(…))
WKDOCORE_REGISTER_REPOSITORY_SOURCES Ereignis, BEFORE eigenes Repository-Backend über $event→data→register($quelle) in den Explorer einhängen
WKDOCORE_PROJECT_DISCOVER Ereignis, BEFORE Projektkürzel beisteuern, die weder vorgesetzt sind noch als Namensraum bestehen
Role::defineLevel() statischer Aufruf eigene Rolle einfügen oder eine eingebaute umstufen
Projektbezogene Übersteuerung Datensatz einen Merkmalschalter je Projekt setzen; gewinnt über alle anderen Stufen

Keines der drei Ereignisse hat eine Vorgabehandlung auf Kernseite: Die Behandler tragen ihren Beitrag unmittelbar in die geteilte Registratur ein.

Eine Repository-Quelle liefert fertig geprüfte Zeilen. Der Vertrag verlangt vier Dinge: Sie filtert selbst nach Berechtigung, sie wirft nie, sie nennt nur Repositories, für die sie einstehen kann, und die gemeldeten Fähigkeiten sind die tatsächlichen. Damit braucht der Explorer keinen Sonderfall je Backend — wkdoadogit erscheint darin durch Installation, nicht durch eine Codeänderung in der Projektoberfläche.


Diagnose

?do=wkdocore_diag zeigt den aufgelösten DwdoContext als JSON: aktives Projekt, Rolle des angemeldeten Nutzers, sichtbare Naben, Merkmalschalter samt Grund je Schlüssel, Nutzername und Administratorkennzeichen. Das ist die schnellste Antwort auf „warum sehe ich diesen Menüpunkt nicht“ — der Grund steht wörtlich da (reserved, plugin-missing, suite-disabled, default).

Der Bildschirm ist hinter $conf['allowdebug'] verriegelt. Ohne diese Einstellung erscheint ausschließlich der Satz „Diagnostics disabled (set allowdebug=1).„ — kein Fehler, keine Warnung, keine Daten. Die Vorfassung dieser Seite nannte die Adresse ohne die Bedingung; wer ihr folgte, bekam einen leeren Bildschirm und keinen Hinweis darauf, warum.

Die Verriegelung ist richtig und bleibt: Die Ausgabe ist interner Anfragezustand und darf nicht auf einer Instanz erscheinen, die sich nicht ausdrücklich für Fehlersuchausgaben entschieden hat.


Verhalten in Sonderfällen

Fall Verhalten
Seite liegt außerhalb jeder Projektwurzel kein Projekt, Rolle none, keine Nabenleiste
projectroot leer roots() liefert ein leeres Feld — es gibt kein Projekt
{lang} gesetzt, projectlangs leer eine Wurzel, in der aktiven Wiki-Sprache
Rolle nicht auf der Leiter jeder Vergleich false — die Funktion bleibt verborgen
Core Plugin fehlt kein Dienst wird angemeldet; das Paket bleibt still, statt zu scheitern
Nabenpaket abgeschaltet statt deinstalliert dieselbe Wirkung wie fehlend: Nabe verschwindet

Die Prüfung auf die Registratur läuft entenartig über method_exists(), nicht über eine Typangabe. Core Plugin ist eine Laufzeit-Abhängigkeit, die über plugin_load() kommt, keine harte Einbindung — deshalb muss der Code eine fehlende oder fremde Nutzlast vertragen.


Siehe auch


Technische Referenz

Gegenstand Ort
Dienstanmeldung, Konfigurationshelfer, Diagnose action.php
Wurzelauflösung samt {lang} action_plugin_wkdocore::roots()
Projektregistratur Domain/ConfigProjectRegistry.php
Projektauflösung aus der Seitenkennung Domain/ProjectResolver.php
Rollenauflösung über Gruppen Domain/PermissionResolver.php
Nabenregistratur und die acht Vorgaben Domain/HubRegistry.php
Rollenleiter und defineLevel() Model/Role.php
Vorrangregel der Merkmalschalter Model/FeatureFlags.php
Anfragezustand Model/DwdoContext.php
Projektverzeichnis: Vertrag und Zusammenführung Domain/ProjectDirectory.php, Domain/AggregateProjectDirectory.php
Repository-Verzeichnis und Quellenvertrag Domain/RepositoryDirectory.php, Domain/RepositorySource.php
Wertobjekte für Karte und Zeile Model/ProjectDescriptor.php, Model/RepositoryDescriptor.php
Auszeichnung ohne Dienstzugriff Ui/ProjectExplorer.php, Ui/RepositoryExplorer.php, Ui/ContributePanel.php
die einzige Stelle, an der Ui und Domain zusammenkommen helper/explorer.php
Ereigniskatalog Events.php

Paketangaben

Paket: wkdocore
Verzeichnis: lib/plugins/wkdocore/
Autor: Wolfgang van der Stille Wolfgang.van.der.Stille@gmail.com (The White Knight Labs)
Lizenz: GPL-2.0-only

Diese Seite ist am 4. August 2026 vollständig gegen den Quellcode gegengelesen worden. Vier Angaben der Vorfassung waren falsch und sind hier berichtigt; sie stehen jeweils an Ort und Stelle als Korrektur, damit niemand die alte Zahl aus dem Gedächtnis weiterträgt:
  • Die Rollenleiter zählt 0/10/20/30/40, nicht 0/1/2/3/4 — siehe Rollen.
  • Es gibt acht Naben, nicht sieben — hub.dashboard fehlte — siehe Naben-Navigation.
  • Vier der acht Naben brauchen gar kein Plugin — siehe Wann eine Nabe erscheint.
  • Der Diagnose-Bildschirm ist hinter allowdebug verriegelt und zeigt ohne diese Einstellung

nichts — siehe Diagnose.

de/wiki/dwe/wkdocore/start.txt · Zuletzt geändert: von 0.0.0.0