Inhaltsverzeichnis

  1. Einführung

  2. Was ist ein Dolibarr-Modul?

  3. Die Kernarchitektur von Dolibarr

  4. Wie Module in die Architektur von Dolibarr passen

  5. Verzeichnis- und Dateistruktur eines typischen Moduls

  6. Die Rolle des Moduldeskriptors

  7. Hooks, Trigger und Events: Erweiterung der Kernfunktionalität

  8. Verwalten von Datenbanktabellen in Modulen

  9. Erstellen von Schnittstellen: Seiten, Formulare, Vorlagen

  10. Integration mit Kernfunktionen (Menüs, Berechtigungen, PDFs)

  11. Best Practices für die Anpassung ohne Kernmodifikation

  12. Häufige Fehler und wie man sie vermeidet

  13. Erweiterte Anpassungsszenarien

  14. Aufrechterhaltung der Kompatibilität zwischen Dolibarr-Versionen

  15. Fazit

  16. Ressourcen und Referenzen für Entwickler


1. Einleitung

Dolibarr ERP & CRM hat sich aufgrund seiner Flexibilität, Skalierbarkeit und Benutzerfreundlichkeit zu einer weit verbreiteten Open-Source-Business-Management-Plattform entwickelt. Was Dolibarr besonders leistungsstark macht, ist seine Modulare architekturDieses Design ermöglicht Entwicklern und Unternehmen, anpassen und erweitern die Software, ohne die Kerndateien zu ändern – und so eine stabile, Upgrade-sichere Umgebung zu gewährleisten.

Dieser Artikel enthält eine tiefer Einblick in die Architektur der Dolibarr-Module, hilft Entwicklern und IT-Experten, die Funktionsweise von Modulen zu verstehen. Egal, ob Sie ein neues Modul von Grund auf neu erstellen oder vorhandene anpassen möchten – dieser Leitfaden vermittelt Ihnen detaillierte Informationen dazu, wie Sie dies effektiv, professionell und gemäß bewährter Methoden tun.


2. Was ist ein Dolibarr-Modul?

A Modulen Dolibarr ist ein eigenständiges Paket, das dem ERP-System neue Funktionen hinzufügt. Dies kann Folgendes umfassen:

  • Erstellen neuer Geschäftsobjekte (z. B. Verträge, Tickets, Zertifizierungen)

  • Hinzufügen neuer Berichte oder Dashboards

  • Integration mit APIs von Drittanbietern

  • Ändern vorhandener Arbeitsabläufe oder Benutzeroberflächen

Module ermöglichen sowohl Front-End (UI) kombiniert mit einem nachhaltigen Materialprofil. Backend (Logik, DB) Änderungen unter Beibehaltung der Kompatibilität mit dem Upgrade-Zyklus von Dolibarr.

Module können sein:

  • Kern Module: Standardmäßig mit Dolibarr geliefert

  • Module von Drittanbietern: Installiert von Dolistore oder individuell entwickelte

  • Benutzerdefinierte/private Module: Für den internen Gebrauch konzipiert, ansässig in /htdocs/custom/


3. Die Kernarchitektur von Dolibarr

Dolibarr basiert hauptsächlich auf PHP und läuft auf einem LAMP- oder LEMP-Stack. Seine Architektur basiert auf:

  • Single-Entry-Architektur: Alle Anfragen werden durch main.inc.php

  • MVC-ähnliche Struktur: Lose modelliert mit Objekten, Controllern, Vorlagen

  • Modulare Ebene: Module werden dynamisch geladen und fügen zur Laufzeit Funktionalität hinzu

  • Berechtigungsbasiertes Sicherheitsmodell

  • Globale Konfiguration über $conf kombiniert mit einem nachhaltigen Materialprofil. $user Objekte

  • Datenbankabstraktionsschicht basiert auf reinem SQL mit Hilfsfunktionen

Jede Komponente von Dolibarr – ob Rechnungen, Kunden oder Produkte – wird mithilfe eines Basisobjektmodell die über Module erweiterbar sind.


4. Wie Module in die Architektur von Dolibarr passen

