Difference between revisions of "Développement module"

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
 
(129 intermediate revisions by 19 users not shown)
Line 1: Line 1:
 +
<!-- BEGIN interlang links -->
 +
<!-- Do NOT edit this section
 +
    Links below are automatically managed by PolyglotBot
 +
    You can edit links on the English source page : Module_development -->
 +
[[en:Module_development]]
 +
[[es:Desarrollo_de_un_módulo]]
 +
[[de:Modul_Entwicklung]]
 +
[[zh:模块开发]]
 +
<!-- END interlang links -->
 +
 
[[Category:Noyau]]
 
[[Category:Noyau]]
 
{{TemplateDocDev}}
 
{{TemplateDocDev}}
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d'elle afin d'ajouter un module permettant d'étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:
+
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d'elles afin d'ajouter un module permettant d'étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:
* Ajouter de nouvelles tables en base
+
 
* Ajouter vos propres entrées dans les menus
+
*Ajouter de nouvelles tables en base
* Ajouter des écrans de saisie/consultation de nouvelle tables
+
*Ajouter vos propres entrées dans les menus
* Ajouter ou suppimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, évenement, ...)
+
*Ajouter des écrans de saisie/consultation de nouvelle tables
* Ajouter des exports prédéfinis pour la fonction export
+
*Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)
* Ajouter de nouvelles boites pour la home page
+
*Ajouter des exports prédéfinis pour la fonction export
* Définir de nouvelles permissions
+
*Ajouter de nouvelles boites pour la home page
* Déclencher du code automatiquement sur une action Dolibarr particulière
+
*Ajouter des variables de substitution
 +
*Définir de nouvelles permissions
 +
*Déclencher du code automatiquement sur une action Dolibarr particulière
 +
*Insérer votre code aux emplacements hooks de Dolibarr
 +
*Ajouter un module de numérotation
 +
*Ajouter un modèle de document
 +
*Ajouter un nouveau thème
 +
 
 
etc...
 
etc...
Toutes ces opérations ne sont possibles qu'avec la version 2.4 ou plus de Dolibarr.
 
  
Les chapitres suivant vous présentent comment réaliser tout cela en manuel de manière simple. Pour les développeurs très expérimentés, une méthode par génération MDA est en cours de mise au point. Voir le dernier chapitre pour cela.
+
Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.
  
 +
=[[File:Art.png]] Création de Module avec le générateur de module=
 +
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le "Générateur de module" (aussi appelé "Module Builder"). Pour l'activer :
  
= [[File:Art.png]] Créer un descripteur de Module (obligatoire) =
+
*Activez le module "Générateur de Module" dans la section "Outils multi-modules"
'''Quand''': Obligatoire dès qu'une extension est développée, quelque soit sa vocation.
 
  
== Créer votre descripteur ==
+
[[File:Mod_builder_2.png|400px]]
La première étape est donc de créer un fichier descripteur du module.
 
Pour cela, aller dans le répertoire '''dev/skeletons''' et recopier le fichier modMyModule.class.php dans le répertoire
 
'''htdocs/includes/modules'''.
 
Ensuite, modifier le contenu de ce fichier afin de remplacer:
 
* les ''modMyModule'' en une valeur qui corresponde a la vocation de votre module. Cette valeur doit toujours commencer par 'mod'.
 
ATTENTION: Le MyModule doit être une série de caractère, et les seuls caractères permis sont [A-Za-z_] et la longueur maximum de MyModule est de 12 caractères.
 
* $this->numero = ''10000'' par un numero de module libre (Aller dans la page '''Accueil -> Infos système -> Dolibarr -> Modules''' pour connaitre la liste des id module deja utilises).
 
* Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).
 
  
* Créer le répertoire /htdocs/monmodule/
+
*puis cliquez sur l’icône "bug" qui est apparue dans la barre de menu en haut à droite
  
Votre fichier descripteur de votre module est alors en place.
+
[[File:Mod_builder_3.png|400px]]
  
== Tester votre descripteur ==
+
=[[File:Art.png]] Exemple de modèle de module externe=
 +
Un bon modéle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]
  
Lancer Dolibarr et aller sur la page '''Configuration->module''', vous devez voir apparaitre une nouvelle ligne avec votre nouveau module et la possibilité de l'activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu'à le retrouver).
+
=[[File:Art.png]] Créer un module=
 +
Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.
 +
 
 +
==Créer un descripteur de Module (obligatoire)==
 +
'''Quand''' : Obligatoire dès qu'une extension est développée, quelle que soit sa vocation (sauf pour l'ajout de thèmes ou de modèles de documents).
 +
'''Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le "Générateur de module"'''
 +
 
 +
===Créer votre descripteur avec le générateur de module===
 +
 
 +
*Lancez le générateur de module en cliquant sur l’icône "bug"
 +
 
 +
[[File:Mod_builder_3.png|400px]]
 +
 
 +
*Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _)
 +
 
 +
[[File:Mod_builder_4.png|400px]]
 +
 
 +
*Vous pourrez alors modifier les paramètres du descriptif du module :
 +
 
 +
[[File:Mod_builder_5.png|400px]]
 +
 
 +
===Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)===
 +
La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:
 +
 
 +
*Créez le répertoire '''/htdocs/''monmodule''/core/modules'''. Puis, allez dans le répertoire '''dev/skeletons''' et recopiez le fichier modMyModule.class.php dans ce répertoire '''htdocs/''monmodule''/core/modules'''.
 +
*Renommez le fichier mod'''MyModule'''.class.php en modifiant seulement la partie '''MyModule''' (le fichier doit commencer par mod)
 +
 
 +
Ensuite, modifiez le contenu de ce fichier afin de remplacer :
 +
 
 +
