Thin Custom-PHP Adapter solcom_editorial für State-abhängige Form-Sichtbarkeit
solcom_editorial aufgeweicht. Das Modul enthält ausschließlich hook_form_alter und versteckt Scheduler-Felder (publish_state, unpublish_state, publish_on, unpublish_on) je nach Moderation-State und User-Permission. Eine reine Drupal-Config-Lösung deckt diese State-abhängige UI-Logik nicht ab.
Kontext
Das PRD Publishing Workflows Konfiguration (2026-05-13) hält fest: „Alle vier Implementierungsmodule sind reine Drupal-Konfiguration (YAML). Kein Custom-PHP, keine Modul-Entwicklung." Im Zuge der Umsetzung sind zwei UI-Anforderungen aufgetaucht, die diese Vorgabe brechen würden, wenn man sie wörtlich nimmt:
- Moderation-State-Dropdown zeigt unzulässige Zielzustände. Der Scheduler-Felder
publish_stateundunpublish_statelistet per default alle Workflow-States, auch solche, in die der aktuelle User aus dem aktuellen State nicht transitionieren darf. Das ist verwirrend und führt zu Validation-Errors beim Speichern. - Scheduler-Datumsfeld
publish_on/unpublish_onnur für berechtigte Rollen. PRD §Modul 3: „Das Scheduler-Datumsfeld wird nur für Rollen mit Publish-Berechtigung angezeigt —content_editorsieht es nicht." Drupal kennt dafür keine native Permission-pro-Field-Lösung im Standard-Form-Display. Dasfield_permissions-Contrib-Modul wäre die Alternative, würde aber ein zusätzliches Modul mit größerem Footprint einführen.
Beide Punkte sind Spec-Anforderungen, nicht Goldplating. Eine pure Config-Lösung existiert nicht.
Entscheidung
Wir bauen ein Custom-Modul web/modules/custom/solcom_editorial/ mit genau einem Hook (hook_form_alter) und einer Helper-Funktion. Das Modul:
- Versteckt
publish_onundunpublish_onfür User ohne Permissionschedule publishing of nodes. - Versteckt
publish_stateundunpublish_state, wenn der aktuelle User von der aktuellen Moderation-State aus keine gültige Transition zu einem Published-State hat (geprüft viacontent_moderation.state_transition_validation). - Nutzt ausschließlich öffentliche Drupal-APIs (
ModerationInformationInterface,StateTransitionValidationInterface) — keine privaten Contrib-Funktionen. - Hat
core_version_requirement: ^10 || ^11für Portabilität.
Die PRD-Vorgabe „kein Custom-PHP" wird damit zu „kein Custom-PHP außer einem dünnen Form-Adapter" abgeschwächt. Begründung: Die Spec selbst (PRD §Modul 3) verlangt Permission-gesteuertes Form-Verhalten, das in Drupal ohne Custom-PHP nicht zu erreichen ist.
Rejected alternatives
- Keine UI-Adaption, alle Felder immer sichtbar. Spec-konform für „kein Custom-PHP", aber widerspricht der gleichen Spec in §Modul 3 (Datumsfeld-Sichtbarkeit) — interner Spec-Konflikt, der Verlierer wäre die UX.
- Contrib-Modul
field_permissionseinsetzen. Würde Field-Permissions pro Rolle ermöglichen, deckt aber den State-abhängigen Dropdown-Filter nicht ab — also wäre Custom-PHP weiterhin nötig für den zweiten Use-Case. Außerdem zusätzliche Modul-Dependency mit eigener Config-Surface. - Separates Form-Display je Rolle. Drupal unterstützt das nicht nativ; man müsste über View-Modes und Role-basierte Form-Mode-Auswahl gehen, was wiederum Custom-PHP erfordern würde. Mehr Komplexität, kein UI-Gewinn.
Consequences
- Die PRD-Vorgabe „rein YAML" ist nicht mehr wortwörtlich gültig — sie bleibt Leitlinie, der dünne Adapter ist die dokumentierte Ausnahme.
- Das Modul ist getestet (Kernel-Test für Transition-Validierung, Functional-Test für Permission-gesteuertes Hiding) — siehe
web/modules/custom/solcom_editorial/tests/. - Erweiterungen am Editorial-UI (z. B. Inline-Status-Anzeige im Node-Header) sind nicht automatisch durch dieses ADR gedeckt — jede weitere Custom-PHP-Logik braucht eine eigene Begründung.
- Bei einer Drupal-Major-Migration (z. B. auf 12) muss
core_version_requirementangepasst und das Modul gegen die neue API geprüft werden.