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.
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
wkdocoredavon 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.
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.
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.
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 |
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 | — |
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.
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:
- Projektbezogene Übersteuerung — gewinnt immer, auch über ein fehlendes Paket. Grund:
reserved - Paket meldet sich als nicht verfügbar — schaltet ab, gleich was die Vorgabe sagt. Grund:
plugin-missing - Wiki-weite Vorgabe aus
disabledhubs— Grund:defaultbzw.suite-disabled - 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.
fallbacknav und die Leiste erscheint oberhalb des Inhalts.
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.
* @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).
$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
- Core Plugin — die Dienstregistratur, an der die fünf
dwdo.*-Dienste hängen - DevOps Storage Plugin — die Datenhaltung samt
dwdo_projectsund ihren Fremdschlüsseln - Azure DevOps Connector — die Verbindung zu Azure DevOps
- Boards, Dashboard, Pipelines, Queries, Work Items — die Pakete hinter den vier paketgebundenen Naben
- wkfluentui — die Schale, in deren rechte Rail die Nabenleiste zeichnet
- wkdoadogit — die Repository-Quelle, die die eingebundenen Git-Repositories in den Explorer einträgt
- Projekte und Quelltext — dieselben Bausteine aus Sicht der Lesenden, mit den Anleitungen
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
- Die Rollenleiter zählt 0/10/20/30/40, nicht 0/1/2/3/4 — siehe Rollen.
- Es gibt acht Naben, nicht sieben —
hub.dashboardfehlte — siehe Naben-Navigation. - Vier der acht Naben brauchen gar kein Plugin — siehe Wann eine Nabe erscheint.
- Der Diagnose-Bildschirm ist hinter
allowdebugverriegelt und zeigt ohne diese Einstellung
nichts — siehe Diagnose.