Module sitzen auf der Kernanwendung und interagieren mit ihr über:

  • Ereignis-Listener (Trigger)

  • Hooks (Plugins auf Schnittstellenebene)

  • Benutzerdefinierte Seiten und Formulare

  • Berechtigungen und Menüergänzungen

  • Datenbanktabellenerweiterungen

  • REST-API-Endpunkte (optional)

Wenn ein Modul aktiviert wird, lädt Dolibarr dynamisch:

  • Seine Menüs

  • Berechtigungen

  • Benutzerdefinierte Konfigurationen

  • Auslöser und Haken

  • Benutzerdefinierte Objekte (Klassen, Vorlagen, Formulare)

Diese Trennung gewährleistet saubere modulare Entwicklung kombiniert mit einem nachhaltigen Materialprofil. Upgrade-sichere Anpassung.


5. Verzeichnis- und Dateistruktur eines typischen Moduls

das Verständnis der Struktur eines Moduls ist für eine ordnungsgemäße Anpassung unerlässlich.

Hier ist eine Aufschlüsselung eines Standardmodulordners in /htdocs/custom/mymodule/:

python

mymodule/ ├── admin/ # Backend config pages ├── class/ # PHP class files (business logic) ├── core/ │ └── triggers/ # System triggers │ └── modules/ # PDF, numbering modules ├── lang/ # Language translation files ├── page/ # Custom user-facing pages ├── sql/ # Install and upgrade SQL scripts ├── tpl/ # Template files for UI ├── modMyModule.class.php # Module descriptor

Jeder Ordner spielt eine bestimmte Rolle bei der Aktivierung der Funktionalität und sorgt gleichzeitig für die Organisation und Wartung des Moduls.


6. Die Rolle des Moduldeskriptors

Das Herzstück jedes Dolibarr-Moduls ist sein Deskriptorklasse, typischerweise benannt modMyModule.class.php.

Diese Datei enthält:

  • Grundlegende Metadaten (Name, Nummer, Version, Beschreibung)

  • Logik aktivieren/deaktivieren

  • Menüdefinitionen

  • Erlaubniserklärungen

  • URLs der Konfigurationsseite

  • Datenbankschemadefinitionen

  • Hooks, Trigger und Cron-Jobs

Beispielausschnitt:

php

class modMyModule extends DolibarrModules { public function __construct($db) { $this->numero = 104100; // Unique ID $this->rights_class = 'mymodule'; $this->family = "projects"; $this->name = "MyModule"; $this->description = "A module to manage certifications."; $this->version = '1.0.0'; $this->const_name = 'MAIN_MODULE_MyModule'; $this->dirs = array("/mymodule/temp"); $this->config_page_url = array("admin_mymodule.php@mymodule"); $this->menu = array(); // Add menus $this->rights = array(); // Add permissions } }

Diese Datei wird ausgeführt, wenn das Modul im Admin-Panel aktiviert wird.


7. Hooks, Trigger und Events: Erweiterung der Kernfunktionalität

Dolibarr bietet zwei Schlüsselmechanismen zur Erweiterung der Kernfunktionalität ohne es zu verändern:

7.1-Trigger

Trigger sind Ereignis-Listener, die während Systemaktionen ausgeführt werden, wie zum Beispiel:

  • Rechnungen erstellen

  • Produkte löschen