*les ''modMyModule'' en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par '<nowiki/>'''mod'''' et ne contenir que des '''caractères alphabétiques'''.
 +
*$this->numero = ''100000'' par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : [[List of modules id|Liste des id de modules]].
 +
*Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).
 +
 
 +
Le descripteur de votre module est alors en place.
 +
 
 +
===Tester votre descripteur===
 +
 
 +
Lancez Dolibarr et allez sur la page '''Configuration->module''', vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l'activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu'à le retrouver).
 
C'est la valeur de $this->special qui détermine dans quel onglet se trouve votre module.
 
C'est la valeur de $this->special qui détermine dans quel onglet se trouve votre module.
  
= [[File:Art.png]] Arborescence d'un nouveau module =
+
===Nom de module===
Créer un répertoire 'monmodule' qui recevra les fichiers du module. Ce répertoire doit etre dans le répertoire '''htdocs''' et contiendra les sous-répertoires suivants (seul la premiere ligne est obligatoire):
+
 
 +
Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _
 +
 
 +
==Arborescence d'un nouveau module==
 +
Voici l'arborescence à respecter pour l'organisation des fichiers d'un module.
  
* htdocs/includes/modules/ contains module descriptor file modMyModule.class.php
+
Rem: Seule la deuxième ligne est obligatoire.
* htdocs/mymodule/admin/ contains pages to setup module
+
{{TemplateModuleTreeSimple}}
* htdocs/mymodule/class/ contains PHP class files provided by module
 
* htdocs/mymodule/css contains CSS files provided by module
 
* htdocs/mymodule/img contains images files provided by module
 
* htdocs/mymodule/includes/triggers contains triggers provided by module
 
* htdocs/mymodule/langs/en_US contains language files for module internationalisation
 
* htdocs/mymodule/lib contains libraries provided and used by module
 
* htdocs/mymodule/sql contains SQL file provided by module to add new tables or indexes
 
* htdocs/mymodule/themes/mytheme if module provide its own skin
 
  
 +
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]
  
Note: Depuis la 3.1 il est possible de définir dans htdocs/conf/conf.php les variables $dolibarr_main_url_root_alt et $dolibarr_main_document_root_alt qui seront accessible partout dans le code via DOL_DOCUMENT_ROOT_ALT et DOL_MAIN_URL_ROOT_ALT
+
==Créer vos tables SQL et les classes PHP DAO (optionnel)==
 +
'''Quand''': Si votre module a besoin de gérer des données qui lui sont propres
  
Cela permet d'avoir son module et tout les fichier associer comme suit,  
+
===Créer vos fichiers .sql===
si par exemple
+
Si votre module a vocation à gérer des données bien à lui, qui n'existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.
$dolibarr_main_url_root_alt='http://(domainName)/dolibarr/htdocs/custom';
 
$dolibarr_main_document_root_alt='(chemin absolue c:/... ou /var/www/...)/dolibarr/htdocs/custom';
 
  
* htdocs/custom/includes/modules/ contains module descriptor file modMyModule.class.php
+
Créer un sous-répertoire '''sql''' dans le répertoire de votre module (par exemple '''htdocs/monmodule/sql''') afin d'y placer les scripts sql que vous allez créer.
* htdocs/custom/mymodule/admin/ contains pages to setup module
 
* htdocs/custom/mymodule/class/ contains PHP class files provided by module
 
* htdocs/custom/mymodule/css contains CSS files provided by module
 
* htdocs/custom/mymodule/img contains images files provided by module
 
* htdocs/custom/mymodule/includes/triggers contains triggers provided by module
 
* htdocs/custom/mymodule/langs/en_US contains language files for module internationalisation
 
* htdocs/custom/mymodule/lib contains libraries provided and used by module
 
* htdocs/custom/mymodule/sql contains SQL file provided by module to add new tables or indexes
 
* htdocs/custom/mymodule/themes/mytheme if module provide its own skin
 
  
= [[File:Art.png]] Créer vos tables SQL et les classes PHP DAO (optionnel) =
+
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction '''init''' que la ligne
'''Quand''': Si votre module a besoin de gérer des données qui lui sont propres
 
  
== Créer vos fichiers .sql ==
+
<source lang="php">$this->_load_tables('/mymodule/sql/');</source>
Si votre module a vocation à gérer des données bien a lui, qui n'existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.
 
  
Créer un sous-répertoire '''sql''' dans le repertoire de votre module (par exemple '''htdocs/monmodule/sql''') afin d'y placer les scripts sql que vous aller créer.
+
n'est pas commentée.
  
 
''Règles à respecter:''
 
''Règles à respecter:''
* Ajouter les fichiers d'ordre de création de vos tables sur le principe d'un fichier '''llx_matable.sql''' par table accompagné éventuellement du fichier '''llx_matable.key.sql''' (voir les fichiers existants dans '''includes/mysql/tables''' pour exemple).
+
 
* Pour ce qui est des ordres de gestion des données, ils doivent tous se trouver dans un fichier nommé '''data.sql''' situé dans le même répertoire '''/monmodule/sql/'''.
+
*Ajoutez les fichiers d'ordre de création de vos tables sur le principe d'un fichier '''llx_matable.sql''' par table accompagné éventuellement du fichier '''llx_matable.key.sql''' (voir les fichiers existants dans '''install/mysql/tables''' pour exemple).
 +
*Les types et noms recommandés pour les champs SQL sont définis sur la page [[https://wiki.dolibarr.org/index.php/Langages_et_normes#R.C3.A8gles_de_codage_SQL]].
 +
*Pour ce qui est des commandes permettant d'ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé '''data.sql''' situé dans le même répertoire '''/monmodule/sql/'''.
 +
*N'utilisez pas "chaine" mais 'chaine' car les guillemets doubles (") ont une signification particulière en PostGreSQL
 +
 
 
Exemple de contenu de fichier data.sql
 
Exemple de contenu de fichier data.sql
 
<source lang="sql">
 
<source lang="sql">
  delete from llx_const where name='MYMODULE_IT_WORKS' and entity='__ENTITY__';
+
  delete from llx_const where name='MONMODULE_IT_WORKS' and entity='__ENTITY__';
  insert into llx_const (name, value, type, note, visible, entity) values ('MYMODULE_IT_WORKS','1','chaine','A constant vor my module',1,'__ENTITY__');
+
  insert into llx_const (name, value, type, note, visible, entity) values ('MONMODULE_IT_WORKS','1','chaine','A constant for my module',1,'__ENTITY__');
 
</source>
 
</source>
  
 
Les ordres SQL des fichiers doivent être opérationnels pour la base de données '''mysql'''.
 
Les ordres SQL des fichiers doivent être opérationnels pour la base de données '''mysql'''.
Rem: Les fichiers des autres bases ne sont pas à maintenir. Ils sont lus et convertit à la volée par le driver de la base de données.
+
Rem: Les fichiers des autres bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.
  
== Tester vos fichier .sql ==
+
===Tester vos fichiers .sql===
  
 
Une fois les fichiers prêts, vous pouvez retourner sous Dolibarr puis désactiver le module, dropper les tables en base et réactiver le module.
 
Une fois les fichiers prêts, vous pouvez retourner sous Dolibarr puis désactiver le module, dropper les tables en base et réactiver le module.
Line 97: Line 133:
 
Si tel n'est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.
 
Si tel n'est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.
  
== Générer la classe PHP DAO d'accès aux tables ==
+
===Générer la classe PHP DAO d'accès aux tables===
  
Une fois votre ou vos tables créées en base, aller dans le répertoire '''dev/skeletons''', copiez le fichier '''build_class_from_table.php''' dans le répertoire sql/ de votre module, et lancez le script
+
Une fois votre ou vos tables créées en base, allez dans le répertoire '''dev/skeletons''', copiez le fichier '''build_class_from_table.php''' dans le répertoire sql/ de votre module, et lancez le script
 
<source lang="bash">php build_class_from_table.php nomtable</source>
 
<source lang="bash">php build_class_from_table.php nomtable</source>
Remarque: Si la commande ne fonctionne pas, essayer d'utiliser php-cli plutot que php.
+
Remarque : Si la commande ne fonctionne pas, essayez d'utiliser php-cli plutot que php.
  
 
Ceci génèrera un fichier '''out.nomtable.class.php''' qui contient la classe de gestion de la table nomtable.
 
Ceci génèrera un fichier '''out.nomtable.class.php''' qui contient la classe de gestion de la table nomtable.
Line 109: Line 145:
 
Un fichier '''out.nomtable_script.php''' a également été généré et contient un exemple de code pour utiliser la classe pour chacune des 4 méthodes CRUD.
 
Un fichier '''out.nomtable_script.php''' a également été généré et contient un exemple de code pour utiliser la classe pour chacune des 4 méthodes CRUD.
  
= [[File:Art.png]] Affichage des onglets (optionnel) =
+
==Affichage des onglets (optionnel)==
  
== Ajouter ou supprimer des onglets sur les fiches objets ==
+
===Ajouter ou supprimer des onglets sur les fiches objets===
 
'''Quand''' : Pour ajouter votre propre onglet parmi les onglets standard d'une fiche entité (facture, commande, proposition commercial, adhérent...)
 
'''Quand''' : Pour ajouter votre propre onglet parmi les onglets standard d'une fiche entité (facture, commande, proposition commercial, adhérent...)
  
Pour cela, aller dans le fichier descripteur de module précédemment créé et modifier le tableau $this->tabs:
+
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this->tabs:
 
<source lang="php">
 
<source lang="php">
 
// Array to add new pages in new tabs or remove existing one
 
// Array to add new pages in new tabs or remove existing one
$this->tabs = array('objecttype:+tabname1:Title1:@mymodule:/mymodule/mynewtab1.php?id=__ID__'// To add a new tab identified by code tabname1
+
$this->tabs = array('objecttype:+tabname1:Title1:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab1.php?id=__ID__'   // To add a new tab identified by code tabname1
                             'objecttype:+tabname2:Title2:@mymodule:/mymodule/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2
+
                             'objecttype:+tabname2:Title2:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab2.php?id=__ID__',   // To add a new tab identified by code tabname2
 
                             'objecttype:-tabname');                                                    // To remove an existing tab identified by code tabname
 
                             'objecttype:-tabname');                                                    // To remove an existing tab identified by code tabname
 
</source>
 
</source>
  
 
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.
 
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.
Le format de la chaîne étant composée de 5 parties séparées par ":"
+
Le format de la chaîne étant composé de 6 parties séparées par ":"
* Partie 1: Le type d'élément (objecttype) dans lequel doit apparaître l'onglet qui est une valeur parmi celle-ci:
+
 
** 'thirdparty' to add a tab in third party view
+
*Partie 1 : le type d'élément (objecttype) dans lequel doit apparaître l'onglet qui est une valeur parmi celle-ci:
** 'intervention' to add a tab in intervention view
+
{{TemplateModuleTabs-fr}}
** 'order_supplier' to add a tab in supplier order view
+
 
** 'invoice_supplier' to add a tab in supplier invoice view
+
*Partie 2 : nom de code pour l'onglet à ajouter (commence par +) ou à enlever (commence par -)
** 'invoice' to add a tab in customer invoice view
+
*Partie 3 : le titre de l'onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.
** 'order' to add a tab in customer order view
+
*Partie 4 : le nom du fichier .lang (sans l'extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c'est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang
** 'product' to add a tab in product view
+
*Partie 5 : une condition à tester pour savoir si l'onglet doit être visible ou pas. Mettre '1' pour qu'il soit toujours visible.
** 'stock' to add a tab in stock view
+
*Partie 6 : l'url de la page à afficher quand on clique sur l'onglet. La chaine __ID__ sera remplacée automatiquement par l'Id de l'entité concernée.
** 'propal' to add a tab in propal view
+
 
** 'member' to add a tab in fundation member view
+
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.
** 'contract' to add a tab in contract view
 
** 'user' to add a tab in user view
 
** 'group' to add a tab in group view
 
** 'contact' to add a tab in contact view
 
** 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member)
 
* Partie 2: Nom de code pour l'onglet à ajouter (commence par +) ou à enlever (commence par -)
 
* Partie 3: Le titre de l'onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.
 
* Partie 4: Le nom du fichier .lang (sans l'extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est précédé de @, Dolibarr cherche le fichier dansle répertoire lang propre au module, c'est à dire htdocs/mymodule/langs/code_CODE/mymodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mymodyle.lang
 
* Partie 5: L'url de la page à afficher quand on clique sur l'onglet. La chaine __ID__ sera remplacée automatiquement par l'Id de l'entité concernée.
 
  
 
Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.
 
Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.
  
== Ajouter les onglets standard d'un objet sur sa propre page ==
+
===Ajouter les onglets standard d'un objet sur sa propre page===
 
'''Quand''' : Pour afficher les onglets standard d'une fiche entité (produit, tiers, etc.) sur votre propre page onglet d'une entité.
 
'''Quand''' : Pour afficher les onglets standard d'une fiche entité (produit, tiers, etc.) sur votre propre page onglet d'une entité.
  
Line 157: Line 184:
 
<source lang="php">require_once($url_fichier) ;</source>
 
<source lang="php">require_once($url_fichier) ;</source>
  
Voici la liste de ces fichiers (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :
+
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :
* Entité tiers (thirdparty) :
+
 
** DOL_DOCUMENT_ROOT/societe.class.php
+
*Entité tiers (thirdparty) :
** DOL_DOCUMENT_ROOT/lib/company.lib.php
+
**DOL_DOCUMENT_ROOT/societe/class/societe.class.php
* Entité produit (product) :
+
**DOL_DOCUMENT_ROOT/core/lib/company.lib.php
** DOL_DOCUMENT_ROOT/product.class.php
+
*Entité produit (product) :
** DOL_DOCUMENT_ROOT/lib/product.lib.php
+
**DOL_DOCUMENT_ROOT/product/class/product.class.php
* Entité facture (invoice) :
+
**DOL_DOCUMENT_ROOT/core/lib/product.lib.php
** DOL_DOCUMENT_ROOT/facture.class.php
+
*Entité facture (invoice) :
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php
+
**DOL_DOCUMENT_ROOT/compta/facture/facture.class.php
 +
**DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php
  
 
'''2. Créer et charger l'objet à afficher dans votre onglet'''
 
