<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Choiceerp</id>
	<title>Dolibarr ERP CRM Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.dolibarr.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Choiceerp"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Choiceerp"/>
	<updated>2026-10-22T02:57:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20774</id>
		<title>Alain Ivars</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20774"/>
		<updated>2010-11-24T17:08:48Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Everybody]]&lt;br /&gt;
[[Category:Admiral]]&lt;br /&gt;
[[Category:User Active]]&lt;br /&gt;
{{UserInfo|&lt;br /&gt;
username=Alain Ivars|&lt;br /&gt;
usercountry={{Flag_fr}}|&lt;br /&gt;
userlogin=choiceerp|&lt;br /&gt;
userdate=2010-11-03|&lt;br /&gt;
usercompany=Dippa|&lt;br /&gt;
userweb=http://www.dippa.fr|&lt;br /&gt;
usergrade={{LinkAdmiral}}|&lt;br /&gt;
userstatus=active}}&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20773</id>
		<title>Alain Ivars</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20773"/>
		<updated>2010-11-24T17:08:05Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Everybody]]&lt;br /&gt;
[[Category:Admiral]]&lt;br /&gt;
[[Category:User Active]]&lt;br /&gt;
{{UserInfo|&lt;br /&gt;
username=Alain Ivars|&lt;br /&gt;
usercountry={{Flag_fr}}|&lt;br /&gt;
userlogin=choiceerp|&lt;br /&gt;
userdate=2010-11-03|&lt;br /&gt;
usercompany=Dippa|&lt;br /&gt;
userweb=http://www.dippa.fr|&lt;br /&gt;
usergrade={{LinkAdmiral}}|&lt;br /&gt;
userstatus=Active|}}&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20771</id>
		<title>Alain Ivars</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Alain_Ivars&amp;diff=20771"/>
		<updated>2010-11-24T13:26:11Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: Created page with &amp;quot;Category:Everybody Category:Chasseur Category:User Active {{UserInfo| username=Alain Ivars| usercountry={{Flag_fr}}| userlogin=choiceerp| userdate=2010-11-03| usercom...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Everybody]]&lt;br /&gt;
[[Category:Chasseur]]&lt;br /&gt;
[[Category:User Active]]&lt;br /&gt;
{{UserInfo|&lt;br /&gt;
username=Alain Ivars|&lt;br /&gt;
usercountry={{Flag_fr}}|&lt;br /&gt;
userlogin=choiceerp|&lt;br /&gt;
userdate=2010-11-03|&lt;br /&gt;
usercompany=Dippa|&lt;br /&gt;
userweb=www.dippa.fr|&lt;br /&gt;
usergrade={{LinkFighter}}|&lt;br /&gt;
userstatus=Active|}}&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=DevCamp_Amiens_HackWeek_2010_Organization&amp;diff=20291</id>
		<title>DevCamp Amiens HackWeek 2010 Organization</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=DevCamp_Amiens_HackWeek_2010_Organization&amp;diff=20291"/>
		<updated>2010-09-22T06:56:29Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: /* Origine des participants */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateAssoFr}}&lt;br /&gt;
