SuperAPI AI Directory

dolibarr-development

Coding & development

View repository

Updated 10-15 22:41

About this skill

Dolibarr Developer Skill

When to Use

  • Creating or extending a Dolibarr module (custom or external)
  • Implementing hooks (actions_mymodule.class.php) or triggers
  • Writing DAO/business object classes, SQL table definitions
  • Adding menus, tabs, permissions, boxes, exports, CSS/JS
  • Building cron/command-line scripts
  • Writing PDF/ODT document templates
  • Following Dolibarr coding rules (PHP, SQL, HTML norms)

Key Concepts

Architecture

  • MVC pattern: Controller (/* Actions */) + View (/* View */) in same PHP file
  • Active Record ORM: one class per table with CRUD methods
  • Global objects: $db, $user, $conf, $langs, $mysoc, $hookmanager, $extrafields
  • Module location: external modules live in htdocs/custom/mymodule/
  • Table prefix: all tables prefixed llx_

Module Entry Points

Extension point When to use
Hooks Inject/replace code in existing pages without modifying core
Triggers React to business events (invoice created, order validated…)
Tabs Add tabs on thirdparty, order, product, invoice… sheets
Menus Add top-level or left-menu entries
Boxes Add widgets on home page
Extrafields Add fields to existing objects (no module needed for simple cases)
PDF templates Customize generated PDF documents

Step-by-Step: Build a Module

1. Generate Skeleton

Use the built-in Module Builder (enable it in Setup → Modules, then click the bug icon top-right). It generates modMyModule.class.php, SQL files, DAO class, and page skeletons.

GitHub template: https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template

2. Module Descriptor (required)

File: htdocs/custom/mymodule/core/modules/modMyModule.class.php

See → Module Structure reference

3. SQL Tables (optional)

  • Files in mymodule/sql/llx_mytable.sql + llx_mytable.key.sql
  • Load via $this->_load_tables('/mymodule/sql/') in init()
  • Primary key always rowid INTEGER AUTO_INCREMENT PRIMARY KEY
  • Table prefix llx_, InnoDB engine, no DB triggers, no DELETE CASCADE

See → Coding Rules reference

4. DAO Class (optional)

File: mymodule/class/myobject.class.php

  • Copy from htdocs/modulebuilder/templates/class/myobject.class.php
  • Methods: create(), fetch(), update(), delete(), fetchAll()
  • DB access pattern: $db->begin() / $db->query() / $db->commit() or $db->rollback()

5. Hooks (optional)

  • Declare context in modMyModule.class.php: $this->module_parts = array('hooks' => array('thirdpartycard', 'orderlist'))
  • Create mymodule/class/actions_mymodule.class.php with hook methods
  • Disable + re-enable module after changing contexts (stored in DB)
  • Find contexts: search initHooks( in source. Find hook names: search executeHooks( in source.

See → Hooks & Triggers reference

6. Menus (optional)

Declare in $this->menu array in module descriptor.

  • fk_menu=0 + type='top' for top menu
  • fk_menu='fk_mainmenu=xxx' + type='left' for left sub-menu
  • perms field controls visibility by permission
  • user=0 internal, 1 external, 2 both

7. Tabs (optional)

Declare in $this->tabs array: 'objecttype:+tabcode:Title:langfile@mymodule:condition:/mymodule/page.php?id=__ID__'

Object types: thirdparty, order, invoice, product, contact, contract, propal, member, user…

8. Permissions (optional)

Declare in $this->rights array. Test with $user->rights->mymodule->action->subaction.

9. PHP Pages (optional)

  • Bootstrap: include main.inc.php (try multiple relative paths, see template)
  • Use dol_include_once('/mymodule/class/myclass.class.php', 'MyClass') for module classes
  • Use require_once DOL_DOCUMENT_ROOT.'/core/...' for Dolibarr core classes
  • CSS classes: liste_titre, pair/impair, flat, button
  • JS: pass $morejs array to llxHeader()

10. Setup Page (optional)

  • Create mymodule/admin/setup.php
  • Set $this->config_page_url = array("setup.php@mymodule") in descriptor

Packaging & Distribution


References

Official Docs