'''2. Créer et charger l'objet à afficher dans votre onglet'''
  
Créer l'objet de la classe voulue, et récupérer les données de l'objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l'identifiant de l'objet que vous récupérez depuis l'url (ex : /mononglet.php?id=1).
+
Créez l'objet de la classe voulue, et récupérez les données de l'objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l'identifiant de l'objet que vous récupérez depuis l'url (ex : /mononglet.php?id=1).
  
 
''Exemple :''
 
''Exemple :''
 
<source lang="php">
 
<source lang="php">
$id=$_GET["id"];
+
$id=GETPOST('id','int');
 +
$ref=GETPOST('ref','alpha');
 
$product = new Product($db) ;
 
$product = new Product($db) ;
$result = $product->fetch($id) ; //Tester $result pour vérifier que l'accès à la base s'est bien passé
+
$result = $product->fetch($id, $ref) ; //Tester $result pour vérifier que l'accès à la base s'est bien passée
 
</source>
 
</source>
  
 
'''3. Récupérer la liste des onglets correspondants à l'entité choisie'''
 
'''3. Récupérer la liste des onglets correspondants à l'entité choisie'''
  
Utiliser la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l'objet pour lequel vous voulez afficher les onglets.
+
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l'objet pour lequel vous voulez afficher les onglets.
  
 
Le tableau retourné est composé de la façon suivante :
 
Le tableau retourné est composé de la façon suivante :
Line 188: Line 217:
 
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
 
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
 
$head[$h][0] // Url de la page affichée quand on clique sur l'onglet
 
$head[$h][0] // Url de la page affichée quand on clique sur l'onglet
$head[$h][1] // Titre de l'ongLet
+
$head[$h][1] // Titre de l’onglet
 
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
 
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
 
</source>
 
</source>
Line 199: Line 228:
 
'''4. Afficher les onglets sur votre page onglet'''
 
'''4. Afficher les onglets sur votre page onglet'''
  
Utiliser la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().
+
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().
  
 
<source lang="php">
 
<source lang="php">
Line 215: Line 244:
 
Cette fonction affiche les onglets voulus et ouvre un élément ''< div class="" >'' qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l'élément ''< /div >'' dans le code PHP.
 
Cette fonction affiche les onglets voulus et ouvre un élément ''< div class="" >'' qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l'élément ''< /div >'' dans le code PHP.
  
''Remarque'':
+
''Remarque'' :
 
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.
 
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.
  
= [[File:Art.png]] Créer vos pages écran PHP (optionnel) =
+
==Créer vos pages écran PHP (optionnel)==
'''Quand''': Si l'objet de votre module est d'ajouter des fonctionnalités qui nécessitent de nouveaux écrans.
+
'''Quand''' : Si l'objet de votre module est d'ajouter des fonctionnalités qui nécessitent de nouveaux écrans.
  
== Créer une page écran PHP brute ==
+
===Créer une page écran PHP brute===
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire '''dev/skeletons''' (Pour le développement d'un script en ligne de commande, voir [[Développement de scripts]]).
+
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire '''modulebuilder''' (Pour le développement d'un script en ligne de commande, voir [[Développement de scripts]]).
  
Pour créer une nouvelle page écran utilisateur, créer un sous-répertoire de '''htdocs''' (si non déjà fait) propre à votre module (Dans '''htdocs/monmodule''' par exemple) afin d'y placer les pages que vous aller créer.
+
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de '''htdocs''' (si non déjà fait) propre à votre module (Dans '''htdocs/monmodule''' par exemple) afin d'y placer les pages que vous allez créer.
  
Y recopier le fichier '''skeletons_page.php''' qui va servir de point de départ.
+
Y recopier le fichier '''myobject_page.php''' qui va servir de point de départ.
Modifier le fichier afin que le chemin relatif du
+
Modifiez le fichier afin que le main.inc.php soit trouvé
 
<source lang="php">
 
<source lang="php">
include("../../main.inc.php)";
+
// Load Dolibarr environment
 +
$res=0;
 +
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
 +
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
 +
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
 +
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
 +
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
 +
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
 +
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
 +
// Try main.inc.php using relative path
 +
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
 +
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
 +
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
 +
if (! $res) die("Include of main fails");
 
</source>
 
</source>
soit correct, en fonction de la profondeur de répertoire dans laquelle se trouve le fichier (Enlever ou supprimer des "../").
+
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire "custom". Mais vous pouvez avoir à gérer plus de situations. L'exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.
 +
 
 +
Notez que vous pouvez ajouter plus "../" en fonction de la profondeur du fichier par rapport à l'arborescence de votre module.
 +
 
 
C'est dans le main qu'est chargé l'environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:
 
C'est dans le main qu'est chargé l'environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:
  
* $user    L'objet qui contient les caractéristiques de l'utilisateur + ses droits.
+
*$user    L'objet qui contient les caractéristiques de l'utilisateur + ses droits.
* $conf    L'objet qui contient la configuration de Dolibarr.
+
*$conf    L'objet qui contient la configuration de Dolibarr.
* $db      L'objet qui contient le handler de connexion ouvert à la base de données.
+
*$db      L'objet qui contient le handler de connexion à la base de données.
* $langs  L'objet qui contient la langue de l'utilisateur.
+
*$langs  L'objet qui contient la langue de l'utilisateur.
  
Saisissez ensuite votre code pour afficher la page.
+
*L'inclusion d'une classe ou librairie dédiée au module, sans savoir d'où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)
  
== Créer une page écran PHP par template Smarty ==
+
''Exemple :''
=== Compléter votre descripteur de module ===
 
Dans votre descripteur de module, compléter la déclaration du tableau this->const afin d'ajouter la constante MAIN_MODULE_monmodule_NEEDSMARTY.
 
 
<source lang="php">
 
<source lang="php">
$this->const=array(1=>array('MAIN_MODULE_MONMODULE_NEEDSMARTY','chaine',1,'Need smarty',0));
+
dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse');
 
</source>
 
</source>
  
Ceci aura pour effet, lors de l'initialisation de l'objet $conf, de remplir le tableau $conf->need_smarty des modules qui ont besoin de smarty et si au moins un module est requis, le code dans main.inc.php chargera systématiquement les librairies de Smarty.
+
*L'appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:
  
=== Réaliser vos pages templates ===
+
''Exemple :''
Construisez vos pages templates (fichiers '''mespages.tpl''') dans le répertoire '''htdocs/monmodule/templates'''.
 
 
 
=== Réaliser vos pages PHP ===
 
Réaliser vos pages écrans PHP Dolibarr en suivant le modèle décrit dans cette documentation.
 
La différence est qu'à la fin, pour afficher la présentation HTML, il vous faut ajouter la séquence suivante:
 
 
<source lang="php">
 
<source lang="php">
$smarty->template_dir = DOL_DOCUMENT_ROOT.'/monmodule/templates/';
+
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
$mc->assign_smarty_values($smarty,$_GET["action"]);
 
$smarty->display($template);
 
 
</source>
 
</source>
L'objet $smarty n'a pas à être initialisé, il est normalement déjà défini (sur la base de Smarty intégré dans Dolibarr), si votre descripteur de module a bien déclaré avoir besoin de smarty et que le module a bien été activé après cela.
+
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n'intègre pas un cache des fichiers "non trouvés". Et comme un fichier donné n'est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).
  
== Accès à la base ==
+
===Remplacer les parties d'écrans templatés (version 3.3+)===
 +
Certaines portions d'écran de Dolibarr sont isolées dans des fichiers templates.
 +
Vous pouvez développer un module pour remplacer un ou plusieurs de ces templates par les vôtres.
 +
{{ToComplete}}
 +
 
 +
===Accès à la base===
 
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.
 
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.
  
 
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d'enregistrement). Dans ce cas, pensez à suivre ces exemples:
 
Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d'enregistrement). Dans ce cas, pensez à suivre ces exemples:
  
Pour un insert, update ou delete:
+
Pour un insert, update ou delete :
  
 
<source lang="php">
 
<source lang="php">
Line 277: Line 318:
 
</source>
 
</source>
  
Pour une lecture:
+
Pour une lecture :
  
 
<source lang="php">
 
<source lang="php">
Line 302: Line 343:
 
</source>
 
</source>
  
== Définition du style ==
+
===Définition du style===
 
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d'utiliser les styles des CSS de Dolibarr.
 
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d'utiliser les styles des CSS de Dolibarr.
  
Par exemple:
+
Par exemple :
 
 
* class="'''liste_titre'''" sur les balises ''tr'' et ''td'' pour une ligne de titre de tableau.
 
* class="'''pair'''" ou class="'''impair'''" sur les balises ''tr'' et ''td'' des lignes de donnees de tableau.
 
* class="'''flat'''" sur tous les champs de saisie (''input, select, textarea''...).
 
* class="'''button'''" sur les objets de type ''input type="submit"''.
 
  
 +
*class="'''liste_titre'''" sur les balises ''tr'' et ''td'' pour une ligne de titre de tableau.
 +
*class="'''pair'''" ou class="'''impair'''" sur les balises ''tr'' et ''td'' des lignes de données de tableau.
 +
*class="'''flat'''" sur tous les champs de saisie (''input, select, textarea''...).
 +
*class="'''button'''" sur les objets de type ''input type="submit"''.
  
== Utiliser le sélecteur de date de Dolibarr ==
 
  
 +
===Utilisez le sélecteur de date de Dolibarr===
 
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:
 
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:
 
<source lang="php">
 
<source lang="php">
Line 320: Line 360:
 
$form->select_date('','mykey',0,0,0,"myform");
 
$form->select_date('','mykey',0,0,0,"myform");
 
</source>
 
</source>
La chaine mykey identifie la zone date. Il faut y mettre une valeur différente s'il y a plusieurs zones.
+
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s'il y a plusieurs zones.
 
La chaine myform est le nom de la zone FORM (dans form name="myform" de la page HTML).
 
La chaine myform est le nom de la zone FORM (dans form name="myform" de la page HTML).
L'affichage d'un sélecteur de date doit donc être intégrée dans une zone FORM Html.
+
L'affichage d'un sélecteur de date doit donc être intégré dans une zone FORM Html.
  
 
Pour récupérer la valeur, à l'issu du POST, la commande est:
 
Pour récupérer la valeur, à l'issu du POST, la commande est:
Line 330: Line 370:
 
</source>
 
</source>
  
= [[File:Art.png]] Définir votre page de configuration (optionnel) =
+
==Définir votre page de configuration (optionnel)==
'''Quand''': Si votre module offre plusieurs options paramétrables.
+
'''Quand''' : si votre module offre plusieurs options paramétrables.
  
== Creer votre page d'édition de configuration ==
+
===Créez votre page d'édition de configuration===
 
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table '''llx_const''']]).
 
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la [[Table llx_const|table '''llx_const''']]).
Créer une page PHP nommée '''monmodule_setupapage.php''' qui affiche les options possibles et les met à jour.
+
Créez une page PHP nommée '''monmodule_setupapage.php''' qui affiche les options possibles et les met à jour.
 