[[Category:Association]]&lt;br /&gt;
&lt;br /&gt;
= Nom et Adresse mail du contact relais Dolibarr =&lt;br /&gt;
&lt;br /&gt;
Houssin Régis : regis@dolibarr.fr&lt;br /&gt;
&lt;br /&gt;
= Nombre de participants prévus =&lt;br /&gt;
&lt;br /&gt;
12 participants.&lt;br /&gt;
&lt;br /&gt;
Toutefois, la présence des 12 ne sera pas sur toute la semaine.&lt;br /&gt;
Voir ici: http://rdv.dolibarr.pro/meeting/showua/h/8tk27&lt;br /&gt;
&lt;br /&gt;
= Conditions =&lt;br /&gt;
&lt;br /&gt;
Pour le transport, nous privilégions les moyens &amp;quot;éco-responsables&amp;quot;, comme le train. Pour ceux qui se déplaceraient en voiture, nous prendrons en compte, pour le remboursement des frais, la base d&#039;un billet de train équivalent.&lt;br /&gt;
Pour le train, nous achetons les billets et vous les envoyons par courrier.&lt;br /&gt;
&lt;br /&gt;
S&#039;il y a des cas particuliers ne rentrant pas dans ce cadre, je verrais avec le trésorier.&lt;br /&gt;
&lt;br /&gt;
Concernant l&#039;hébergement et la restauration, ils sont prévus dans les locaux du CREPS, accueillant régulièrement des groupes sportifs.&lt;br /&gt;
Si certains des participants ont des contraintes particulières (régime alimentaires, pb de mobilité ...) , merci de nous le signaler pour que nous en tenions compte.&lt;br /&gt;
&lt;br /&gt;
L&#039;urgence est de connaitre rapidement les besoins en transports.&lt;br /&gt;
Concernant les journées de présences, je part sur ce sondage : http://rdv.dolibarr.pro/meeting/showua/h/8tk27&lt;br /&gt;
En complément, il est nécessaire de savoir si les arrivées se font la veille ou le premier jour de présence et les départs, le jour même ou le lendemain matin.&lt;br /&gt;
&lt;br /&gt;
!! Si l&#039;un d&#039;entre vous est mineur, merci de le préciser !!&lt;br /&gt;
&lt;br /&gt;
= Origine des participants =&lt;br /&gt;
&lt;br /&gt;
*Régis Houssin : 71700 Tournus (sâone et loire)&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu : TRAIN&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur : non&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Laurent Destailleur : 92500 Rueil Malmaison&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) : Mercredi 24/11 vers 14h&lt;br /&gt;
**jour de départ (un seul pris en charge) : Dimanche 28/11 vers 15h&lt;br /&gt;
**moyen de déplacement prévu : VOITURE&lt;br /&gt;
**lieu de départ et de retour : Rueil Malmaison&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour : NA&lt;br /&gt;
**mineur : non&lt;br /&gt;
**contrainte alimentaire: aucune&lt;br /&gt;
&lt;br /&gt;
*Philippe Grand : 45160 Olivet&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur : non&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Maxime Longuet : 13014 Marseille&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Cyrille de Lambert : 44300 Nantes&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Erick Bullier : 34000 Montpellier (Hérault)&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Christophe Buffenoir : 31500 Toulouse&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) : 21 nov&lt;br /&gt;
**jour de départ (un seul pris en charge) : 27 nov&lt;br /&gt;
**moyen de déplacement prévu : train&lt;br /&gt;
**lieu de départ et de retour : gare de Toulouse Matabiau&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour : aller : 9h22 ou 11h17, retour : 9h13&lt;br /&gt;
**mineur : non&lt;br /&gt;
**contrainte alimentaire: allergie au café (mais pas au thé)&lt;br /&gt;
&lt;br /&gt;
*Stéphane Rivière : 17310 St Pierre d&#039;Oléron&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) : 24/11 arrivée au soir&lt;br /&gt;
**jour de départ (un seul pris en charge) : 28/11 retour le matin&lt;br /&gt;
**moyen de déplacement prévu : train&lt;br /&gt;
**lieu de départ et de retour : gare de surgères&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour : aller à 11h17, retour 13h45 (au départ de paris)&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Xavier Petit : 17550 Dolus d&#039;Oléron&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) : 24/11 arrivée au soir&lt;br /&gt;
**jour de départ (un seul pris en charge) : 28/11 retour le matin&lt;br /&gt;
**moyen de déplacement prévu : train&lt;br /&gt;
**lieu de départ et de retour : gare de surgères&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour : aller à 11h17, retour 13h45 (au départ de paris)&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Romain GUILLAUME : 75011 Paris&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Aurélien Imhof : 28240 Champrond en Gâtine&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu :&lt;br /&gt;
**lieu de départ et de retour :&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour :&lt;br /&gt;
**mineur :&lt;br /&gt;
**contrainte alimentaire:&lt;br /&gt;
&lt;br /&gt;
*Alain Ivars :&lt;br /&gt;
**jour d&#039;arrivée prévue (un seul pris en charge) :&lt;br /&gt;
**jour de départ (un seul pris en charge) :&lt;br /&gt;
**moyen de déplacement prévu : VOITURE&lt;br /&gt;
**lieu de départ et de retour : 78330 Fontenay-le-fleury&lt;br /&gt;
**horaires de départ des trains prévus en aller et retour : NA&lt;br /&gt;
**mineur : NON&lt;br /&gt;
**contrainte alimentaire: Aucune&lt;br /&gt;
&lt;br /&gt;
= Description du projet =&lt;br /&gt;
&lt;br /&gt;
* Finaliser les développements de la version 3.0 de Dolibarr&lt;br /&gt;
* Répartition des tâches pour les développements futurs&lt;br /&gt;
&lt;br /&gt;
= Motivations et objectifs de la semaine =&lt;br /&gt;
&lt;br /&gt;
* Mise au point des règles de développement&lt;br /&gt;
* Présentation du fonctionnement du cœur de Dolibarr&lt;br /&gt;
* Les objectifs de la version 3&lt;br /&gt;
* Coordination entre les membres&lt;br /&gt;
* Faire monter en compétence des collaborateurs&lt;br /&gt;
* Discussion autour de l&#039;intégration d&#039;un module comptabilité. &lt;br /&gt;
* Discussion autour du module de facturation récurrente.&lt;br /&gt;
* à compléter ...&lt;br /&gt;
&lt;br /&gt;
= Les besoins (dans la limite du raisonnable) =&lt;br /&gt;
&lt;br /&gt;
* Un tableau blanc (papier ou effaçable)&lt;br /&gt;
* Un vidéo projecteur&lt;br /&gt;
* Voir pour mettre en place un système de vidéo (et/ou audio) conférence&lt;br /&gt;
* à compléter si besoin...&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=19029</id>
		<title>Développement module</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=19029"/>
		<updated>2010-04-19T21:56:18Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: /* File:Art.png Créer un descripteur de Module (obligatoire) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Noyau]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
Pour créer un nouveau module, il existe plusieurs étapes. Ce didacticiel a pour but de vous décrire chacune d&#039;elle afin d&#039;ajouter un module permettant d&#039;étendre les possibilités de Dolibarr, comme par exemple ajouter une ou plusieurs des fonctionnalités suivantes:&lt;br /&gt;
* Ajouter de nouvelles tables en base&lt;br /&gt;
* Ajouter vos propres entrées dans les menus&lt;br /&gt;
* Ajouter des écrans de saisie/consultation de nouvelle tables&lt;br /&gt;
* Ajouter des exports prédéfinis pour la fonction export&lt;br /&gt;
* Ajouter de nouvelles boites pour la home page&lt;br /&gt;
* Définir de nouvelles permissions&lt;br /&gt;
* Déclencher du code automatiquement sur une action Dolibarr particulière&lt;br /&gt;
etc...&lt;br /&gt;
Toutes ces opérations ne sont possibles qu&#039;avec la version 2.4 ou plus de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Créer un descripteur de Module (obligatoire) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Obligatoire dès qu&#039;une extension est développée, quelque soit sa vocation.&lt;br /&gt;
&lt;br /&gt;
== Nom Interne de votre Module ==&lt;br /&gt;
Quand vous allez créé votre classe: &amp;quot;class modXXX extends DolibarrModules&amp;quot; ATTENTION: Le XXX &#039;&#039;&#039;DOIT&#039;&#039;&#039; être une série de caractère, ex: &amp;quot;MyModule&amp;quot;, mais &#039;&#039;&#039;les seuls caractères permis sont [A-Za-z] et la longueur MAX de XXX est de 12 caractères &#039;&#039;&#039;. Dans la version 2.9 sera ajouter le support du caractère &amp;quot;_&amp;quot; idans le nom de la classe et les caractères permis seront [A-Za-z_].&lt;br /&gt;
&lt;br /&gt;
== Créer votre descripteur ==&lt;br /&gt;
La première étape est donc de créer un fichier descripteur du module.&lt;br /&gt;
Pour cela, aller dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; et recopier le fichier modMyModule.class.php dans le répertoire&lt;br /&gt;
&#039;&#039;&#039;htdocs/includes/modules&#039;&#039;&#039;.&lt;br /&gt;
Ensuite, modifier le contenu de ce fichier afin de remplacer:&lt;br /&gt;
* les &#039;&#039;modMyModule&#039;&#039; en une valeur qui corresponde a la vocation de votre module. Cette valeur doit toujours commencer par &#039;mod&#039;.&lt;br /&gt;
* $this-&amp;gt;numero = &#039;&#039;10000&#039;&#039; par un numero de module libre (Aller dans la page &#039;&#039;&#039;Accueil -&amp;gt; Infos système -&amp;gt; Dolibarr -&amp;gt; Modules&#039;&#039;&#039; pour connaitre la liste des id module deja utilises).&lt;br /&gt;
* Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).&lt;br /&gt;
&lt;br /&gt;
* Créer le répertoire /htdocs/monmodule/&lt;br /&gt;
&lt;br /&gt;
Votre fichier descripteur de votre module est alors en place.&lt;br /&gt;
&lt;br /&gt;
== Tester votre descripteur ==&lt;br /&gt;
&lt;br /&gt;
Lancer Dolibarr et aller sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaitre une nouvelle ligne avec votre nouveau module et la possibilité de l&#039;activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu&#039;à le retrouver).&lt;br /&gt;
C&#039;est la valeur de $this-&amp;gt;special qui détermine dans quel onglet se trouve votre module.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Arborescence d&#039;un nouveau module (obligatoire à partir de la version 2.9) =&lt;br /&gt;
Créer un répertoire &#039;monmodule&#039; qui recevra les fichiers du module. Ce répertoire doit etre dans le répertoire &#039;&#039;&#039;htdocs&#039;&#039;&#039; et contiendra les sous-répertoires suivants:&lt;br /&gt;
&lt;br /&gt;
[[File:Arbo_module.png]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Créer vos tables SQL et la classe PHP des accesseurs (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si votre module a besoin de gérer des données qui lui sont propres&lt;br /&gt;
&lt;br /&gt;
== Créer vos fichiers .sql ==&lt;br /&gt;
Si votre module a vocation à gérer des données bien a lui, qui n&#039;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.&lt;br /&gt;
&lt;br /&gt;
Créer un sous-répertoire &#039;&#039;&#039;sql&#039;&#039;&#039; dans le repertoire de votre module (par exemple &#039;&#039;&#039;htdocs/monmodule/sql&#039;&#039;&#039;) afin d&#039;y placer les scripts sql que vous aller créer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Règles à respecter:&#039;&#039;&lt;br /&gt;
* Ajouter les fichiers d&#039;ordre de création de vos tables sur le principe d&#039;un fichier &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; par table accompagné éventuellement du fichier &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (voir les fichiers existants dans &#039;&#039;&#039;includes/mysql/tables&#039;&#039;&#039; pour exemple).&lt;br /&gt;
* Pour ce qui est des ordres de gestion des données, ils doivent tous se trouver dans un fichier nommé &#039;&#039;&#039;data.sql&#039;&#039;&#039; situé dans le même répertoire &#039;&#039;&#039;/monmodule/sql/&#039;&#039;&#039;.&lt;br /&gt;
Exemple de contenu de fichier data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les ordres SQL des fichiers doivent être opérationnels pour la base de données &#039;&#039;&#039;mysql&#039;&#039;&#039;.&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Tester vos fichier .sql ==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
Les tables doivent alors être recréées par l&#039;activation du module.&lt;br /&gt;
Si tel n&#039;est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Générer la classe PHP d&#039;accès (DAO) ==&lt;br /&gt;
&lt;br /&gt;
Une fois votre ou vos tables créées en base, aller dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, copiez le fichier &#039;&#039;&#039;build_class_from_table.php&#039;&#039;&#039; dans le répertoire sql/ de votre module, et lancez le script&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;php build_class_from_table.php nomtable&amp;lt;/source&amp;gt;&lt;br /&gt;
Remarque: Si la commande ne fonctionne pas, essayer d&#039;utiliser php-cli plutot que php.&lt;br /&gt;
&lt;br /&gt;
Ceci génèrera un fichier &#039;&#039;&#039;out.nomtable.class.php&#039;&#039;&#039; qui contient la classe de gestion de la table nomtable.&lt;br /&gt;
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&#039;une ligne de la table.&lt;br /&gt;
Supprimer juste le &amp;quot;out&amp;quot; du nom de fichier et placer votre fichier dans le sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple).&lt;br /&gt;
&lt;br /&gt;
Un fichier &#039;&#039;&#039;out.nomtable_script.php&#039;&#039;&#039; a également été généré et contient un exemple de code pour utiliser la classe pour chacune des 4 méthodes CRUD.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Affichage des onglets (optionnel) =&lt;br /&gt;
&lt;br /&gt;
== Ajouter vos onglets sur les fiches entités ==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour ajouter votre propre onglet parmi les onglets standard d&#039;une fiche entité (facture, commande, proposition commercial, adhérent...)&lt;br /&gt;
&lt;br /&gt;
Pour cela, aller dans le fichier descripteur de module précédemment créé et modifier le tableau $this-&amp;gt;tabs:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;product:TabTitle:@mymodule:/mymodule/mynewpage.php?id=__ID__&#039;);&lt;br /&gt;
	// where entity can be&lt;br /&gt;
	// &#039;thirdparty&#039;       to add a tab in third party view&lt;br /&gt;
	// &#039;intervention&#039;     to add a tab in intervention view&lt;br /&gt;
	// &#039;supplier_order&#039;   to add a tab in supplier order view&lt;br /&gt;
	// &#039;supplier_invoice&#039; to add a tab in supplier invoice view&lt;br /&gt;
	// &#039;invoice&#039;          to add a tab in customer invoice view&lt;br /&gt;
	// &#039;order&#039;            to add a tab in customer order view&lt;br /&gt;
	// &#039;product&#039;          to add a tab in product view&lt;br /&gt;
	// &#039;propal&#039;           to add a tab in propal view&lt;br /&gt;
	// &#039;member&#039;           to add a tab in foundation member view&lt;br /&gt;
	// &#039;contract&#039;         to add a tab in contract view&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Le tableau doit contenir une liste de chaine, chaque chaine représentant un nouvel onglet.&lt;br /&gt;
Le format de la chaine étant composée de 4 parties séparées par &amp;quot;:&amp;quot;&lt;br /&gt;
* Partie 1: Le code entité dans lequel doit apparaitre l&#039;onglet qui est une valeur parmi celle-ci:&lt;br /&gt;
** &#039;thirdparty&#039;&lt;br /&gt;
** &#039;intervention&#039;&lt;br /&gt;
** &#039;supplier_order&#039;&lt;br /&gt;
** &#039;supplier_invoice&#039;&lt;br /&gt;
** &#039;invoice&#039;&lt;br /&gt;
** &#039;order&#039;&lt;br /&gt;
** &#039;product&#039;&lt;br /&gt;
** &#039;propal&#039;&lt;br /&gt;
** &#039;member&#039;&lt;br /&gt;
** &#039;contract&#039;&lt;br /&gt;
* Partie 2: Le titre de l&#039;onglet. Cela peut être un libellé en dur ou mieux un code traduction présent dans un fichier lang.&lt;br /&gt;
* Partie 3: Le nom du fichier .lang (sans l&#039;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&#039;est à dire htdocs/mymodule/langs/code_CODE/mymodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mymodyle.lang&lt;br /&gt;
* Partie 4: L&#039;url de la page à afficher quand on clique sur l&#039;onglet. La chaine __ID__ sera remplacée automatiquement par l&#039;Id de l&#039;entité concernée.&lt;br /&gt;
&lt;br /&gt;
Pour alimenter le contenu de l&#039;onglet avec des données issues de la base, voir le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
== Ajouter les onglets d&#039;une fiche entité sur ses propres pages ==&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039; : Pour afficher les onglets standard d&#039;une fiche entité (produit, tiers, etc.) sur votre propre page onglet d&#039;une entité.&lt;br /&gt;
&lt;br /&gt;
Il faut appliquer la procédure suivante :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour chaque fiche entité, il y a deux fichiers à inclure avec l&#039;instruction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;require_once($url_fichier) ;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici la liste de ces fichiers (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :&lt;br /&gt;
* Entité tiers (thirdparty) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/societe.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/company.lib.php&lt;br /&gt;
* Entité produit (product) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/product.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/product.lib.php&lt;br /&gt;
* Entité facture (invoice) :&lt;br /&gt;
** DOL_DOCUMENT_ROOT/facture.class.php&lt;br /&gt;
** DOL_DOCUMENT_ROOT/lib/invoice.lib.php&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer et charger l&#039;objet à afficher dans votre onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créer l&#039;objet de la classe voulue, et récupérer les données de l&#039;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&#039;identifiant de l&#039;objet que vous récupérez depuis l&#039;url (ex : /mononglet.php?id=1).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$id=$_GET[&amp;quot;id&amp;quot;];&lt;br /&gt;
$product = new Product($db) ;&lt;br /&gt;
$result = $product-&amp;gt;fetch($id) ; //Tester $result pour vérifier que l&#039;accès à la base s&#039;est bien passé&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;3. Récupérer la liste des onglets correspondants à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utiliser la fonction XXX_prepare_head($obj), ou XXX est le nom de l&#039;entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l&#039;objet pour lequel vous voulez afficher les onglets.&lt;br /&gt;
&lt;br /&gt;
Le tableau retourné est composé de la façon suivante :&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head        // Tableau des onglets&lt;br /&gt;
$head[$h]    // Élément décrivant un onglet. Il y aura autant de $h que d&#039;onglets à afficher&lt;br /&gt;
$head[$h][0] // Url de la page affichée quand on clique sur l&#039;onglet&lt;br /&gt;
$head[$h][1] // Titre de l&#039;ongLet&lt;br /&gt;
$head[$h][2] // Code de l&#039;onglet, à utiliser pour choisir quel onglet sera &#039;actif&#039; (voir paragraphe suivant)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple :&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$head = product_prepare_head($product, $user) ; //le paramètre $user n&#039;est pas présent sur certaines fonctions&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;4. Afficher les onglets sur votre page onglet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utiliser la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_fiche_head($links, $active=&#039;0&#039;, $title=&#039;&#039;, $notab=0, $picto=&#039;&#039;)&lt;br /&gt;
$links  // Tableau des onglets, appelé $head plus haut.&lt;br /&gt;
$active // Onglet actif (mettre le nom de l&#039;onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance&lt;br /&gt;
$title  // ?&lt;br /&gt;
$notab  // Mettre ce paramètre à 1 permet de ne pas afficher de zone bleue en dessous des onglets.&lt;br /&gt;
$picto  // Nom de l&#039;image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :&lt;br /&gt;
//            product&lt;br /&gt;
//            service&lt;br /&gt;
//            company&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cette fonction affiche les onglets voulus et ouvre un élément &#039;&#039;&amp;lt; div class=&amp;quot;&amp;quot; &amp;gt;&#039;&#039; qui correspond à la zone bleue sous les onglets (si paramètre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l&#039;élément &#039;&#039;&amp;lt; /div &amp;gt;&#039;&#039; dans le code PHP.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Remarque&#039;&#039;:&lt;br /&gt;
Pour plus de détail, se référer à la [http://www.dolibarr.fr/doxygen/ documentation Doxygen] ou directement au code de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Créer vos pages écran PHP (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si l&#039;objet de votre module est d&#039;ajouter des fonctionnalités qui nécessitent de nouveaux écrans.&lt;br /&gt;
&lt;br /&gt;
== Créer une page écran PHP brute ==&lt;br /&gt;
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 &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; (Pour le développement d&#039;un script en ligne de commande, voir [[Développement de scripts]]).&lt;br /&gt;
&lt;br /&gt;
Pour créer une nouvelle page écran utilisateur, créer un sous-répertoire de &#039;&#039;&#039;htdocs&#039;&#039;&#039; (si non déjà fait) propre à votre module (Dans &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; par exemple) afin d&#039;y placer les pages que vous aller créer.&lt;br /&gt;
&lt;br /&gt;
Y recopier le fichier &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039; qui va servir de point de départ.&lt;br /&gt;
Modifier le fichier afin que le chemin relatif du&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include(&amp;quot;../../main.inc.php)&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
soit correct, en fonction de la profondeur de répertoire dans laquelle se trouve le fichier (Enlever ou supprimer des &amp;quot;../&amp;quot;).&lt;br /&gt;
C&#039;est dans le main qu&#039;est chargé l&#039;environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:&lt;br /&gt;
&lt;br /&gt;
* $user    L&#039;objet qui contient les caractéristiques de l&#039;utilisateur + ses droits.&lt;br /&gt;
* $conf    L&#039;objet qui contient la configuration de Dolibarr.&lt;br /&gt;
* $db      L&#039;objet qui contient le handler de connexion ouvert à la base de données.&lt;br /&gt;
* $langs   L&#039;objet qui contient la langue de l&#039;utilisateur.&lt;br /&gt;
&lt;br /&gt;
Saisissez ensuite votre code pour afficher la page.&lt;br /&gt;
&lt;br /&gt;
== Créer une page écran PHP par template Smarty ==&lt;br /&gt;
=== Compléter votre descripteur de module ===&lt;br /&gt;
Dans votre descripteur de module, compléter la déclaration du tableau this-&amp;gt;const afin d&#039;ajouter la constante MAIN_MODULE_monmodule_NEEDSMARTY.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;const=array(1=&amp;gt;array(&#039;MAIN_MODULE_MONMODULE_NEEDSMARTY&#039;,&#039;chaine&#039;,1,&#039;Need smarty&#039;,0));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ceci aura pour effet, lors de l&#039;initialisation de l&#039;objet $conf, de remplir le tableau $conf-&amp;gt;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.&lt;br /&gt;
&lt;br /&gt;
=== Réaliser vos pages templates ===&lt;br /&gt;
Construisez vos pages templates (fichiers &#039;&#039;&#039;mespages.tpl&#039;&#039;&#039;) dans le répertoire &#039;&#039;&#039;htdocs/monmodule/templates&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Réaliser vos pages PHP ===&lt;br /&gt;
Réaliser vos pages écrans PHP Dolibarr en suivant le modèle décrit dans cette documentation.&lt;br /&gt;
La différence est qu&#039;à la fin, pour afficher la présentation HTML, il vous faut ajouter la séquence suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$smarty-&amp;gt;template_dir = DOL_DOCUMENT_ROOT.&#039;/monmodule/templates/&#039;;&lt;br /&gt;
$mc-&amp;gt;assign_smarty_values($smarty,$_GET[&amp;quot;action&amp;quot;]);&lt;br /&gt;
$smarty-&amp;gt;display($template);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
L&#039;objet $smarty n&#039;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.&lt;br /&gt;
&lt;br /&gt;
== Accès à la base ==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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&#039;enregistrement). Dans ce cas, pensez à suivre ces exemples:&lt;br /&gt;
&lt;br /&gt;
Pour un insert, update ou delete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Debut transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;Ma requete insert, update ou delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Valide&lt;br /&gt;
ou $db-&amp;gt;rollback()  // Annule&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour une lecture:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;Ma requete select&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Définition du style ==&lt;br /&gt;
Pour que le look de la page soit aligné avec le thème Dolibarr, il est nécessaire d&#039;utiliser les styles des CSS de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Par exemple:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; pour une ligne de titre de tableau.&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; ou class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; sur les balises &#039;&#039;tr&#039;&#039; et &#039;&#039;td&#039;&#039; des lignes de donnees de tableau.&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; sur tous les champs de saisie (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; sur les objets de type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Utiliser le sélecteur de date de Dolibarr ==&lt;br /&gt;
&lt;br /&gt;
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$form=new Form($db);&lt;br /&gt;
$form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
La chaine mykey identifie la zone date. Il faut y mettre une valeur différente s&#039;il y a plusieurs zones.&lt;br /&gt;
La chaine myform est le nom de la zone FORM (dans form name=&amp;quot;myform&amp;quot; de la page HTML).&lt;br /&gt;
L&#039;affichage d&#039;un sélecteur de date doit donc être intégrée dans une zone FORM Html.&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la valeur, à l&#039;issu du POST, la commande est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir votre page de configuration (optionnel)  =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si votre module offre plusieurs options paramétrables.&lt;br /&gt;
&lt;br /&gt;
== Creer votre page d&#039;édition de configuration ==&lt;br /&gt;
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 &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Créer une page PHP nommée &#039;&#039;&#039;monmodule_setupapage.php&#039;&#039;&#039; qui affiche les options possibles et les met à jour.&lt;br /&gt;
Il est nécessaire de prendre exemple sur une page dans &#039;&#039;&#039;/admin&#039;&#039;&#039; qui vous montre la méthode pour lire ou sauvegarder en base votre option.&lt;br /&gt;
Placer cette page de configuration dans le répertoire &#039;&#039;&#039;/admin&#039;&#039;&#039; également.&lt;br /&gt;
Ensuite dans le descripteur de module, modifier la variable pour indiquer le nom de cette page PHP (sans le chemin qui n&#039;est pas nécessaire, la page étant forcément dans le rep admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;monmodule_setupapage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tester votre page ==&lt;br /&gt;
Allez sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaitre une icône qui permet d&#039;accéder à la page de configuration et vous devez être capable de modifier ces options et les voir conservées en base.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos entrées de menu (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.&lt;br /&gt;
&lt;br /&gt;
== Définissez vos entrées menus ==&lt;br /&gt;
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this-&amp;gt;menu qui déclare les menus.&lt;br /&gt;
Ce tableau contient toutes les entrées qui apparaitront dans les menus une fois le module activé.&lt;br /&gt;
Le fichier de descripteur de module exemple &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; possède un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.&lt;br /&gt;
&lt;br /&gt;
Voici un exemple de déclaration d&#039;entrées de menu dans le fichier descripteur:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;1&#039;,		// 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).&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;r=0&#039;,		// Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry)&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pour conditionner l&#039;accès au menu selon des permission, modifier la propriété &#039;&#039;&#039;perms&#039;&#039;&#039; du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.&lt;br /&gt;
&lt;br /&gt;
== Tester vos entrées menus ==&lt;br /&gt;
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaitre (si la condition dans &#039;enabled&#039; est vraie).&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos propres permissions (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si vous voulez ajouter de nouvelles permissions.&lt;br /&gt;
&lt;br /&gt;
La définition des permissions que gèrera votre module se fait dans le fichier descripteur créé dans la première étape.&lt;br /&gt;
Modifier la ligne &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;monmodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
pour y mettre la bonne valeur de monmodule.&lt;br /&gt;
&lt;br /&gt;
Ensuite remplissez le tableau $this-&amp;gt;rights avec autant d&#039;entrées que de permissions différentes à gérer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Libelle par défaut de ma permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;sousaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu &#039;&#039;&#039;Infos Système&#039;&#039;&#039; sur une installation de Dolibarr opérationnelle pour connaitre les id déjà utilisés.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][3], mettre 1 si cette permission est attribué d&#039;office par défaut quand un utilisateur est créé.&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n&#039;est trouvé pour votre permission dans le fichier &#039;&#039;&#039;admin.lang&#039;&#039;&#039;).&lt;br /&gt;
Dans $this-&amp;gt;rights[$r][4] et $this-&amp;gt;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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;monmodule-&amp;gt;action-&amp;gt;sousaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos propres box (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si votre module amène avec lui une ou plusieurs Boxes.&lt;br /&gt;
&lt;br /&gt;
== Définissez vos box ==&lt;br /&gt;
Pour cela, modifier les tableaux $this-&amp;gt;boxes du fichier descripteur de module.&lt;br /&gt;
Il suffit d&#039;ajouter une ligne par fichier box qui se trouve dans le répertoire &#039;&#039;&#039;htdocs/includes/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Exemple:&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
this-&amp;gt;boxes[0][1]=&#039;mabox0.php&#039;&lt;br /&gt;
this-&amp;gt;boxes[1][1]=&#039;mabox1.php&#039;&lt;br /&gt;
this-&amp;gt;boxes[2][1]=&#039;mabox2.php&#039;&lt;br /&gt;
...&lt;br /&gt;
this-&amp;gt;boxes[n][1]=&#039;maboxn.php&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensuite creer les fichiers mabox0.php, mabox1.php... en prenant exemple sur des box existantes (dans le répertoire htdocs/include/boxes&lt;br /&gt;
&lt;br /&gt;
== Tester la présence de vos box dans Dolibarr ==&lt;br /&gt;
Désactiver et réactiver le module.&lt;br /&gt;
&lt;br /&gt;
Aller dans le menu &#039;&#039;&#039;Accueil - Configuration - Boite&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Vos box doivent apparaitre dans la liste des box activables. Activer les puis aller sur la page d&#039;accueil et vérifier qu&#039;elles s&#039;affichent correctement.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos propres exports (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: 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&#039;un autre module de Dolibarr).&lt;br /&gt;
&lt;br /&gt;
== Définissez l&#039;export ==&lt;br /&gt;
Pour cela, décommenter et modifier les tableaux $this-&amp;gt;export_xxx du votre fichier descripteur de module.&lt;br /&gt;
&lt;br /&gt;
== Tester votre export ==&lt;br /&gt;
Aller dans le menu outils -&amp;gt; export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponible (si votre module est bien activé).&lt;br /&gt;
Le choisir, vous devez alors voir les champs possible définis dans le tableau à l&#039;étape précédente.&lt;br /&gt;
Choisir quelques champs et tenter une génération du fichier export.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos styles CSS (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thèmes de Dolibarr (non recommandé).&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4&lt;br /&gt;
&lt;br /&gt;
== Créer et déclarer votre feuille de style ==&lt;br /&gt;
Créer un fichier de style css nommé &#039;&#039;&#039;monmodule.css&#039;&#039;&#039; et le placer dans le répertoire &#039;&#039;&#039;&#039;&#039;monmodule&#039;&#039;&#039;&#039;&#039; dans &#039;&#039;&#039;htdocs&#039;&#039;&#039;. Il ne peut y avoir qu&#039;un fichier css propre à chaque module.&lt;br /&gt;
Rappelons qu&#039;il vaut mieux utiliser les styles déjà existant de Dolibarr (le fichier css utilisé par Dolibarr étant le fichier &#039;&#039;&#039;themes/nomtheme/&#039;&#039;nomtheme&#039;&#039;.php.css&#039;&#039;&#039;. Ne créer un fichier css propre à votre module que si vous devez absolument gérer des styles non déjà existants.&lt;br /&gt;
Une fois votre feuille de style prête, déclarer la dans votre fichier descripteur de module en modifiant la propriété &#039;&#039;&#039;$this-&amp;gt;style_sheet&#039;&#039;&#039;.&lt;br /&gt;
La valeur à renseigner ici doit être le chemin relatif de l&#039;URL de votre fichier css.&lt;br /&gt;
Par exemple &#039;/monmodule/monfichier.css&#039;.&lt;br /&gt;
&lt;br /&gt;
== Tester votre feuille de style ==&lt;br /&gt;
Désactiver et réactiver votre module.&lt;br /&gt;
&lt;br /&gt;
Appelez la page d&#039;accueil de Dolibarr. Afficher la source de la page HTML.&lt;br /&gt;
&lt;br /&gt;
Vous devriez voir dans l&#039;entête HTML, une ligne déclarant votre feuille de style.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Définir vos fonctions Javascript (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si dans vos écrans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)&lt;br /&gt;
&lt;br /&gt;
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 fichiers javascript &#039;&#039;&#039;monmodule.js&#039;&#039;&#039; soit chargées dans l&#039;entête head html.&lt;br /&gt;
Pour demander à Dolibarr qui gère la génération de la section header d&#039;inclure un de vos fichiers javascript, il est nécessaire de déclarer votre fichier javascript dans le descripteur de module.&lt;br /&gt;
&lt;br /&gt;
Cette fonctionnalité n&#039;est pas encore possible.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Déclencher du code sur un évènement Dolibarr (optionnel) =&lt;br /&gt;
&#039;&#039;&#039;Quand&#039;&#039;&#039;: Si vous voulez que des actions particulières s&#039;exécutent suite au déclenchement d&#039;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 &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Voir aussi [[Interfaces_Dolibarr_vers_exterieur|Interfaces de Dolibarr vers l&#039;exterieur]]&lt;br /&gt;
et [[Interfaces_Exterieur_vers_Dolibarr|Interfaces exterieures vers Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Créer un package pour livrer et installer votre module =&lt;br /&gt;
&lt;br /&gt;
* Aller dans le répertoire &#039;&#039;&#039;/build&#039;&#039;&#039; et recopier le fichier &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; en &#039;&#039;&#039;makepack-monmodule.conf&#039;&#039;&#039;. Attention, ce répertoire peut ne pas être fourni dans les packages de versions stables. Si c&#039;est le cas, il peut être récupéré dans le snapshot CVS 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).&lt;br /&gt;
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...)&lt;br /&gt;
&lt;br /&gt;
* Lancer le script via Perl (besoin de la version Perl 5.0 ou +):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Le script vous demande le nom de votre module, sa version majeure et mineure.&lt;br /&gt;
Un fichier &#039;&#039;&#039;monmodule.tgz&#039;&#039;&#039; va alors être fabriqué contenant votre module prêt pour être déployé.&lt;br /&gt;
&lt;br /&gt;
* La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d&#039;installation de Dolibarr et réaliser la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier tgz) sur le site web de Dolibarr dans la section téléchargements: http://www.dolibarr.org -&amp;gt; downloads -&amp;gt; contrib -&amp;gt; submit a file (vous devez avoir créer un compte auparavant et être loggué pour que le lien apparaisse).&lt;br /&gt;
** Si votre module a été fabriqué correctement, le fichier sera validé rapidement.&lt;br /&gt;
** Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s&#039;avère être d&#039;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).&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Quelques règles de codage =&lt;br /&gt;
Les règles de codage à suivre sont définis dans la [[Documentation Développeur|Documentation développeur]], rubrique &amp;quot;Informations Générales - Langage et normes de développement&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Utilisation du MDA =&lt;br /&gt;
Une méthode pour générer un module fonctionnel depuis l&#039;UML est en cours de mise au point. Plus d&#039;informations sur la page [[UML2Dolibarr - Générer un module par MDA]].&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_development&amp;diff=19028</id>
		<title>Module development</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_development&amp;diff=19028"/>
		<updated>2010-04-19T21:10:28Z</updated>

		<summary type="html">&lt;p&gt;Choiceerp: /* File:Art.png Create a descriptor of Module (required) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Core]]&lt;br /&gt;
{{TemplateDocDevEn}}&lt;br /&gt;
&lt;br /&gt;
To create a new module/addon for Dolibarr, there is several steps. This tutorial will describe you each of them to build a module to extend Dolibarr features, like one or several of the following :&lt;br /&gt;
* Add new tables in database&lt;br /&gt;
* Add your own menu entries&lt;br /&gt;
* Add new screens to edit new tables&lt;br /&gt;
* Add predefined exports for the internal export tool&lt;br /&gt;
* Add new information boxes in the home page&lt;br /&gt;
* Define new permissions&lt;br /&gt;
* Execute code automatically triggered by a particular Dolibarr action&lt;br /&gt;
etc...&lt;br /&gt;
All those operations are possible with version 2.4 or more of Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Following chapters presents how to do all of this manually with an easy way. For experienced developers, a method to do this using MDA generation is also on the work. See last chapter for this.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Create a descriptor of Module (required) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: Required as soon as an addon is developed, whatever is its goal.&lt;br /&gt;
&lt;br /&gt;
== Internal Name of your Module ==&lt;br /&gt;
When you will create your class &amp;quot;class modXXX extends DolibarrModules&amp;quot; WARNING: The XXX &#039;&#039;&#039;MUST&#039;&#039;&#039; me set to a serie of alpha character, &amp;quot;MyModule&amp;quot;, but &#039;&#039;&#039;the only character permit are [A-Za-z] and the MAX len of the XXX is 12 characters&#039;&#039;&#039;. In the 2.9 version will be add the support of the character &amp;quot;_&amp;quot; in the class name and the character permit will be [A-Za-z_].&lt;br /&gt;
&lt;br /&gt;
== Create your module descriptor ==&lt;br /&gt;
The first step is to create a file descriptor for the module. To do this go into the directory dev/skeletons and copy the file modMyModule.class.php in the directory htdocs/includes/modules.&lt;br /&gt;
Then change the contents of this file to replace:&lt;br /&gt;
&lt;br /&gt;
* all &amp;quot;modMyModule&amp;quot; with a value which corresponds to the vocation of your module. This value must always start with &#039;mod&#039;.&lt;br /&gt;
* $this-&amp;gt;numero = 10000 by a number of free module (Go to &#039;&#039;&#039;Home page -&amp;gt; System Information -&amp;gt; Dolibarr -&amp;gt; Modules&#039;&#039;&#039; to know id the list of modules used).&lt;br /&gt;
* Modify any other variables defined in the constructor (see comment in the code skeleton for their meaning). &lt;br /&gt;
* Create directory /htdocs/mymodule/&lt;br /&gt;
Your file descriptor for your module is ready.&lt;br /&gt;
&lt;br /&gt;
== Test your descriptor ==&lt;br /&gt;
&lt;br /&gt;
Launch Dolibarr and go to page &#039;&#039;&#039;Setup-&amp;gt;module&#039;&#039;&#039;? You must see a new line with your new module and the possibility to activate it or not (browse all the tabs of each category of modules to find it). It&#039;s value of $this-&amp;gt;special that determines in which tab will be your module.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Path of a new module (required) =&lt;br /&gt;
Create a directory &#039;mymodule&#039; that will receive all files of your module. This directory must be inside the &#039;&#039;&#039;htdocs&#039;&#039;&#039; directory and will contains following subdirectories:&lt;br /&gt;
[[File:Path.jpg|300px]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Create your SQL tables and the PHP accessor class (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If your module needs to manage data of its own&lt;br /&gt;
&lt;br /&gt;
== Create your .sql file ==&lt;br /&gt;
If your module is designed to manage data of its own, which are not available in the standard version of Dolibarr, it is necessary to define SQL tables to store the data.&lt;br /&gt;
&lt;br /&gt;
Files for your own module must be placed in a directory.&lt;br /&gt;
&lt;br /&gt;
Create a subdirectory called &amp;quot;sql&amp;quot; into directory of your module (eg htdocs/mymodule/sql) to put the sql scripts that you will create. Then in the &amp;quot;load_tables&amp;quot; function of your file descriptor module, modify the line&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$dir = DOL_DOCUMENT_ROOT.&#039;/mymodule/sql/&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
by&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;$dir = DOL_DOCUMENT_ROOT.&#039;/valuechooseformymodule/sql/&#039;;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Rules to follow:&#039;&#039;&lt;br /&gt;
* Add the files about creating tables commands on the principle of a file &#039;&#039;&#039;llx_matable.sql&#039;&#039;&#039; per table with a possibly file &#039;&#039;&#039;llx_matable.key.sql&#039;&#039;&#039; (see existing files in &#039;&#039;&#039;includes/mysql/tables&#039;&#039;&#039; for examples).&lt;br /&gt;
&lt;br /&gt;
* To manage data, you must create a file called &#039;&#039;&#039;data.sql&#039;&#039;&#039; inside directory &#039;&#039;&#039;/mymodule/sql/&#039;&#039;&#039; that contains SQL command to add/edit/delete datas.&lt;br /&gt;
&lt;br /&gt;
Example of content of a file data.sql&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
 delete from llx_const where name=&#039;MYMODULE_IT_WORKS&#039; and entity=&#039;__ENTITY__&#039;;&lt;br /&gt;
 insert into llx_const (name, value, type, note, visible, entity) values (&#039;MYMODULE_IT_WORKS&#039;,&#039;1&#039;,&#039;chaine&#039;,&#039;A constant vor my module&#039;,1,&#039;__ENTITY__&#039;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Files must be operational for the database mysql. Rem: The files of other databases are not maintained. They will be read and converted on the fly by the driver of the other database.&lt;br /&gt;
&lt;br /&gt;
== Test your .sql files ==&lt;br /&gt;
&lt;br /&gt;
Once the files ready, you can return to Dolibarr to disable the module, dropper tables in database and reactivate the module. The tables should be recreated by the activation of the module. If this is not the case, check your scripts by passing them by hand, or check the Dolibarr logs.&lt;br /&gt;
&lt;br /&gt;
== Generate the accessors PHP class (DAO) ==&lt;br /&gt;
Once you have created your tables into the database, move to the dev/skeletons directory and run the script&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;php build_class_from_table.php tablename&amp;lt;/source&amp;gt;&lt;br /&gt;
Note: If the command does not work, try to use php-cli php instead.&lt;br /&gt;
&lt;br /&gt;
This will generate a file &#039;&#039;&#039;out.tablename.class.php&#039;&#039;&#039; that contains the class to manage table tablename. &lt;br /&gt;
In this class, you can find the CRUD methods (Create / Read / Update / Delete) already working to do an insert, a fetch (select), an update, a delete of a row in table.&lt;br /&gt;
Remove just the &amp;quot;out&amp;quot; from the file name and put the file in a subdirectory of &#039;&#039;&#039;htdocs&#039;&#039;&#039; specific to your module (in htdocs/mymodule for example).&lt;br /&gt;
&lt;br /&gt;
A file &#039;&#039;&#039;out.tablename_script.php&#039;&#039;&#039; has been generated and contains a sample code to use the class for each of the 4 CRUD methods.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Add your own tabs on entities sheets (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: To add a tab on an entity (invoices, orders, proposals, member ...)&lt;br /&gt;
&lt;br /&gt;
To do this go into the file descriptor of module previously created and edit the $this-&amp;gt;tabs array:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
	// Array to add new pages in new tabs&lt;br /&gt;
	$this-&amp;gt;tabs = array(&#039;product:TabTitle:@mymodule:/mymodule/mynewpage.php?id=__ID__&#039;);&lt;br /&gt;
	// where entity can be&lt;br /&gt;
	// &#039;thirdparty&#039;       to add a tab in third party view&lt;br /&gt;
	// &#039;intervention&#039;     to add a tab in intervention view&lt;br /&gt;
	// &#039;supplier_order&#039;   to add a tab in supplier order view&lt;br /&gt;
	// &#039;supplier_invoice&#039; to add a tab in supplier invoice view&lt;br /&gt;
	// &#039;invoice&#039;          to add a tab in customer invoice view&lt;br /&gt;
	// &#039;order&#039;            to add a tab in customer order view&lt;br /&gt;
	// &#039;product&#039;          to add a tab in product view&lt;br /&gt;
	// &#039;propal&#039;           to add a tab in proposal view&lt;br /&gt;
	// &#039;member&#039;           to add a tab in foundation member view&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The table should contain a list of strings, each string representing a new tab. &lt;br /&gt;
The format of the string consisting of 4 parts separated by &amp;quot;:&amp;quot;&lt;br /&gt;
* Part 1: The entity code which should appear in the tab is a value from the following:&lt;br /&gt;
** &#039;thirdparty&#039;&lt;br /&gt;
** &#039;intervention&#039;&lt;br /&gt;
** &#039;supplier_order&#039;&lt;br /&gt;
** &#039;supplier_invoice&#039;&lt;br /&gt;
** &#039;invoice&#039;&lt;br /&gt;
** &#039;order&#039;&lt;br /&gt;
** &#039;product&#039;&lt;br /&gt;
** &#039;propal&#039;&lt;br /&gt;
** &#039;member&#039;&lt;br /&gt;
* Part 2: The title of the tab. This can be a hard read or better code translation in a file lang.&lt;br /&gt;
* Part 3: The name of the file. Lang which contains correspondence between the code translation and language to display. If this name start with @, Dolibarr will search translation file into the lang file of module, so htdocs/mymodule/langs/code_CODE/mymodule.lang, otherwise Dolibarr will look for file htdocs/langs/code_CODE/mymodyle.lang &lt;br /&gt;
* Part 4: The url of the page to display when you click on the tab. The __ID__ string will be replaced automatically by the Id of the entity concerned.&lt;br /&gt;
&lt;br /&gt;
To feed the contents of the tab with data from the database, see the next chapter.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Create your own PHP screens (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If the purpose of your module is to add features that require new screens.&lt;br /&gt;
&lt;br /&gt;
== Create a PHP screen ==&lt;br /&gt;
You must then create your PHP pages that will show/edit data from tables using the skeleton templates provided as an example in the directory &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039; (For the development of a script from the command line, see [[Script development]]).&lt;br /&gt;
&lt;br /&gt;
To create a new user screen, create a subdirectory of &#039;&#039;&#039;htdocs&#039;&#039;&#039; (if not already done) for your module (in &#039;&#039;&#039;htdocs/monmodule&#039;&#039;&#039; for example) to store the pages you will create.&lt;br /&gt;
&lt;br /&gt;
Copy, into that directory, the file &#039;&#039;&#039;skeletons_page.php&#039;&#039;&#039; that will serve as a starting point for your page file.&lt;br /&gt;
Edit the file to have a correct relative path to the main.inc.php file.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
include(&amp;quot;../../main.inc.php)&amp;quot;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This depends on the depth of the directory in which the file is (Add or remove &amp;quot;../&amp;quot;). &lt;br /&gt;
It&#039;s in the main.inc.php file that is loaded technical environment variables and permissions. The following variables are objects positioned in this file:&lt;br /&gt;
&lt;br /&gt;
* $user    Objet that contains the characteristics of the user + his permissions.&lt;br /&gt;
* $conf    Objet that contains Dolibarr configuration.&lt;br /&gt;
* $db      Objet that contains an opened connection handler to the database.&lt;br /&gt;
* $langs   Objet that contains the user&#039;s language.&lt;br /&gt;
&lt;br /&gt;
Then enter your code to display the page.&lt;br /&gt;
&lt;br /&gt;
== Database access ==&lt;br /&gt;
If you need to edit some data in database inside you own table, use the PHP class generated before.&lt;br /&gt;
&lt;br /&gt;
If you to make access to tables with no dedicated PHP class available, this is always possible (for example if you want to get a list of records with a particular join or filter). In this case, this is a code samples to follow:&lt;br /&gt;
&lt;br /&gt;
To make an insert, update or delete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$db-&amp;gt;begin();   // Start transaction&lt;br /&gt;
$db-&amp;gt;query(&amp;quot;My SQL request insert, update or delete&amp;quot;);&lt;br /&gt;
$db-&amp;gt;commit();       // Validate transaction&lt;br /&gt;
or $db-&amp;gt;rollback()  // Cancel transaction&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$resql=$db-&amp;gt;query(&amp;quot;My select request&amp;quot;);&lt;br /&gt;
if ($resql)&lt;br /&gt;
{&lt;br /&gt;
	$num = $db-&amp;gt;num_rows($resql);&lt;br /&gt;
	$i = 0;&lt;br /&gt;
	if ($num)&lt;br /&gt;
	{&lt;br /&gt;
		while ($i &amp;lt; $num)&lt;br /&gt;
		{&lt;br /&gt;
			$obj = $db-&amp;gt;fetch_object($resql);&lt;br /&gt;
			if ($obj)&lt;br /&gt;
			{&lt;br /&gt;
				// You can use here results&lt;br /&gt;
				print $obj-&amp;gt;field1;&lt;br /&gt;
				print $obj-&amp;gt;field2;&lt;br /&gt;
			}&lt;br /&gt;
			$i++;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Define style of your pages ==&lt;br /&gt;
To have the look of your own pages to match the Dolibarr theme, it is necessary to use the Dolibarr CSS styles.&lt;br /&gt;
&lt;br /&gt;
You can use for example:&lt;br /&gt;
&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;liste_titre&#039;&#039;&#039;&amp;quot; on tags &#039;&#039;tr&#039;&#039; and &#039;&#039;td&#039;&#039; for the head row of a table.&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;pair&#039;&#039;&#039;&amp;quot; or class=&amp;quot;&#039;&#039;&#039;impair&#039;&#039;&#039;&amp;quot; on tags &#039;&#039;tr&#039;&#039; and &#039;&#039;td&#039;&#039; of other rows of a table.&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;flat&#039;&#039;&#039;&amp;quot; on all input fields (&#039;&#039;input, select, textarea&#039;&#039;...).&lt;br /&gt;
* class=&amp;quot;&#039;&#039;&#039;button&#039;&#039;&#039;&amp;quot; on HTML fields with type &#039;&#039;input type=&amp;quot;submit&amp;quot;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Use the Dolibarr date picker ==&lt;br /&gt;
If you want to use the Dolibarr date selector (with its calendar popup) into your pages, use the following line:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
 $form=new Form($db);&lt;br /&gt;
 $form-&amp;gt;select_date(&#039;&#039;,&#039;mykey&#039;,0,0,0,&amp;quot;myform&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The string mykey will identify the date selector in the form. You must use different values if you use several date selectors in same page.&lt;br /&gt;
The string myform is the name of the FORM in which the selector is included (value found in the form name=&amp;quot;myform&amp;quot; in HTML page).&lt;br /&gt;
This means a date selector must be included necessarily into an html FORM.&lt;br /&gt;
&lt;br /&gt;
To get value after the POST of your form, the command is:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$mydate = dol_mktime(12, 0 , 0, $_POST[&#039;mykeymonth&#039;], $_POST[&#039;mykeyday&#039;], $_POST[&#039;mykeyyear&#039;]);&lt;br /&gt;
print strftime(&#039;%A %d %B %Y&#039;, $mydate);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Add your own setup page (optional)  =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If your module need to ask user several parameters.&lt;br /&gt;
&lt;br /&gt;
== Create your page to edit parameters ==&lt;br /&gt;
If your module need several parameters to be setup, you must create a page to edit options (that will be saved into [[Table llx_const|table &#039;&#039;&#039;llx_const&#039;&#039;&#039;]]).&lt;br /&gt;
Create a page named &#039;&#039;&#039;mymodule_setuppage.php&#039;&#039;&#039; that show possibles options and update them into table from a form.&lt;br /&gt;
It is a necessary to take an example from a page into directory &#039;&#039;&#039;/admin&#039;&#039;&#039; that will show you the way to read/save your parameter.&lt;br /&gt;
Put this page into directory &#039;&#039;&#039;/admin&#039;&#039;&#039;.&lt;br /&gt;
Then, into the descriptor file of your module, modify the variable config_page_url to set name of this PHP page (without the path that is not necesary if page is inside directory admin).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;config_page_url = array(&amp;quot;mymodule_setuppage.php&amp;quot;);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Test your page ==&lt;br /&gt;
Go into page &#039;&#039;&#039;Home-&amp;gt;Setup-&amp;gt;Modules&#039;&#039;&#039;, you should see a picture at the end of the line of your module to reach your setup page. Click on it, you should be able to view/edit parameters from your page.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Define your entries in menu (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If you have created PHP pages, it is necessary that those pages can be reached from menu entries in Dolibarr menu.&lt;br /&gt;
&lt;br /&gt;
== Define your menu entries ==&lt;br /&gt;
For this, you must define into the module descriptor, the array this-&amp;gt;menu that declare all menus added by your module.&lt;br /&gt;
This array contains entries that will appear once your module is activated.&lt;br /&gt;
The example module descriptor file &#039;&#039;&#039;modMyModule.class.php&#039;&#039;&#039; contains an example to declare a top menu and also its left menu entries.&lt;br /&gt;
&lt;br /&gt;
This is the example of code to declare your own menu entries in a module descriptor file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// Main menu entries&lt;br /&gt;
$this-&amp;gt;menu = array();			// List of menus to add&lt;br /&gt;
$r=0;&lt;br /&gt;
&lt;br /&gt;
// Add here entries to declare new menus&lt;br /&gt;
// Example to declare the Top Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;0,			// Put 0 if this is a top menu&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;top&#039;,			// This is a Top menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule top menu&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;leftmenu&#039;=&amp;gt;&#039;1&#039;,		// 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).&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagetop.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users, 1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&lt;br /&gt;
// Example to declare a Left Menu entry:&lt;br /&gt;
$this-&amp;gt;menu[$r]=array(	&#039;fk_menu&#039;=&amp;gt;&#039;r=0&#039;,		// Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry)&lt;br /&gt;
			&#039;type&#039;=&amp;gt;&#039;left&#039;,			// This is a Left menu entry&lt;br /&gt;
			&#039;titre&#039;=&amp;gt;&#039;MyModule left menu 1&#039;,&lt;br /&gt;
			&#039;mainmenu&#039;=&amp;gt;&#039;mymodule&#039;,&lt;br /&gt;
			&#039;url&#039;=&amp;gt;&#039;/mymodule/pagelevel1.php&#039;,&lt;br /&gt;
			&#039;langs&#039;=&amp;gt;&#039;mylangfile&#039;,	// Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.&lt;br /&gt;
			&#039;position&#039;=&amp;gt;100,&lt;br /&gt;
			&#039;enabled&#039;=&amp;gt;&#039;1&#039;,			// Define condition to show or hide menu entry. Use &#039;$conf-&amp;gt;mymodule-&amp;gt;enabled&#039; if entry must be visible if module is enabled.&lt;br /&gt;
			&#039;perms&#039;=&amp;gt;&#039;1&#039;,			// Use &#039;perms&#039;=&amp;gt;&#039;$user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;level1-&amp;gt;level2&#039; if you want your menu with a permission rules&lt;br /&gt;
			&#039;target&#039;=&amp;gt;&#039;&#039;,&lt;br /&gt;
			&#039;user&#039;=&amp;gt;2);				// 0=Menu for internal users,1=external users, 2=both&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To show menu or not depending on a permission, modify property &#039;&#039;&#039;perms&#039;&#039;&#039; in array. See chapter on permissions later to see how to add permissions.&lt;br /&gt;
&lt;br /&gt;
== Test your menu entries ==&lt;br /&gt;
Disable and reenable your module under Dolibarr module setup page, menus entries must appear (if property &#039;enabled&#039; is declaration array is ok).&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Add your own permissions (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If you want to add new permissions.&lt;br /&gt;
&lt;br /&gt;
The way to define permissions that will manage your module is done inside the module descriptor created previously.&lt;br /&gt;
Modify line &lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights_class = &#039;mymodule&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
with correct value for mymodule.&lt;br /&gt;
&lt;br /&gt;
Then you must fill the array $this-&amp;gt;rights with as many entries than different permissions you need to manage.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$this-&amp;gt;rights[$r][0] = 10001;&lt;br /&gt;
$this-&amp;gt;rights[$r][1] = &#039;Label by default of permission&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][3] = 1;&lt;br /&gt;
$this-&amp;gt;rights[$r][4] = &#039;action&#039;;&lt;br /&gt;
$this-&amp;gt;rights[$r][5] = &#039;subaction&#039;;&lt;br /&gt;
$r++;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Into $this-&amp;gt;rights[$r][0], put a permission id not already used (See into menu &#039;&#039;&#039;System info&#039;&#039;&#039; on a working installation of Dolibarr to know list of id already used by standard modules.&lt;br /&gt;
Into $this-&amp;gt;rights[$r][3], put 1 if this permission must be granted automatically by default to any new created user.&lt;br /&gt;
Into $this-&amp;gt;rights[$r][1], put a label by default for permission (This label will be used if no translation can be found into the file &#039;&#039;&#039;admin.lang&#039;&#039;&#039;).&lt;br /&gt;
Into $this-&amp;gt;rights[$r][4] and $this-&amp;gt;rights[$r][5], put an action and subaction string without spaces. You will be able to test if a user has the permission in your PHP source code with the sequence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
if ($user-&amp;gt;rights-&amp;gt;mymodule-&amp;gt;action-&amp;gt;subaction) ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Define you own box (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If your module need to provide one or several new boxes to show on home page.&lt;br /&gt;
&lt;br /&gt;
== Define your box ==&lt;br /&gt;
For this, modify the array $this-&amp;gt;boxes into the module descriptor file.&lt;br /&gt;
All you have to do is to add one line for each box file you will create into directory &#039;&#039;&#039;htdocs/includes/boxes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example:&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
this-&amp;gt;boxes[0][1]=&#039;mybox0.php&#039;&lt;br /&gt;
this-&amp;gt;boxes[1][1]=&#039;mybox1.php&#039;&lt;br /&gt;
this-&amp;gt;boxes[2][1]=&#039;mybox2.php&#039;&lt;br /&gt;
...&lt;br /&gt;
this-&amp;gt;boxes[n][1]=&#039;myboxn.php&#039;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then create files mybox0.php, mybox1.php... by copying an example from an existing box file (into directory htdocs/include/boxes).&lt;br /&gt;
&lt;br /&gt;
== Test if your box is detected by Dolibarr ==&lt;br /&gt;
Disable and enabled module.&lt;br /&gt;
&lt;br /&gt;
Go into menu &#039;&#039;&#039;Home - Setup - Boxes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Your boxes must appear in the list of boxes you can activated. Activate the box and go on home page to see if the box is showing correctly.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Define your own export (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If your module provide new predefined database export profiles (for its own tables or for already existing tables of another module).&lt;br /&gt;
&lt;br /&gt;
== Define export ==&lt;br /&gt;
For this uncomment and modify arrays $this-&amp;gt;export_xxx in your module descriptor file.&lt;br /&gt;
&lt;br /&gt;
== Test your export ==&lt;br /&gt;
Go into menu Tools -&amp;gt; Export. Your export will appear in the list of available predefined exports (if your module is enabled).&lt;br /&gt;
Choose it, you must see list of all possible fields defined in the export arrays.&lt;br /&gt;
Choose on field and try to build an export file. If ok, try again with all fields.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Define your CSS styles (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If in your PHP pages, you use class styles that are not defined inside Dolibarr themes CSS (not recommanded).&lt;br /&gt;
&lt;br /&gt;
== Create and declare your style sheet ==&lt;br /&gt;
Create a style sheet CSS named &#039;&#039;&#039;mymodule.css&#039;&#039;&#039; and put it into directory &#039;&#039;&#039;htdocs/mymodule&#039;&#039;&#039;. You can have only one CSS file per module.&lt;br /&gt;
Remember it&#039;s better to use existing styles already available by default into Dolibarr (The CSS file used by Dolibarr is file &#039;&#039;&#039;themes/mytheme/&#039;&#039;themename&#039;&#039;.php.css&#039;&#039;&#039;. Create your own CSS file only if you need absolutely to add not already existing styles.&lt;br /&gt;
Once your style sheet is ready, declare it into your module descriptor file by modifying the property &#039;&#039;&#039;$this-&amp;gt;style_sheet&#039;&#039;&#039;.&lt;br /&gt;
Value to put here must be a relative URL to your CSS file.&lt;br /&gt;
For example &#039;/mymodule/myfile.css&#039;.&lt;br /&gt;
&lt;br /&gt;
== Test your style sheet ==&lt;br /&gt;
Disable and enable your module.&lt;br /&gt;
&lt;br /&gt;
Go on home page (index.php). Show the HTML source of the page.&lt;br /&gt;
&lt;br /&gt;
You should see into the HTML header, a line that declare your style sheet.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Define you Javascript functions (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If in your PHP pages, you use javascript functions not available in Dolibarr (in file lib_head.js)&lt;br /&gt;
&lt;br /&gt;
If you need to use your own javascript functions inside your PHP pages, it is necessary to have your functions defined into a javascript file &#039;&#039;&#039;mymodule.js&#039;&#039;&#039; to be included inside the HTML HEAD section.&lt;br /&gt;
To ask Dolibarr that forge this header to include your own javascript file, you must just declare your file inside the module descriptor.&lt;br /&gt;
&lt;br /&gt;
This feature is not yet available.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Run your own code on any Dolibarr event (optional) =&lt;br /&gt;
&#039;&#039;&#039;When&#039;&#039;&#039;: If you want to execute your own code once a common Dolibarr event has occurred (example: I want to update a table in my module when an invoice is created into Dolibarr), you must create a &#039;&#039;&#039;triggers&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
See also [[Interfaces_Dolibarr_toward_foreign_systems]]&lt;br /&gt;
and [[Interfaces_from_foreign_systems_toward_Dolibarr]]&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Create a package to distribute and install your module =&lt;br /&gt;
&lt;br /&gt;
* Go into the directory &#039;&#039;&#039;/build&#039;&#039;&#039; and copy the file &#039;&#039;&#039;makepack-dolibarrmodules.conf&#039;&#039;&#039; into &#039;&#039;&#039;makepack-mymodule.conf&#039;&#039;&#039;. Warning, this directory may not be provided in some packages of stable versions. If so, it can be retrieved from the CVS snapshot available for download on the Dolibarr website in area &amp;quot;Development version&amp;quot; (taken in this case the whole build directory which is autonomous and independent directory).&lt;br /&gt;
&lt;br /&gt;
Edit this file to add list of file names for all new files you created for your module (module descriptor, new sql tables files, php page, images, etc...)&lt;br /&gt;
&lt;br /&gt;
* Run the script via Perl (need the Perl version 5.0 or later):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
perl makepack-dolibarrmodule.pl&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
The script asks you the name of your module, its major and minor version. A file &#039;&#039;&#039;mymodule.tgz &#039;&#039;&#039; will then be manufactured containing your module ready to be deployed.&lt;br /&gt;
&lt;br /&gt;
* The person who receives your module must then place the file in the root directory of a Dolibarr installation and perform the command:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
tar -xvf monmodule.tgz&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* If you want your module to be public, you can submit it (the tgz file) on Dolibarr web site on download area: http://www.dolibarr.org -&amp;gt; downloads -&amp;gt; contrib -&amp;gt; submit a file (you must create an account and be logged to have link appeared).&lt;br /&gt;
** If your module was build correctly, file will be validated later.&lt;br /&gt;
** If quality is enough and license permits it, code might be added inside main Dolibarr sources (except if you disagree for that).&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Some coding rules =&lt;br /&gt;
The coding rules to be followed are defined in the [[Developer documentation]], under section &amp;quot;General Information - Language and standards development&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
= [[File:Art.png]] Using MDA =&lt;br /&gt;
A method to generate a functional module from a UML model has been developed. More information on the page [[UML2Dolibarr - Build a module using MDA]].&lt;/div&gt;</summary>
		<author><name>Choiceerp</name></author>
	</entry>
</feed>