Ein dbxapp-Modul kapselt eine fachliche Aufgabe. Es erhält Requests über den Modulrouter, liest Daten über DD/dbxDB, verwendet dbxForm und dbxReport und rendert über dbxTPL. Kernel, globale JavaScript-Libs und zentrale UI-Pipelines werden dabei wiederverwendet.
Verhältnis zum verbindlichen Modulhandbuch
Verbindliches Modulhandbuch ist der normative Golden Path und enthält ein vollständiges Referenzmodul. Dieses Kapitel ergänzt Varianten, größere Fachaufteilungen und reale Projektmuster. Bei einem Widerspruch gilt das verbindliche Modulhandbuch zusammen mit den aktuellen Sicherheitsinvarianten.
Modularten
| Art | Beispiel | Aufgabe |
|---|---|---|
| Frontendmodul | dbxContact, dbxShop, dbxWorkflow | öffentliche oder benutzerbezogene Funktionen |
| Adminmodul | dbxContact_admin, dbxShop_admin | geschützte Verwaltung und Reports |
| Infrastrukturmodul | dbxContent, dbxKi | CMS-, API- oder Systemdienste |
| Einbettbares Modul | grundsätzlich jedes geeignete Modul | Aufruf aus CMS/Templates über [modul=...] |
Frontend und Administration können getrennt werden. Das hält Rechte, Design, Routen und fachliche Oberfläche übersichtlich.
Vollständige Struktur
Nicht jedes Modul braucht alle Ordner. Ein reines Ausgabemodul kann ohne DD und FD auskommen; ein API-Modul benötigt möglicherweise keine HTML-Templates. Die Trennung von Router, Service und Template bleibt trotzdem sinnvoll.
Konfiguration
cfg/config.php legt Aktivierung und Gruppen fest:
Für ein Adminmodul:
Lesen erfolgt über die zentrale Konfiguration:
Keine zweite JSON-/ENV-Konfiguration für dieselben Werte anlegen.
Router: klein und eindeutig
Datei myTasks.class.php:
Der Router entscheidet nur, welche Fachmethode läuft. Datenbankabfragen, Formaufbau und lange HTML-Fragmente gehören nicht in den Switch.
Reale Routermuster:
- dbx/modules/dbxContact/dbxContact.class.php: kleiner Frontendrouter.
- dbx/modules/dbxWorkflow/dbxWorkflow.class.php: Start, Run und Overview.
- dbx/modules/dbxShop/dbxShop.class.php: umfangreicher Fachrouter.
- dbx/modules/dbxWorkflow_admin/dbxWorkflow_admin.class.php: delegierender Adminwrapper.
Service-Grundgerüst
Datei include/myTasksService.class.php:
Die Serviceklasse darf bei großen Fachbereichen weiter aufgeteilt werden, beispielsweise in Repository, Service, Provideradapter oder Renderer. Der Shop verwendet genau diese Aufteilung.
Datenmodell
Eine neue persistente Tabelle erhält eine vollständige DD:
Die DD folgt dem direkt lesbaren dbxapp-Exportformat: TABLE, FIELDS und INDEXES werden mit $table[...], $field[...], $fields[]=$field, $index[...] und $indexes[]=$index explizit definiert. Eine lokale $addField-Closure oder DD-Includes sind dafür nicht zulässig.
Formularsichten und Reportfilter liegen separat:
Das vollständige DD-/FD-Muster steht unter dbxDB, dbxDD und FD.
Formularmethode
Weitere Möglichkeiten wie einzelne Felder, Callbacks, Shells und eingebettete Reports stehen unter dbxForm.
Reportmethode
Multi-Auswahl, Aktionen, HTML-Felder und TPL/Grid-Modus sind unter dbxReport beschrieben.
Templates statt PHP-HTML
Mögliche Templatearten:
- Seiten-/Paneltemplate für eine einzelne Ausgabe.
- Formtemplate mit [dbx:form] und {obj:*}.
- Reporttemplate mit dbx_split und [rpt:row].
- Row-/Cardtemplate für _mode = 'tpl'.
- Mail-, PDF- oder Drucktemplate innerhalb der dafür vorgesehenen Pipeline.
Templates können sprachabhängig als name_de.htm, name_en.htm usw. vorliegen. dbxTPL verwendet die aktive Sprachvariante und anschließend den neutralen Fallback.
Aufrufmöglichkeiten
Direkter Modulrequest
CMS- oder Template-Inclusion
Mehrere Instanzen auf derselben Seite
Form- und Reporttemplates verwenden {i} in IDs und Targets. Dadurch bleiben Parameter-, AJAX- und UI-Zustände der Instanzen getrennt.
Request-Werte
Der dritte Parameter ist die Validatorregel. Werte nicht direkt aus $_GET oder $_POST in SQL, Templates oder Dateipfade übernehmen. dbxForm besitzt für seine Felder eine eigene Requestpipeline; der Router liest nur Routenparameter.
AJAX, openWin und Confirm
Vorhandene JavaScript-Libs werden deklarativ über Klassen/Datenattribute angebunden:
Kein zweites Modal-, AJAX- oder Confirm-System im Modul einbauen.
dbx_ajax=1 wird nicht manuell an normale Links angehängt. Nur ajax.js setzt den Ajax-Kontext für den von ihm ausgeführten Request. Ein Link, der eine vollständige CMS- oder Adminseite öffnen soll, bleibt ohne dbx_ajax.
Wenn eine Aktion erst bestätigt und danach in einem Fenster geladen werden soll, dürfen Confirm- und openWin-Handler nicht gleichzeitig denselben Klick verarbeiten. Entweder übernimmt confirm.js die deklarative Fortsetzung oder der Modulhandler wartet programmatisch auf dbx.confirm.open() und ruft erst bei action === "yes" den Ajax-/openWin-Schritt auf.
JSON-API als eigene Route
API und HTML sind getrennte Antwortarten. Ein API-Endpunkt rendert kein Formtemplate und eine normale AJAX-Formaktion liefert in der Regel HTML für ihr Target. Rechte gelten für beide Wege identisch.
Frontend- und Adminmodul trennen
Empfohlen bei größeren Anwendungen:
Gemeinsame Fachlogik kann über klar benannte Klassen des Fachmoduls genutzt werden. Das Adminmodul darf aber nicht die Rechteprüfung des Fachmoduls umgehen. Ein gutes reales Muster sind dbxShop und dbxShop_admin.
Installation und Schema
Ein Installationspfad synchronisiert nur die DDs seines Moduls:
Installation ist eine Adminaktion. Sie läuft nicht bei jedem normalen Request.
Assets und Skin-Fähigkeit
Modulspezifisches CSS und JavaScript liegen unter design/css bzw. design/js. CSS verwendet die vom aktiven Design bereitgestellten Variablen und Komponenten. Farben, Abstände oder Hintergründe nicht so fest verdrahten, dass dbxapp, flowers oder weitere Skins unlesbar werden.
JavaScript erweitert die vorhandenen Libs und initialisiert sich wiederholbar, auch nachdem AJAX neuen HTML-Inhalt eingesetzt hat.
Empfohlene Reihenfolge für ein neues Modul
- Fachzweck, Benutzergruppen und Routen festlegen.
- Ähnliches vorhandenes Modul lesen.
- DD und gegebenenfalls FD modellieren.
- Templates und eindeutige Targets anlegen.
- Kleinen Router und Fachservice implementieren.
- dbxForm für Eingaben und dbxReport für Listen verwenden.
- Adminzugriff und Installation separat schützen.
- Direkten Request und [modul=...]-Einbettung testen.
- AJAX, openWin, Confirm, Mehrfachinstanzen und aktive Skins testen.
- Doxygen und Modul-README aktualisieren.
Der aktuelle dbxWizard kann ein neues Modul oder Ergänzungen für ein vorhandenes Modul erzeugen. Er validiert Modul- und Dateinamen, beschränkt alle Ziele auf dbx/modules/{modul}/, kann DD/FD, Router, Service, Formular, Report und Templates generieren und legt vor Überschreibungen Sicherungen unter files/module-backup/ an. Nach der Erzeugung werden PHP-Syntax und die Route mit dbx/modules/dbxAdmin/tests/dbxWizard_generation_test.php geprüft.
Verbindliche Regeln
- Modulcode bleibt unter dbx/modules/{modul}/.
- Router klein halten; Fachlogik in Include-/Serviceklassen.
- Datenzugriff über dbxDB und DD, Eingaben über dbxForm, Listen über dbxReport.
- Ausgabe über dbxTPL; keine großen HTML-Strings in PHP.
- Konfiguration über cfg/config.php und dbx()->get_config().
- Request-Werte mit get_modul_var() oder dbxForm validieren.
- Bestehende AJAX-, openWin-, Confirm- und Core-Libs verwenden.
- Keine privaten db()-, tpl()- oder Escape-Aliase anlegen, die nur vorhandene dbx()-Methoden weiterreichen.
- Automatische DD-Systemfelder nicht im Modul nachbauen.
- Frontend, Admin, API und Installation haben jeweils klare Rechte und Antwortarten.
- Mehrfachinstanzen verwenden {i} und getrennte Targets.
- Moduloberflächen bleiben responsive und skin-fähig.
- Reine GET-Navigation bleibt tokenlos. Schreibende GET-Aktionen verwenden den vorhandenen Action-Token zusätzlich zu Modul- und DD-Rechten.
Reale Referenzen
- dbx/modules/dbxAdmin/include/dbxWizard.class.php: aktueller Generator für Router, Service, DD, FD, Form und Report.
- dbx/modules/dbxContact: kompaktes Frontend-/Adminmuster.
- dbx/modules/dbxWorkflow: deklarativer Fachablauf mit eigener Engine.
- dbx/modules/dbxShop und dbxShop_admin: große Anwendung mit Repository, Service, Providern, Frontend und Administration.
- Verbindliches Modulhandbuch — vollständiger und normativer Golden Path.
- dbxDB, dbxDD und FD, dbxForm und dbxReport.