Il est nécessaire de prendre exemple sur une page dans '''/admin''' qui vous montre la méthode pour lire ou sauvegarder en base votre option.
 
Il est nécessaire de prendre exemple sur une page dans '''/admin''' qui vous montre la méthode pour lire ou sauvegarder en base votre option.
Placer cette page de configuration dans le répertoire '''/admin''' également.
+
Placez cette page de configuration dans le répertoire '''/admin''' également.
Ensuite dans le descripteur de module, modifier la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).
+
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).
 
<source lang="php">
 
<source lang="php">
 
$this->config_page_url = array("monmodule_setupapage.php");
 
$this->config_page_url = array("monmodule_setupapage.php");
 
</source>
 
</source>
  
== Tester votre page ==
+
===Testez votre page===
Allez sur la page '''Configuration->module''', vous devez voir apparaitre une icône qui permet d'accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.
+
Allez sur la page '''Configuration->module''', vous devez voir apparaître une icône qui permet d'accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.
  
= [[File:Art.png]] Définir vos entrées de menu (optionnel) =
+
==Définir vos entrées de menu (optionnel)==
'''Quand''': Si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.
+
'''Quand''' : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.
  
== Définissez vos entrées menus ==
+
===Définissez vos entrées menus===
 
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this->menu qui déclare les menus.
 
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this->menu qui déclare les menus.
Ce tableau contient toutes les entrées qui apparaitront dans les menus une fois le module activé.
+
Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé.
Le fichier de descripteur de module exemple '''modMyModule.class.php''' possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.
+
Le fichier de descripteur de module exemple '''modMonModule.class.php''' possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.
  
 
Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:
 
Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:
Line 364: Line 404:
 