  • Bestellungen validieren

Triggerklassen werden platziert in /core/triggers/ und benannt wie interface_99_modMyModule_MyTriggers.class.php.

Sie implementieren die DolibarrTriggers Schnittstelle und a runTrigger() Methode.

Ejemplo:

php

public function runTrigger($action, $object, $user, $langs, $conf) { if ($action == 'BILL_VALIDATE') { // Custom logic when invoice is validated } return 0; }

7.2-Haken

Hooks fügen Logik- oder Schnittstellenelemente in vorhandene Dolibarr-Seiten ein.

  • UI-Hooks: Fügen Sie Schaltflächen, Text oder HTML in Vorlagen ein

  • Logik-Hooks: Erweitern Sie die Logik zum Erstellen, Löschen und Validieren von Objekten

Hook-Klassen implementieren HookInterface und reagieren auf Bereiche wie formObjectOptions, doActions, usw.

Die Initialisierung erfolgt über:

php

$hookmanager->initHooks(array('myarea')); $res = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action);

 

8. Verwalten von Datenbanktabellen in Modulen

Die meisten Module benötigen eine eigene Datenstruktur. Dolibarr ermöglicht Ihnen die Definition und Verwaltung Ihrer eigenen benutzerdefinierte Datenbanktabellen auf saubere, wartungsfreundliche Weise.

8.1 SQL-Installations- und Upgrade-Skripte

Sie definieren Ihr Schema mithilfe von SQL-Dateien in /sql/.

Ejemplo: /sql/mymodule.sql

SQL

CREATE TABLE llx_mymodule_certification ( rowid INT AUTO_INCREMENT PRIMARY KEY, ref VARCHAR(50), label VARCHAR(255), status TINYINT DEFAULT 0, fk_user INT, date_creation DATETIME NOT NULL, tms TIMESTAMP ) ENGINE=InnoDB;

Dolibarr verwendet den Moduldeskriptor, um diese Skripte während der Installation auszuführen.

8.2 Objektorientierte Tabellenzuordnung

Benutzerdefinierte Objekte werden als PHP-Klassen definiert in /class/, typischerweise verlängert CommonObject.

Ejemplo: /class/certification.class.php

php

class Certification extends CommonObject { public $table_element = 'mymodule_certification'; public $element = 'certification'; public $fields = array( 'ref' => array('type' => 'string', 'required' => 1), 'label' => array('type' => 'string'), 'status' => array('type' => 'integer'), ); }

Diese Struktur ermöglicht es Dolibarr, Formulare, Listen und Detailansichten mit minimalem Codierungsaufwand automatisch zu generieren.


9. Schnittstellen erstellen: Seiten, Formulare, Vorlagen

Module beinhalten oft benutzerdefinierte Seiten– entweder Admin-Seiten oder Geschäftsschnittstellen.

9.1 Auslagerungsdateien

Benutzerdefinierte Seiten werden in /page/ und folgen Sie dieser Struktur:

php

require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once '../class/certification.class.php'; llxHeader('', 'My Certifications'); print load_fiche_titre('Certifications Overview'); // Display UI print '<a class="butAction" href="create.php">New Certification</a>'; llxFooter();

9.2 Formularverarbeitung

Verarbeiten Sie Benutzereingaben mit GETPOST() kombiniert mit einem nachhaltigen Materialprofil. checkToken():

php

if ($_POST['action'] == 'add' && checkToken()) { $ref = GETPOST('ref', 'alphanohtml'); $label = GETPOST('label', 'alpha'); $cert = new Certification($db); $cert->ref = $ref; $cert->label = $label; $cert->create($user); }

9.3 Vorlagen (TPL)

Vorlagen werden gespeichert in /tpl/ und verwendet mit include DOL_DOCUMENT_ROOT.'/custom/mymodule/tpl/mypage.tpl.php';.

Dies trennt Logik vom Layout und unterstützt die HTML-Struktur, Klassen und Übersetzungen von Dolibarr.


10. Integration mit Kernfunktionen (Menüs, Berechtigungen, PDFs)

Module können tief in das Ökosystem von Dolibarr integriert werden.

10.1 Menüs hinzufügen

Definiert im Moduldeskriptor mit $this->menu[] Arrays. Jedes Menü kann ein Hauptmenü, ein linkes Menü oder ein Untermenü sein.

php

$this->menu[] = array( 'fk_menu'=>'', 'type'=>'top', 'titre'=>'My Module', 'mainmenu'=>'mymodule', 'leftmenu'=>'', 'url'=>'/mymodule/page/index.php', 'langs'=>'mymodule@mymodule', 'position'=>100, 'enabled'=>'1', 'perms'=>'1' );

10.2 Berechtigungen

Definieren Sie im Moduldeskriptor:

php

$this->rights[] = array( 'id'=>104001, 'desc'=>'Read certifications', 'default'=>1, 'perm'=>'read' );

Der Zugriff wird dann validiert mit:

php

if ($user->rights->mymodule->read) { ... }

10.3 PDF- und Nummerierungsmodule

PDF-Generatoren und Nummerierungsformate können durch die Platzierung benutzerdefinierter Klassen in /core/modules/.

  • PDF-Dokumente: Erweitern ModelePDFXXX

  • Nummerierungsmodule: Erweitern ModelNumXXX

Deklarieren Sie sie im Deskriptor, damit sie im Konfigurationsfenster angezeigt werden.


11. Best Practices für die Anpassung ohne Kernmodifikation

So bleibt Dolibarr wartbar:

  • ✅ Verwendung Haken anstatt Vorlagen zu ändern

  • ✅ Verwendung löst anstatt Objektklassen zu bearbeiten

  • ✅ Platzieren Sie Ihr Modul in /custom/ um das Überschreiben bei Upgrades zu vermeiden

  • ✅ Hinzufügen Versionsprüfung in Ihrem Deskriptor

  • ✅ Verwendung Sprachdateien für alle Schnittstellenzeichenfolgen

  • ✅ Alle Eingaben validieren und alle Ausgaben escapen

  • ✅ Behalten Sie die Geschäftslogik im class/nicht page/

Diese Gewohnheiten gewährleisten Upgrade-Kompatibilität und langfristige Stabilität.


12. Häufige Fehler und wie man sie vermeidet

❌ Bearbeiten von Kerndateien

Die Lösung : Verwenden Sie Overrides, Hooks und Erweiterungen.

❌ Verwenden von direktem SQL anstelle von Objektklassen

Die Lösung : Benutzen fetch(), create(), update() Methoden in Ihren Objektklassen.

❌ Keine Verwaltung von Berechtigungen

Die Lösung : Immer prüfen $user->rights->mymodule->action.

❌ Überspringen der Eingabevalidierung

Die Lösung : Verwenden Sie immer GETPOST() und Escape-SQL-Eingaben.

❌ Hardcoding-Pfade

Die Lösung : Benutzen DOL_URL_ROOT, dol_buildpath() und Konstanten.


13. Erweiterte Anpassungsszenarien

13.1 Unternehmensübergreifende Unterstützung

Wenn Sie das MultiCompany-Modul verwenden, stellen Sie sicher, dass Ihr Modul:

  • Verwendung entity Feld in allen benutzerdefinierten Tabellen

  • Respekt $conf->entity beim Abfragen von Daten

13.2 Geplante Aufgaben mit Cron-Jobs

Fügen Sie Cron-Jobs hinzu, um Hintergrundaufgaben auszuführen:

php

$this->cronjobs[] = array( 'label'=>'Sync Certifications', 'jobtype'=>'method', 'class'=>'CertificationSync', 'method'=>'run', 'parameters'=>'', 'comment'=>'Runs nightly' );

13.3 Benutzerdefinierte REST-Endpunkte

Erstellen Sie benutzerdefinierte APIs, indem Sie Skripte in /custom/mymodule/script/api_*.php und registrieren Sie sie in Ihrem Moduldeskriptor.


14. Aufrechterhaltung der Kompatibilität zwischen Dolibarr-Versionen

  • Testen Sie Ihr Modul mit jeder Dolibarr-Version

  • Nutzen Sie dol_version_compare() um Versionsunterschiede zu handhaben

  • Vermeiden Sie die Verwendung veralteter Funktionen oder globaler Variablen

  • Führen Sie ein Änderungsprotokoll (changelog.txt) und pflegen Sie die semantische Versionierung


15. Fazit

Das Verständnis der Architektur von Dolibarr-Modulen ist für die Erstellung von leistungsstarke, zuverlässige und Upgrade-sichere Anpassungen. Unabhängig davon, ob Sie interne Tools oder kommerzielle Add-Ons erstellen, ist die Beherrschung der folgenden Elemente hilfreich:

  • Modulstruktur und Deskriptordateien

  • Hooks, Trigger und Berechtigungen

  • Benutzerdefinierte Objektklassen und Datenbankschema

  • Admin-Panels und Benutzeroberflächen

  • Integration mit PDF-Generierung, Cron-Jobs und APIs

Dolibarr ist erweiterbar. Je besser Sie die Architektur verstehen, desto mehr Mehrwert können Sie mit Ihren benutzerdefinierten Modulen schaffen – ohne den Kerncode zu verändern.


16. Ressourcen und Referenzen für Entwickler