$this->menu[$r]=array( 'fk_menu'=>0, // Put 0 if this is a top menu
 
$this->menu[$r]=array( 'fk_menu'=>0, // Put 0 if this is a top menu
 
'type'=>'top', // This is a Top menu entry
 
'type'=>'top', // This is a Top menu entry
'titre'=>'MyModule top menu',
+
'titre'=>'MonModule top menu',
'mainmenu'=>'mymodule',
+
'mainmenu'=>'monmodule',
'leftmenu'=>'1', // Use 1 if you also want to add left menu entries using this descriptor. Use 0 if left menu entries are defined in a file pre.inc.php (old school).
+
'leftmenu'=>'monmodule',
'url'=>'/mymodule/pagetop.php',
+
'url'=>'/monmodule/pagetop.php',
 
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
 
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
 
'position'=>100,
 
'position'=>100,
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled.
+
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules
+
'perms'=>'1', // Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
 
'target'=>'',
 
'target'=>'',
 
'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
 
'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
Line 377: Line 417:
  
 
// Example to declare a Left Menu entry:
 
// Example to declare a Left Menu entry:
$this->menu[$r]=array( 'fk_menu'=>'r=0', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry)
+
$this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=xxx', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode of parent menu
 
'type'=>'left', // This is a Left menu entry
 
'type'=>'left', // This is a Left menu entry
'titre'=>'MyModule left menu 1',
+
'titre'=>'MonModule left menu 1',
'mainmenu'=>'mymodule',
+
'mainmenu'=>'xxx',
'url'=>'/mymodule/pagelevel1.php',
+
                        'leftmenu'=>'yyy',
 +
'url'=>'/monmodule/pagelevel1.php',
 
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
 
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
 
'position'=>100,
 
'position'=>100,
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled.
+
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules
+
'perms'=>'1', // Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
 
'target'=>'',
 
'target'=>'',
 
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
 
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
Line 393: Line 434:
 
Pour conditionner l'accès au menu selon des permission, modifier la propriété '''perms''' du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.
 
Pour conditionner l'accès au menu selon des permission, modifier la propriété '''perms''' du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.
  
== Tester vos entrées menus ==
+
===Testez vos entrées menus===
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaitre (si la condition dans 'enabled' est vraie).
+
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans 'enabled' est vraie).
  
= [[File:Art.png]] Définir vos propres permissions (optionnel) =
+
==Définir vos propres permissions (optionnel)==
'''Quand''': Si vous voulez ajouter de nouvelles permissions.
+
'''Quand''' : Si vous voulez ajouter de nouvelles permissions.
  
La définition des permissions que gèrera votre module se fait dans le fichier descripteur créé dans la première étape.
+
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.
 
Modifier la ligne  
 
Modifier la ligne  
 
<source lang="php">
 
<source lang="php">
Line 417: Line 458:
 
</source>
 
</source>
  
Dans $this->rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu '''Infos Système''' sur une installation de Dolibarr opérationnelle pour connaitre les id déjà utilisés.
+
Dans $this->rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu '''Infos Système''' sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés.
 
Dans $this->rights[$r][3], mettre 1 si cette permission est attribué d'office par défaut quand un utilisateur est créé.
 
Dans $this->rights[$r][3], mettre 1 si cette permission est attribué d'office par défaut quand un utilisateur est créé.
Dans $this->rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n'est trouvé pour votre permission dans le fichier '''admin.lang''').
+
Dans $this->rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n'est trouvé pour votre permission dans le fichier '''admin.lang'''. La clé de traduction dit être "Permission10001=Description de ma super permission'''"''').
Dans $this->rights[$r][4] et $this->rights[$r][5], mettre une chaine action et sousaction sans espaces. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante:
+
Dans $this->rights[$r][4] et $this->rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :
  
 
<source lang="php">
 
<source lang="php">
Line 426: Line 467:
 
</source>
 
</source>
  
= [[File:Art.png]] Définir vos propres box (optionnel) =
+
==Définir vos propres box (optionnel)==
'''Quand''': Si votre module amène avec lui une ou plusieurs Boxes.
+
'''Quand''' : si votre module amène avec lui une ou plusieurs Boxes.
  
== Définissez vos box ==
+
===Définissez vos box===
Pour cela, modifier les tableaux $this->boxes du fichier descripteur de module.
+
Pour cela, modifiez les tableaux $this->boxes du fichier descripteur de module.
Il suffit d'ajouter une ligne par fichier box qui se trouve dans le répertoire '''htdocs/includes/boxes'''
+
Il suffit d'ajouter 2 lignes par fichier box que vous allez créer dans le répertoire '''htdocs/monmodule/core/boxes'''
  
''Exemple:''
+
''Exemple :''
 
<source lang="php">
 
<source lang="php">
this->boxes[0][1]='mabox0.php'
+
$this->boxes[0]['file']='mabox0.php@monmodule'
this->boxes[1][1]='mabox1.php'
+
$this->boxes[0]['note']='Ma box 0'
this->boxes[2][1]='mabox2.php'
+
...
...
+
$this->boxes[n]['file']='maboxn.php@monmodule'
this->boxes[n][1]='maboxn.php'
+
$this->boxes[n]['note']='Ma box n'
 
</source>
 
</source>
  
Ensuite creer les fichiers mabox0.php, mabox1.php... en prenant exemple sur des box existantes (dans le répertoire htdocs/include/boxes
+
Ensuite créez les fichiers '''htdocs/monmodule/core/boxes/mabox0.php''', '''htdocs/monmodule/core/boxes/mabox1.php'''... en prenant exemple sur des box existantes (exemple dans le répertoire '''htdocs/core/boxes''')
  
== Tester la présence de vos box dans Dolibarr ==
+
===Testez la présence de vos box dans Dolibarr===
Désactiver et réactiver le module.
+
Désactivez et réactivez le module.
  
Aller dans le menu '''Accueil - Configuration - Boite'''.
+
Allez dans le menu '''Accueil - Configuration - Boite'''.
  
Vos box doivent apparaitre dans la liste des box activables. Activer les puis aller sur la page d'accueil et vérifier qu'elles s'affichent correctement.
+
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d'accueil et vérifiez qu'elles s'affichent correctement.
  
= [[File:Art.png]] Définir vos propres exports (optionnel) =
+
==Définir vos propres exports (optionnel)==
'''Quand''': Si votre module amène avec lui des exports prédéfini de données (pour ces propres tables ou des tables déjà existante d'un autre module de Dolibarr).
+
'''Quand''' : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d'un autre module de Dolibarr).
  
== Définissez l'export ==
+
===Définissez l'export===
Pour cela, décommenter et modifier les tableaux $this->export_xxx du votre fichier descripteur de module.
+
Pour cela, décommentez et modifiez les tableaux $this->export_xxx du votre fichier descripteur de module.
  
== Tester votre export ==
+
===Testez votre export===
Aller dans le menu outils -> export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponible (si votre module est bien activé).
+
Allez dans le menu outils -> export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé).
Le choisir, vous devez alors voir les champs possible définis dans le tableau à l'étape précédente.
+
Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l'étape précédente.
Choisir quelques champs et tenter une génération du fichier export.
+
Choissez quelques champs et tentez une génération du fichier export.
  
= [[File:Art.png]] Définir vos styles CSS (optionnel) =
+
==Définir vos styles CSS (optionnel)==
'''Quand''': Si dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).
+
'''Quand''' : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).
  
 
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4
 
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4
  
== Créer et déclarer votre feuille de style ==
+
===Créez et déclarez votre feuille de style===
Créer un fichier de style css nommé '''monmodule.css''' et le placer dans le répertoire '''''monmodule''''' dans '''htdocs'''. Il ne peut y avoir qu'un fichier css propre à chaque module.
+
Créez un fichier de style css nommé '''monmodule.css''' ou '''monmodule.css.php''' et placez le dans le répertoire '''''monmodule''''' dans '''htdocs'''. Il ne peut y avoir qu'un fichier css propre à chaque module.
Rappelons qu'il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier '''themes/nomtheme/''nomtheme''.php.css'''. Ne créer un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.
+
Rappelons qu'il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier '''themes/nomtheme/''nomtheme''.css.php'''). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.
Une fois votre feuille de style prête, déclarer la dans votre fichier descripteur de module en modifiant la propriété '''$this->style_sheet'''.
+
Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété '''$this->module_parts'''.
 
La valeur à renseigner ici doit être le chemin relatif de l'URL de votre fichier css.
 
La valeur à renseigner ici doit être le chemin relatif de l'URL de votre fichier css.
Par exemple '/monmodule/monfichier.css'.
+
Par exemple
 +
<source lang="php">
 +
$this->module_parts = array('css' => array('/monmodule/css/monmodule.css.php'));
 +
</source>
  
== Tester votre feuille de style ==
+
===Testez votre feuille de style===
Désactiver et réactiver votre module.
+
Désactivez et réactivez votre module.
  
Appelez la page d'accueil de Dolibarr. Afficher la source de la page HTML.
+
Appelez la page d'accueil de Dolibarr. Affichez la source de la page HTML.
  
 
Vous devriez voir dans l'entête HTML, une ligne déclarant votre feuille de style.
 
Vous devriez voir dans l'entête HTML, une ligne déclarant votre feuille de style.
  
= [[File:Art.png]] Définir vos fonctions Javascript (optionnel) =
+
==Définir vos fonctions Javascript (optionnel)==
'''Quand''': Si dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)
+
'''Quand''' : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)
  
 
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript '''htdocs/monmodule/js/monmodule.js''' soit chargées dans l'entête head html.
 
Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript '''htdocs/monmodule/js/monmodule.js''' soit chargées dans l'entête head html.
Line 494: Line 538:
 
</source>
 
</source>
  
= [[File:Art.png]] Déclencher du code sur un évènement Dolibarr (optionnel) =
+
==Déclencher du code sur un évènement Dolibarr (optionnel)==
'''Quand''': Si vous voulez que des actions particulières s'exécutent suite au déclenchement d'actions standards de Dolibarr (exemple: je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de '''triggers'''.
+
'''Quand''' : lorsque vous voulez que des actions particulières s'exécutent suite au déclenchement d'actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de '''triggers'''.
  
 
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l'exterieur]]
 
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l'exterieur]]
 
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]
 
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]
  
= [[File:Art.png]] Quelques règles de codage et fonctions pour développeurs =
+
==Insérer votre code aux emplacement hooks de Dolibarr (optionnel)==
 +
'''Quand''' : lorsque vous voulez modifier ou ajouter du code autrement que lors d'un événement métier (voir le chapitre précédent pour cela).
 +
 
 +
Voir la page [[Système de Hooks]].
 +
 
 +
==Ajouter un module de numérotation (optionnel)==
 +
'''Quand''' : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.
 +
 
 +
Voir la page [[Créer un module de numérotation]].
 +
 
 +
==Ajouter un nouveau modèle de document (optionnel)==
 +
'''Quand''' : lorsque vous voulez ajouter un nouveau modèle de document.
 +
 
 +
La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Créer un modèle de document PDF]] ou [[Créer un modèle de document ODT]].
 +
 
 +
==Ajouter un thème (optionnel)==
 +
'''Quand''': Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.
 +
 
 +
Voir la page [[Themes]].
 +
 
 +
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=
 
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique "Informations Générales - Langage et normes de développement".
 
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique "Informations Générales - Langage et normes de développement".
  
 
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section "Les couches techniques de Dolibarr".
 
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page [[Documentation Développeur|Documentation développeur]] sous la section "Les couches techniques de Dolibarr".
  
= [[File:Art.png]] Créer un package pour livrer et installer votre module =
+
=[[File:Art.png]] Créer un package pour livrer et installer votre module=
Cette procédure doit être utilisé pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.
+
Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com.
 
Mais vous pouvez aussi l'utiliser pour distribuer facillement votre module via votre propre réseau de distribution.
 
Mais vous pouvez aussi l'utiliser pour distribuer facillement votre module via votre propre réseau de distribution.
  
* Aller dans le répertoire '''/build''' et recopier le fichier '''makepack-dolibarrmodules.conf''' en '''makepack-monmodule.conf'''. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c'est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prendre dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).
+
*Allez dans le répertoire '''/build''' et recopiez le fichier '''makepack-dolibarrmodules.conf''' en '''makepack-monmodule.conf'''. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c'est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).
 +
 
 
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)
 
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)
  
* Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
+
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
 +
 
 
<source lang="bash">
 
<source lang="bash">
 
perl makepack-dolibarrmodule.pl
 
perl makepack-dolibarrmodule.pl
Line 519: Line 585:
 
Un fichier '''monmodule.zip''' va alors être fabriqué contenant votre module prêt pour être déployé.
 
Un fichier '''monmodule.zip''' va alors être fabriqué contenant votre module prêt pour être déployé.
  
* La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d'installation de Dolibarr et réaliser la commande:
+
*La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d'installation de Dolibarr et réaliser la commande :
 +
 
 
<source lang="bash">
 
<source lang="bash">
 
tar -xvf monmodule.zip
 
tar -xvf monmodule.zip
 
</source>
 
</source>
  
* Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur le site web de Dolibarr dans la section téléchargements: {{LinkToPluginDownload}} (vous devez avoir créer un compte auparavant et utiliser le lien "Soumettre un produit").
+
*Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: {{LinkToPluginDownload}} (vous devez avoir créé un compte auparavant et utiliser le lien "Soumettre un module/produit").
** Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
+
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
** Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s'avère être d'un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).
+
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s'avère être d'un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).
 +
 
 +
=[[File:Art.png]] Validation/activation du module externe sur Dolistore=
  
= [[File:Art.png]] Utilisation du MDA =
+
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]
Une méthode pour générer un module fonctionnel depuis l'UML est en cours de mise au point. Plus d'informations sur la page [[UML2Dolibarr - Générer un module par MDA]].
 

Latest revision as of 15:41, 30 April 2020

Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d'elles afin d'ajouter un module permettant d'étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:

  • Ajouter de nouvelles tables en base
  • Ajouter vos propres entrées dans les menus
  • Ajouter des écrans de saisie/consultation de nouvelle tables
  • Ajouter ou supprimer des onglets sur les pages de vues/édition des objets (facture, produit, commande, événement, ...)
  • Ajouter des exports prédéfinis pour la fonction export
  • Ajouter de nouvelles boites pour la home page
  • Ajouter des variables de substitution
  • Définir de nouvelles permissions
  • Déclencher du code automatiquement sur une action Dolibarr particulière
  • Insérer votre code aux emplacements hooks de Dolibarr
  • Ajouter un module de numérotation
  • Ajouter un modèle de document
  • Ajouter un nouveau thème

etc...

Les chapitres suivants vous présentent comment réaliser tout cela en manuel de manière simple.

Contents

Art.png Création de Module avec le générateur de module

Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le "Générateur de module" (aussi appelé "Module Builder"). Pour l'activer :

  • Activez le module "Générateur de Module" dans la section "Outils multi-modules"

Mod builder 2.png

  • puis cliquez sur l’icône "bug" qui est apparue dans la barre de menu en haut à droite

Mod builder 3.png

Art.png Exemple de modèle de module externe

Un bon modéle/squelette de module externe Dolibarr est disponible ici : GitHub Dolibarr Module Modèle

Art.png Créer un module

Les sous chapitres suivant décrivent les actions à faire pour créer un module Dolibarr. Les premiers chapitres sont obligatoires quelle que soit la vocation du module, les suivants dépendront de ce que doit faire le module.

Créer un descripteur de Module (obligatoire)

Quand : Obligatoire dès qu'une extension est développée, quelle que soit sa vocation (sauf pour l'ajout de thèmes ou de modèles de documents). Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le "Générateur de module"

Créer votre descripteur avec le générateur de module

  • Lancez le générateur de module en cliquant sur l’icône "bug"

Mod builder 3.png

  • Entrez le nom de votre module sans espaces (le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _)

Mod builder 4.png

  • Vous pourrez alors modifier les paramètres du descriptif du module :

Mod builder 5.png

Alternative : créer votre descripteur manuellement (sans utiliser le générateur de module)

La première étape est donc de créer un fichier de description du module (descripteur). Pour cela:

  • Créez le répertoire /htdocs/monmodule/core/modules. Puis, allez dans le répertoire dev/skeletons et recopiez le fichier modMyModule.class.php dans ce répertoire htdocs/monmodule/core/modules.
  • Renommez le fichier modMyModule.class.php en modifiant seulement la partie MyModule (le fichier doit commencer par mod)

Ensuite, modifiez le contenu de ce fichier afin de remplacer :

  • les modMyModule en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par 'mod' et ne contenir que des caractères alphabétiques.
  • $this->numero = 100000 par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués : Liste des id de modules.
  • Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).

Le descripteur de votre module est alors en place.

Tester votre descripteur

Lancez Dolibarr et allez sur la page Configuration->module, vous devez voir apparaître une nouvelle ligne avec votre nouveau module et la possibilité de l'activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu'à le retrouver). C'est la valeur de $this->special qui détermine dans quel onglet se trouve votre module.

Nom de module

Le nom de votre module NE DOIT PAS CONTENIR le caractère underscore ou tiret bas : _

Arborescence d'un nouveau module

Voici l'arborescence à respecter pour l'organisation des fichiers d'un module.

Rem: Seule la deuxième ligne est obligatoire.

  • mymodule/build/ can contains any file you develop for compiling or building package
  • mymodule/core/modules/ contains module descriptor file modMyModule.class.php
  • mymodule/core/triggers contains triggers provided by module
  • mymodule/admin/ contains pages to setup module
  • mymodule/class/ contains PHP class files provided by module
  • mymodule/css contains CSS files provided by module
  • mymodule/docs to provide doc and licence files
  • mymodule/img contains images files provided by module
  • mymodule/langs/xx_XX contains language files for language xx_XX (try to put at least en_US)
  • mymodule/lib contains libraries provided and used by module
  • mymodule/scripts to provide command line tools or scripts. Note: Command lines script must start with line #!/usr/bin/env php
  • mymodule/sql contains SQL file provided by module to add new tables or indexes
  • mymodule/theme/mytheme if module provide its own theme/skin
  • mymodule/* contains php pages (note that you can also add any other subdir of your choice). Note: If your module is a metapackage (a module that will embed other modules in same zip, you must put here a file metapackage.conf)

Un bon modèle/squelette de module externe Dolibarr est disponible ici : GitHub Dolibarr Module Modèle

Créer vos tables SQL et les classes PHP DAO (optionnel)

Quand: Si votre module a besoin de gérer des données qui lui sont propres

Créer vos fichiers .sql

Si votre module a vocation à gérer des données bien à lui, qui n'existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.

Créer un sous-répertoire sql dans le répertoire de votre module (par exemple htdocs/monmodule/sql) afin d'y placer les scripts sql que vous allez créer.

Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction init que la ligne

$this->_load_tables('/mymodule/sql/');

n'est pas commentée.

Règles à respecter:

  • Ajoutez les fichiers d'ordre de création de vos tables sur le principe d'un fichier llx_matable.sql par table accompagné éventuellement du fichier llx_matable.key.sql (voir les fichiers existants dans install/mysql/tables pour exemple).
  • Les types et noms recommandés pour les champs SQL sont définis sur la page [[1]].
  • Pour ce qui est des commandes permettant d'ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé data.sql situé dans le même répertoire /monmodule/sql/.
  • N'utilisez pas "chaine" mais 'chaine' car les guillemets doubles (") ont une signification particulière en PostGreSQL

Exemple de contenu de fichier data.sql

 delete from llx_const where name='MONMODULE_IT_WORKS' and entity='__ENTITY__';
 insert into llx_const (name, value, type, note, visible, entity) values ('MONMODULE_IT_WORKS','1','chaine','A constant for my module',1,'__ENTITY__');

Les ordres SQL des fichiers doivent être opérationnels pour la base de données mysql. Rem: Les fichiers des autres bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.

Tester vos fichiers .sql

Une fois les fichiers prêts, vous pouvez retourner sous Dolibarr puis désactiver le module, dropper les tables en base et réactiver le module. Les tables doivent alors être recréées par l'activation du module. Si tel n'est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.

Générer la classe PHP DAO d'accès aux tables

Une fois votre ou vos tables créées en base, allez dans le répertoire dev/skeletons, copiez le fichier build_class_from_table.php dans le répertoire sql/ de votre module, et lancez le script

php build_class_from_table.php nomtable

Remarque : Si la commande ne fonctionne pas, essayez d'utiliser php-cli plutot que php.

Ceci génèrera un fichier out.nomtable.class.php qui contient la classe de gestion de la table nomtable. Dans cette classe, se trouve des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d'une ligne de la table. Supprimer juste le "out" du nom de fichier et placer votre fichier dans le sous-répertoire de htdocs propre à votre module (Dans htdocs/monmodule par exemple).

Un fichier out.nomtable_script.php a également été généré et contient un exemple de code pour utiliser la classe pour chacune des 4 méthodes CRUD.

Affichage des onglets (optionnel)

Ajouter ou supprimer des onglets sur les fiches objets

Quand : Pour ajouter votre propre onglet parmi les onglets standard d'une fiche entité (facture, commande, proposition commercial, adhérent...)

Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this->tabs:

	// Array to add new pages in new tabs or remove existing one
	$this->tabs = array('objecttype:+tabname1:Title1:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab1.php?id=__ID__'    // To add a new tab identified by code tabname1
                            'objecttype:+tabname2:Title2:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab2.php?id=__ID__',   // To add a new tab identified by code tabname2
                            'objecttype:-tabname');                                                     // To remove an existing tab identified by code tabname

Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet. Le format de la chaîne étant composé de 6 parties séparées par ":"

  • Partie 1 : le type d'élément (objecttype) dans lequel doit apparaître l'onglet qui est une valeur parmi celle-ci:
    • 'thirdparty' pour ajouter un onglet dans la vues des tiers
    • 'intervention' pour ajouter un onglet dans la vues des interventions
    • 'supplier_order' pour ajouter un onglet dans la vues des commandes fournisseurs
    • 'supplier_invoice' pour ajouter un onglet dans la vues des factures fournisseurs
    • 'invoice' pour ajouter un onglet dans la vues des factures clientes
    • 'order' pour ajouter un onglet dans la vues des commandes clients
    • 'product' pour ajouter un onglet dans la vues des produits
    • 'stock' pour ajouter un onglet dans la vues des entrepots
    • 'propal' pour ajouter un onglet dans la vues des propositions commerciales
    • 'member' pour ajouter un onglet dans la vues des adhérents
    • 'contract' pour ajouter un onglet dans la vues des contacts
    • 'user' pour ajouter un onglet dans la vues des utilisateurs
    • 'group' pour ajouter un onglet dans la vues des groupes d'utilisateurs
    • 'contact' pour ajouter un onglet dans la vues des contacts/adresses
    • 'categories_x' pour ajouter un onglet dans la vues des catégories (remplacer 'x' par le type de categorie (0=produit, 1=fournisseur, 2=clients/prospect, 3=adhérent)
  • Partie 2 : nom de code pour l'onglet à ajouter (commence par +) ou à enlever (commence par -)
  • Partie 3 : le titre de l'onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.
  • Partie 4 : le nom du fichier .lang (sans l'extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c'est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang
  • Partie 5 : une condition à tester pour savoir si l'onglet doit être visible ou pas. Mettre '1' pour qu'il soit toujours visible.
  • Partie 6 : l'url de la page à afficher quand on clique sur l'onglet. La chaine __ID__ sera remplacée automatiquement par l'Id de l'entité concernée.

Pour que la déclaration soit effective, il faut désactiver et réactiver le module.

Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.

Ajouter les onglets standard d'un objet sur sa propre page

Quand : Pour afficher les onglets standard d'une fiche entité (produit, tiers, etc.) sur votre propre page onglet d'une entité.

Il faut appliquer la procédure suivante :

1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers

Pour chaque fiche entité, il y a deux fichiers à inclure avec l'instruction

require_once($url_fichier) ;

Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :

  • Entité tiers (thirdparty) :
    • DOL_DOCUMENT_ROOT/societe/class/societe.class.php
    • DOL_DOCUMENT_ROOT/core/lib/company.lib.php
  • Entité produit (product) :
    • DOL_DOCUMENT_ROOT/product/class/product.class.php
    • DOL_DOCUMENT_ROOT/core/lib/product.lib.php
  • Entité facture (invoice) :
    • DOL_DOCUMENT_ROOT/compta/facture/facture.class.php
    • DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php

2. Créer et charger l'objet à afficher dans votre onglet

Créez l'objet de la classe voulue, et récupérez les données de l'objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramètre l'identifiant de l'objet que vous récupérez depuis l'url (ex : /mononglet.php?id=1).

Exemple :

$id=GETPOST('id','int');
$ref=GETPOST('ref','alpha');
$product = new Product($db) ;
$result = $product->fetch($id, $ref) ; //Tester $result pour vérifier que l'accès à la base s'est bien passée

3. Récupérer la liste des onglets correspondants à l'entité choisie

Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l'objet pour lequel vous voulez afficher les onglets.

Le tableau retourné est composé de la façon suivante :

$head        // Tableau des onglets
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
$head[$h][0] // Url de la page affichée quand on clique sur l'onglet
$head[$h][1] // Titre de l’onglet
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)

Exemple :

$head = product_prepare_head($product, $user) ; //le paramètre $user n'est pas présent sur certaines fonctions

4. Afficher les onglets sur votre page onglet

Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().

dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
//$links  // Tableau des onglets, appelé $head plus haut.
//$active // Onglet actif (mettre le nom de l'onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance
//$title  // ?
//$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.
//$picto  // Nom de l'image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :
//            product
//            service
//            company

Cette fonction affiche les onglets voulus et ouvre un élément < div class="" > qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l'élément < /div > dans le code PHP.

Remarque : Pour plus de détail, se référer à la documentation Doxygen ou directement au code de Dolibarr.

Créer vos pages écran PHP (optionnel)

Quand : Si l'objet de votre module est d'ajouter des fonctionnalités qui nécessitent de nouveaux écrans.

Créer une page écran PHP brute

Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire modulebuilder (Pour le développement d'un script en ligne de commande, voir Développement de scripts).

Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de htdocs (si non déjà fait) propre à votre module (Dans htdocs/monmodule par exemple) afin d'y placer les pages que vous allez créer.

Y recopier le fichier myobject_page.php qui va servir de point de départ. Modifiez le fichier afin que le main.inc.php soit trouvé

// Load Dolibarr environment
$res=0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
// Try main.inc.php using relative path
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");

Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire "custom". Mais vous pouvez avoir à gérer plus de situations. L'exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations.

Notez que vous pouvez ajouter plus "../" en fonction de la profondeur du fichier par rapport à l'arborescence de votre module.

C'est dans le main qu'est chargé l'environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:

  • $user L'objet qui contient les caractéristiques de l'utilisateur + ses droits.
  • $conf L'objet qui contient la configuration de Dolibarr.
  • $db L'objet qui contient le handler de connexion à la base de données.
  • $langs L'objet qui contient la langue de l'utilisateur.
  • L'inclusion d'une classe ou librairie dédiée au module, sans savoir d'où le fichier sera appelé, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)

Exemple :

dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse');
  • L'appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:

Exemple :

require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';

La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n'intègre pas un cache des fichiers "non trouvés". Et comme un fichier donné n'est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).

Remplacer les parties d'écrans templatés (version 3.3+)

Certaines portions d'écran de Dolibarr sont isolées dans des fichiers templates. Vous pouvez développer un module pour remplacer un ou plusieurs de ces templates par les vôtres.

En verysmall.png Page waiting to complete. To complete, create an account, go back and clic on "Modify".
Fr verysmall.png Page en attente d'être complété. Pour compléter, créez un compte, revenez et cliquez sur "Modifier".
Es verysmall.png Página a completar. Para completarla, cree una cuenta, vuelva a la página y haga clic en "editar"
De verysmall.png Seite wartet auf Vervollständigung. Um zu helfen, erstelle ein Konto, gehe zurück und klicke auf "Bearbeiten".
Cn verysmall.png 待完成,欲帮助完成,注册帐号,点击“编辑"

Accès à la base

Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.

Si toutefois vous voulez faire des accès dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d'enregistrement). Dans ce cas, pensez à suivre ces exemples:

Pour un insert, update ou delete :

$db->begin();   // Debut transaction
$db->query("Ma requete insert, update ou delete");
$db->commit();       // Valide
ou $db->rollback()  // Annule

Pour une lecture :

$resql=$db->query("Ma requete select");
if ($resql)
{
	$num = $db->num_rows($resql);
	$i = 0;
	if ($num)
	{
		while ($i < $num)
		{
			$obj = $db->fetch_object($resql);
			if ($obj)
			{
				// You can use here results
				print $obj->field1;
				print $obj->field2;
			}
			$i++;
		}
	}
}

Définition du style

Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d'utiliser les styles des CSS de Dolibarr.

Par exemple :

  • class="liste_titre" sur les balises tr et td pour une ligne de titre de tableau.
  • class="pair" ou class="impair" sur les balises tr et td des lignes de données de tableau.
  • class="flat" sur tous les champs de saisie (input, select, textarea...).
  • class="button" sur les objets de type input type="submit".


Utilisez le sélecteur de date de Dolibarr

Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:

$form=new Form($db);
$form->select_date('','mykey',0,0,0,"myform");

La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s'il y a plusieurs zones. La chaine myform est le nom de la zone FORM (dans form name="myform" de la page HTML). L'affichage d'un sélecteur de date doit donc être intégré dans une zone FORM Html.

Pour récupérer la valeur, à l'issu du POST, la commande est:

$mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
print strftime('%A %d %B %Y', $mydate);

Définir votre page de configuration (optionnel)

Quand : si votre module offre plusieurs options paramétrables.

Créez votre page d'édition de configuration

Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la table llx_const). Créez une page PHP nommée monmodule_setupapage.php qui affiche les options possibles et les met à jour. Il est nécessaire de prendre exemple sur une page dans /admin qui vous montre la méthode pour lire ou sauvegarder en base votre option. Placez cette page de configuration dans le répertoire /admin également. Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).

$this->config_page_url = array("monmodule_setupapage.php");

Testez votre page

Allez sur la page Configuration->module, vous devez voir apparaître une icône qui permet d'accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.

Définir vos entrées de menu (optionnel)

Quand : si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.

Définissez vos entrées menus

Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this->menu qui déclare les menus. Ce tableau contient toutes les entrées qui apparaîtront dans les menus une fois le module activé. Le fichier de descripteur de module exemple modMonModule.class.php possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.

Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:

// Main menu entries
$this->menu = array();			// List of menus to add
$r=0;

// Add here entries to declare new menus
// Example to declare the Top Menu entry:
$this->menu[$r]=array(	'fk_menu'=>0,			// Put 0 if this is a top menu
			'type'=>'top',			// This is a Top menu entry
			'titre'=>'MonModule top menu',
			'mainmenu'=>'monmodule',
			'leftmenu'=>'monmodule',
			'url'=>'/monmodule/pagetop.php',
			'langs'=>'mylangfile',	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
			'position'=>100,
			'enabled'=>'1',			// Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
			'perms'=>'1',			// Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
			'target'=>'',
			'user'=>2);				// 0=Menu for internal users, 1=external users, 2=both
$r++;

// Example to declare a Left Menu entry:
$this->menu[$r]=array(	'fk_menu'=>'fk_mainmenu=xxx',	// Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode of parent menu
			'type'=>'left',			// This is a Left menu entry
			'titre'=>'MonModule left menu 1',
			'mainmenu'=>'xxx',
                        'leftmenu'=>'yyy',
			'url'=>'/monmodule/pagelevel1.php',
			'langs'=>'mylangfile',	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
			'position'=>100,
			'enabled'=>'1',			// Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
			'perms'=>'1',			// Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
			'target'=>'',
			'user'=>2);				// 0=Menu for internal users,1=external users, 2=both
$r++;

Pour conditionner l'accès au menu selon des permission, modifier la propriété perms du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.

Testez vos entrées menus

Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaître (si la condition dans 'enabled' est vraie).

Définir vos propres permissions (optionnel)

Quand : Si vous voulez ajouter de nouvelles permissions.

La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape. Modifier la ligne

$this->rights_class = 'monmodule'

pour y mettre la bonne valeur de monmodule.

Ensuite remplissez le tableau $this->rights avec autant d'entrées que de permissions différentes à gérer.

$this->rights[$r][0] = 10001;
$this->rights[$r][1] = 'Libelle par défaut de ma permission';
$this->rights[$r][3] = 1;
$this->rights[$r][4] = 'action';
$this->rights[$r][5] = 'sousaction';
$r++;

Dans $this->rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu Infos Système sur une installation de Dolibarr opérationnelle pour connaître les id déjà utilisés. Dans $this->rights[$r][3], mettre 1 si cette permission est attribué d'office par défaut quand un utilisateur est créé. Dans $this->rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n'est trouvé pour votre permission dans le fichier admin.lang. La clé de traduction dit être "Permission10001=Description de ma super permission"). Dans $this->rights[$r][4] et $this->rights[$r][5], mettre une chaîne action et sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante :

if ($user->rights->monmodule->action->sousaction) ...

Définir vos propres box (optionnel)

Quand : si votre module amène avec lui une ou plusieurs Boxes.

Définissez vos box

Pour cela, modifiez les tableaux $this->boxes du fichier descripteur de module. Il suffit d'ajouter 2 lignes par fichier box que vous allez créer dans le répertoire htdocs/monmodule/core/boxes

Exemple :

$this->boxes[0]['file']='mabox0.php@monmodule'
$this->boxes[0]['note']='Ma box 0'
 ...
$this->boxes[n]['file']='maboxn.php@monmodule'
$this->boxes[n]['note']='Ma box n'

Ensuite créez les fichiers htdocs/monmodule/core/boxes/mabox0.php, htdocs/monmodule/core/boxes/mabox1.php... en prenant exemple sur des box existantes (exemple dans le répertoire htdocs/core/boxes)

Testez la présence de vos box dans Dolibarr

Désactivez et réactivez le module.

Allez dans le menu Accueil - Configuration - Boite.

Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d'accueil et vérifiez qu'elles s'affichent correctement.

Définir vos propres exports (optionnel)

Quand : si votre module amène avec lui des exports prédéfinis de données (pour ces propres tables ou des tables déjà existantes d'un autre module de Dolibarr).

Définissez l'export

Pour cela, décommentez et modifiez les tableaux $this->export_xxx du votre fichier descripteur de module.

Testez votre export

Allez dans le menu outils -> export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponibles (si votre module est bien activé). Le choisir, vous devez alors voir les champs possibles définis dans le tableau à l'étape précédente. Choissez quelques champs et tentez une génération du fichier export.

Définir vos styles CSS (optionnel)

Quand : lorsque dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).

Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4

Créez et déclarez votre feuille de style

Créez un fichier de style css nommé monmodule.css ou monmodule.css.php et placez le dans le répertoire monmodule dans htdocs. Il ne peut y avoir qu'un fichier css propre à chaque module. Rappelons qu'il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier themes/nomtheme/nomtheme.css.php). Ne créez un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants. Une fois votre feuille de style prête, déclarez la dans votre fichier descripteur de module en modifiant la propriété $this->module_parts. La valeur à renseigner ici doit être le chemin relatif de l'URL de votre fichier css. Par exemple

$this->module_parts = array('css' => array('/monmodule/css/monmodule.css.php'));

Testez votre feuille de style

Désactivez et réactivez votre module.

Appelez la page d'accueil de Dolibarr. Affichez la source de la page HTML.

Vous devriez voir dans l'entête HTML, une ligne déclarant votre feuille de style.

Définir vos fonctions Javascript (optionnel)

Quand : lorsque dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)

Si dans vos écrans PHP, vous utilisez des fonctions javascript, il est nécessaire de faire en sorte que vos fonctions déclarées dans un fichier javascript htdocs/monmodule/js/monmodule.js soit chargées dans l'entête head html. Pour demander à Dolibarr qui gère la génération de la section header d'inclure un de vos fichiers javascript, il est nécessaire de fournir en paramètre de la fonction llxHeader() appelée au début de votre page, d'inclure le paramètre qui contient l'URL vers le js à inclure.

Exemple pour la page /htdocs/monmodule/mapage.php :

require('../main.inc.php');
$morejs=array("/monmodule/js/monmodule.js");
llxHeader('','Titre','','','','',$morejs,'',0,0);

Déclencher du code sur un évènement Dolibarr (optionnel)

Quand : lorsque vous voulez que des actions particulières s'exécutent suite au déclenchement d'actions standards de Dolibarr (exemple : je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de triggers.

Voir aussi Interfaces de Dolibarr vers l'exterieur et Interfaces exterieures vers Dolibarr

Insérer votre code aux emplacement hooks de Dolibarr (optionnel)

Quand : lorsque vous voulez modifier ou ajouter du code autrement que lors d'un événement métier (voir le chapitre précédent pour cela).

Voir la page Système de Hooks.

Ajouter un module de numérotation (optionnel)

Quand : lorsque vous voulez ajouter une règle de numérotation non couverte par les modules par défaut.

Voir la page Créer un module de numérotation.

Ajouter un nouveau modèle de document (optionnel)

Quand : lorsque vous voulez ajouter un nouveau modèle de document.

La documentation au sujet de la génération de documents depuis des modèles est disponible sur la page Créer un modèle de document PDF ou Créer un modèle de document ODT.

Ajouter un thème (optionnel)

Quand: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.

Voir la page Themes.

Art.png Quelques règles de codage et fonctions pour développeurs

Les règles de codage à suivre sont définis dans la Documentation développeur, rubrique "Informations Générales - Langage et normes de développement".

De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page Documentation développeur sous la section "Les couches techniques de Dolibarr".

Art.png Créer un package pour livrer et installer votre module

Cette procédure doit être utilisée pour fabriquer un package afin de le soumettre sur la place de marché http://www.dolistore.com. Mais vous pouvez aussi l'utiliser pour distribuer facillement votre module via votre propre réseau de distribution.

  • Allez dans le répertoire /build et recopiez le fichier makepack-dolibarrmodules.conf en makepack-monmodule.conf. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c'est le cas, il peut être récupéré dans le snapshot disponible en téléchargement sur le site web Dolibarr dans la rubrique Version de développement (prenez dans ce cas tout le répertoire build qui est un répertoire autonome et indépendant de la version).

Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)

  • Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
perl makepack-dolibarrmodule.pl

Le script vous demande le nom de votre module, sa version majeure et mineure. Un fichier monmodule.zip va alors être fabriqué contenant votre module prêt pour être déployé.

  • La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d'installation de Dolibarr et réaliser la commande :
tar -xvf monmodule.zip
  • Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: DoliStore.com (vous devez avoir créé un compte auparavant et utiliser le lien "Soumettre un module/produit").
    • Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
    • Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s'avère être d'un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).

Art.png Validation/activation du module externe sur Dolistore

Voir Règles de Validation