<?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=Dmartin</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=Dmartin"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Dmartin"/>
	<updated>2026-10-30T07:11:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=FAQ_D%C3%A9veloppeur&amp;diff=18332</id>
		<title>FAQ Développeur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=FAQ_D%C3%A9veloppeur&amp;diff=18332"/>
		<updated>2010-02-10T16:51:08Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Récupérer/mettre à jour la version CVS de développement */ Ajout lien vers configuration Eclipse pour CVS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FAQ FR]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
= Comment devenir développeur officiel =&lt;br /&gt;
&lt;br /&gt;
Dans la galaxie du projet Dolibarr, il existe plusieurs intervenants de différents niveaux/grades.&lt;br /&gt;
Le nombre de développeurs et contributions est important, hors tout projet qui veut atteindre un certains niveau de qualité se doit d&#039;avoir une gestion contrôlée et des modifications validées des évolutions, aussi bien au niveau des besoins fonctionnels que du code.&lt;br /&gt;
Pour cette raison, les accès en écriture sur les sources (serveur CVS) sont limités et régies par une organisation qui est décrite dans les lignes qui suivent.&lt;br /&gt;
Chaque développeur a un &#039;&#039;&#039;grade&#039;&#039;&#039; qui dépend de son ancienneté et de ces contributions passées. Le niveau d&#039;habilitations d&#039;une personne sur le projet augmente avec les étapes de promotion de grade.&lt;br /&gt;
&lt;br /&gt;
Le cursus d&#039;un développeur Dolibarr passe donc par ces étapes, que l&#039;on classe par un titre familié aux adeptes de sciences fictions. Voici ces étapes.&lt;br /&gt;
Il est important de comprendre que cette organisation a pour seul but d&#039;améliorer la qualité de Dolibarr et qu&#039;il est nécessaire qu&#039;elle soit rigoureusement respectée afin d&#039;attendre ce but. Ne soyez donc pas offensé si, en tant que développeur, vous ne pouvez disposer d&#039;un accès CVS en écriture avant un certain délai.&lt;br /&gt;
&lt;br /&gt;
Les grades des contributeurs au projet Dolibarr sont les suivants:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== * Soldat ==&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aider doit faire et d&#039;abord se familiariser avec les règles et normes de développements.&lt;br /&gt;
En lisant toute la [[Documentation Développeur]], vous faites preuve de volonté suffisante pour devenir automatiquement &#039;&#039;&#039;Soldat&#039;&#039;&#039; (Votre grade est au niveau &#039;&#039;&#039;Soldat&#039;&#039;&#039;). Et tout lire, c&#039;est pas le plus facile...&lt;br /&gt;
&lt;br /&gt;
Ce grade s&#039;obtient sans validation supérieure. C&#039;est un grade de principe, de départ.&lt;br /&gt;
&lt;br /&gt;
Compte tenu du grade, il n&#039;est pas possible d&#039;établir une liste de tous les acteurs du projet Dolibarr ayant ce grade (liste en perpétuelle évolution).&lt;br /&gt;
&lt;br /&gt;
== * Chasseur ==&lt;br /&gt;
&lt;br /&gt;
L&#039;étape suivante consiste à soumettre des patch, en commençant par des simples, soit sur la Mailing List dev (voir [[FAQ_D%C3%A9veloppeur#Soumettre_un_patch.2C_am.C3.A9lioration_ou_participer_au_d.C3.A9veloppement|FAQ Développeur]] pour la procédure), soit sur le forum (Mailing List préférée). &lt;br /&gt;
&lt;br /&gt;
Vous pouvez trouver de taches en attente de patch sur le gestionnaire de taches à faire:&lt;br /&gt;
http://savannah.nongnu.org/task/?group=dolibarr&lt;br /&gt;
&lt;br /&gt;
Les taches sembles pour commencer sont les taches qui possède la propriété &amp;quot;Task opened to external developers&amp;quot; à &amp;quot;oui&amp;quot;. Si la valeur est &amp;quot;non&amp;quot;, oubliez la, cela signifie qu&#039;elle sera traité par un développeur de grade Jedi.  &lt;br /&gt;
&lt;br /&gt;
A votre première soumission acceptée (incluse dans le CVS par un Amiral, Jedi ou Yoda), vous entrez alors automatiquement dans la famille des &#039;&#039;&#039;Chasseurs&#039;&#039;&#039; de l&#039;alliance Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Le nombre de chasseurs n&#039;est pas limité. Plus, il y en aura, plus on sera fort.&lt;br /&gt;
Les chasseurs représentent la force vive principale de l&#039;alliance Dolibarr.&lt;br /&gt;
&lt;br /&gt;
La liste des acteurs Dolibarr avec ce grade est disponible sur la page [[:Category:Chasseur]]&lt;br /&gt;
&lt;br /&gt;
== * Z-6PO ==&lt;br /&gt;
&lt;br /&gt;
Si vous parlez couramment une langue non ou mal traduite dans Dolibarr, un &#039;&#039;&#039;Jedi&#039;&#039;&#039; ou &#039;&#039;&#039;Yoda&#039;&#039;&#039; peut attribuer, à votre compte Savannah, les droits d&#039;écriture directement dans les sources CVS du projet (Voir [[FAQ_D%C3%A9veloppeur#R.C3.A9cup.C3.A9rer.2Fmettre_.C3.A0_jour_la_version_CVS_de_d.C3.A9veloppement|Récupérer/mettre à jour la version CVS de développement]] pour savoir comment les utiliser). Ce droit ne doit toutefois être utiliser qu&#039;à condition qu&#039;il soit limité à des objectifs de traductions.&lt;br /&gt;
Ce grade peut donc s&#039;obtenir assez vite.&lt;br /&gt;
&lt;br /&gt;
La liste des acteurs Dolibarr avec ce grade est disponible sur la page [[:Category:Z-6PO]]&lt;br /&gt;
&lt;br /&gt;
== * Amiral ==&lt;br /&gt;
&lt;br /&gt;
Ce n&#039;est qu&#039;au bout d&#039;un temps variable (qui peut être très long) au rang de Chasseur, et si de nombreux patch de qualité satisfaisante ont été envoyée, qu&#039;un Yoda en place vous autorisera à réaliser des commits CVS pour un motif étendu de la traduction à tout correctif.&lt;br /&gt;
Vous êtes devenu un &#039;&#039;&#039;Amiral&#039;&#039;&#039; de l&#039;alliance Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Ce titre ne se demande pas, il s&#039;obtient par décision ou proposition d&#039;un &#039;&#039;&#039;Jedi&#039;&#039;&#039; ou &#039;&#039;&#039;Yoda&#039;&#039;&#039; qui estime que vous avez soumis suffisamment de patch pour être un sérieux &#039;&#039;&#039;Amiral&#039;&#039;&#039;.&lt;br /&gt;
L&#039;accès CVS d&#039;un &#039;&#039;&#039;Amiral&#039;&#039;&#039; doit cependant n&#039;être utilisé que pour commiter soit des traductions, soit des corrections de bugs déclarées sur Savannah ou le forum (que ces corrections soient personnelles ou issues d&#039;un patch soumis par un &#039;&#039;&#039;Chasseur&#039;&#039;&#039;).&lt;br /&gt;
Tout commit CVS doit ainsi obligatoirement inclure, dans la description (le champ log de commit), le numéro du bug Savannah corrigé OU le titre du message du forum signalant le problème. Seul les traductions échappent à cette contrainte (pas de restrictions pour les traductions). Le non respect de cette contrainte, peut provoquer une rétrogradation au rang de &#039;&#039;&#039;Chasseur&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour la soumission de nouvelles fonctionnalités, il faut donc obligatoirement continuer sur le principe de patchs envoyés sur la ML.&lt;br /&gt;
&lt;br /&gt;
L&#039;obtention du grade d&#039;Amiral est toutefois rare car limité. La qualité de Dolibarr ne pouvant être atteinte que par un nombre d&#039;Amiraux contrôlé, ce qui n&#039;empêche pas d&#039;avoir un nombre de&lt;br /&gt;
développeurs (Chasseurs) très important (grâce au système de patch).&lt;br /&gt;
&lt;br /&gt;
La liste des acteurs Dolibarr avec ce grade est disponible sur la page [[:Category:Admiral]]&lt;br /&gt;
&lt;br /&gt;
== * Jedi ==&lt;br /&gt;
&lt;br /&gt;
C&#039;est au bout d&#039;un temps variable (surement le plus long de tous) au rang de contributeur Amiral, et si la qualité des patch qui ont été envoyée est satisfaisante, qu&#039;un Yoda vous signalera que vous êtes autorisé à réaliser des commits sans restrictions de fonctionnalités, à condition d&#039;avoir cependant l&#039;aval de principe d&#039;un Maitre Yoda à qui vous aurez expliquer la fonctionnalité.&lt;br /&gt;
Il peut toutefois y avoir une restriction temporaire définie par un Yoda pour raison de release proche.&lt;br /&gt;
Vous êtes alors devenu un &#039;&#039;&#039;Jedi&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce titre ne se demande pas, il s&#039;obtient par proposition d&#039;un autre Jedi ou d&#039;un Yoda.&lt;br /&gt;
&lt;br /&gt;
Ce privilège est toutefois exceptionnel. La qualité de Dolibarr ne pouvant être atteinte &lt;br /&gt;
que par un nombre de Jedi contrôlé, ce qui n&#039;empêche pas d&#039;avoir un nombre de&lt;br /&gt;
développeurs (Chasseurs) très important (grâce au système de patch).&lt;br /&gt;
&lt;br /&gt;
La liste des acteurs Dolibarr avec ce grade est disponible sur la page [[:Category:Jedi]]&lt;br /&gt;
&lt;br /&gt;
== * Yoda ==&lt;br /&gt;
&lt;br /&gt;
Au nombre de 1 à 5, être un &#039;&#039;&#039;Yoda&#039;&#039;&#039;, c&#039;est assurer la gestion globale du développement du projet. Ce rang s&#039;obtient successivement au départ d&#039;un Yoda qui se retire, ou par décision des autres Yoda de se renforcer, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
La liste des acteurs Dolibarr avec ce grade est disponible sur la page [[:Category:Yoda]]&lt;br /&gt;
&lt;br /&gt;
== * Et Dark Vador ? ==&lt;br /&gt;
&lt;br /&gt;
Il existe hélas. Il y aura toujours des parasites qui polluent le forum ou la mailing-list de messages ou critiques non constructives, qui ralentissent le développement de Dolibarr plutôt que d&#039;offrir des critiques aidant à progresser. Certains sont très très fort en mauvaise foie ou mauvais ton. Ce sont eux que l&#039;on appellent les Dark Vador.&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un à deux Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
= L&#039;équipe actuelle =&lt;br /&gt;
Voir la page [[projet Dolibarr]] pour connaitre la liste des personnes, participant au projet Dolibarr, à chaque grade actuellement.&lt;br /&gt;
&lt;br /&gt;
= Démarrer le développement =&lt;br /&gt;
Consulter &#039;&#039;&#039;intégralement&#039;&#039;&#039; la [[Documentation Développeur]] pour assimiler toutes les règles et principes imposées aux développeurs.&lt;br /&gt;
Vous pouvez aussi consulter les FAQ suivantes.&lt;br /&gt;
&lt;br /&gt;
= Récupérer/mettre à jour la version CVS de développement =&lt;br /&gt;
&lt;br /&gt;
===Récupération de la dernière version des sources avec accès CVS anonyme===&lt;br /&gt;
&lt;br /&gt;
Sans compte Savannah ou sans autorisation d&#039;accès CVS en écriture, vous pouvez quand même utiliser un client CVS (comme [http://www.wincvs.org WinCVS] ou [http://www.tortoisecvs.org TortoiseCVS] sous Windows le client CVS d&#039;Eclipse ou la commande en ligne CVS sous Linux) pour récupérer les sources du projet.&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer l&#039;intégralité des fichiers dans un répertoire courant est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/cvsroot/dolibarr&lt;br /&gt;
export CVSROOT&lt;br /&gt;
cvs -q checkout -r HEAD dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
HEAD signifie qu&#039;on veut la dernière version de la version en cours de développement.&lt;br /&gt;
&lt;br /&gt;
===Récupération de la dernière version des sources avec accès CVS complet===&lt;br /&gt;
&lt;br /&gt;
Une autre méthode pour récupérer la version CVS est d&#039;utiliser les outils CVS. Vous avez besoin d&#039;un compte Savannah offrant un accès CVS en écriture et un client CVS (commande CVS sous Linux, WinCVS ou TortoiseCVS par exemple sous Windows, ou le client dans Eclipse...).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer l&#039;intégralité des fichiers dans un répertoire courant est:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CVSROOT=:ext:yoursavannahlogin@cvs.savannah.nongnu.org:/cvsroot/dolibarr&lt;br /&gt;
export CVSROOT&lt;br /&gt;
cvs -q checkout -r HEAD dolibarr&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
HEAD signifie qu&#039;on veut la dernière version de la version en cours de développement.&lt;br /&gt;
&lt;br /&gt;
===Autres repository===&lt;br /&gt;
&lt;br /&gt;
Le repository CVS pour les modules non officiels est disponible dans le module dolibarrmod&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
CVSROOT=:ext:yoursavannahlogin@cvs.savannah.nongnu.org:/cvsroot/dolibarr&lt;br /&gt;
export CVSROOT&lt;br /&gt;
cvs -q checkout -r HEAD dolibarrmod&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Mettre à jour son repository CVS===&lt;br /&gt;
&lt;br /&gt;
La commande permettant de mettre à jour localement une copie de travail CVS (repository), qui a déjà été rapatriée par un checkout CVS, est la suivante:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous linux:&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cvs -q update -P -d&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;Sous Windows avec Tortoise cvs&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications locales sur les fichiers, ajouter l&#039;option -C, soit:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous linux:&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cvs -q update -P -C -d&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;Sous Windows avec Tortoise cvs&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si besoin, modifiez les droits de propriétaire des dossiers, pour que le serveur y ait accès.&lt;br /&gt;
&lt;br /&gt;
===Récupération d&#039;une autre branche par CVS===&lt;br /&gt;
&lt;br /&gt;
Si vous désirez une version particulière (avec ces patchs), il vous faut suivre la même procédure que ci-dessus mais en remplaçant HEAD par le nom de la branche. &lt;br /&gt;
Par exemple DOLIBARR_2_2_BRANCH pour la branche 2.2 ou DOLIBARR_2_4_BRANCH pour la branche 2.4.&lt;br /&gt;
&lt;br /&gt;
===Récupération de la dernière version des sources par téléchargement===&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer le snapshot journalier de la version CVS de la branche de développement principale (appelée HEAD) sans utiliser de logiciel client CVS. L&#039;opération consiste à télécharger la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, aller sur la page avec la [http://www.dolibarr.org/downloads/cat_view/64-development-version version CVS du jour].&lt;br /&gt;
&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
L&#039;inconvénient de cette méthode et qu&#039;il vous faut à chaque fois tout retélécharger pour bénéficier des mises à jours.&lt;br /&gt;
&lt;br /&gt;
===Mise à jour de la base===&lt;br /&gt;
&lt;br /&gt;
Si vous venez de faire un update, la prochaine étape consiste à migrer la base pour la mettre en phase avec les nouvelles sources. Pour cela, il suffit d&#039;appeler la page&lt;br /&gt;
http://maracinedolibarr/install/&lt;br /&gt;
et choisir l&#039;option &amp;quot;Mise à jour&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Cette procédure de migration/mise à jour est conçue pour fonctionner quel que soit l&#039;état de départ et peut être repassée plusieurs fois sans risque.&lt;br /&gt;
&lt;br /&gt;
===Utiliser Eclipse pour récupérer la version CVS===&lt;br /&gt;
Procédure détaillée ici :&lt;br /&gt;
[[Outils de développement#Configurer Eclipse pour récupérer la version CVS]]&lt;br /&gt;
&lt;br /&gt;
= Comment créer un nouveau theme =&lt;br /&gt;
Voir pour cela la page [[Themes]]&lt;br /&gt;
&lt;br /&gt;
= Comment développer mon propre système de menu =&lt;br /&gt;
Voir pour cela la page [[Système_de_menus]]&lt;br /&gt;
&lt;br /&gt;
= Comment développer mon propre module =&lt;br /&gt;
Voir pour cela la page [[Developpement_module]]&lt;br /&gt;
&lt;br /&gt;
= Comment ajouter ou compléter une traduction =&lt;br /&gt;
Voir pour cela la page [[Documentation_traducteur]]&lt;br /&gt;
&lt;br /&gt;
= Changer mon système de numérotation des factures en cours de route =&lt;br /&gt;
Si le nouveau système de numérotation n&#039;entre pas en conflit avec l&#039;ancien, il suffit d&#039;aller dans le menu Configuration - Modules - Configuration factures et prendre un nouveau modèle dans la liste.&lt;br /&gt;
Si le nouveau système rentre en conflit, il est nécessaire de renuméroter vos références existantes. Cela peut-être fait avec une requête SQL.&lt;br /&gt;
Par exemple, pour passer de Jupiter (FYYYYMM99) à Terre (FAYYMM-999), vous pouvez exécuter la requête suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,4,4),&#039;-&#039;,substr(facnumber,8))&lt;br /&gt;
where facnumber like &#039;F%&#039; and facnumber not like &#039;FA%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, pour passer d&#039;un modele FAYYMM999 à Terre (FAYYMM-999), vous pouvez exécuter la requête suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
update llx_facture set facnumber=concat(&#039;FA&#039;,substr(facnumber,3,4),&#039;-&#039;,substr(CONCAT(&#039;0000&#039;,substr(facnumber,7)),-4))&lt;br /&gt;
where facnumber like &#039;FA%&#039; and facnumber not like &#039;%-%&#039;;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Soumettre un patch, amélioration ou participer au développement =&lt;br /&gt;
Si vous cherchez comment commencer ou aider les développements Dolibarr, lisez le chapitre [[FAQ_Développeur#Comment devenir développeur officiel]]. Si votre patch est déjà prêt et voulez le diffuser, ce chapitre est pour vous.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Avec accès CVS en écriture &#039;&#039;&#039;&lt;br /&gt;
A ce jour, les accès en écriture au CVS sont restreints (le nombre de commit étant déjà suffisamment dynamique). Si vous bénéficiez à l&#039;heure actuelle d&#039;un accès CVS en écriture, utilisez-le et à condition que ce qui est commité corresponde bien à votre grade de développeur Dolibarr (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Devenir développeur officiel]] pour les différents grades).&lt;br /&gt;
Si, vous n&#039;avez pas accès au CVS (vous êtes donc au grade de membre ou chasseur de l&#039;alliance Dolibarr), il est nécessaire de suivre la procédure qui suit...&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Sans accès CVS en écriture&#039;&#039;&#039;&lt;br /&gt;
Sans accès CVS en écriture (sans compte développeur savannah), il est nécessaire de fournir par mail, votre fichier patch. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous tout OS:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Voici la &#039;&#039;méthode Pro&#039;&#039; selon laquelle travailler pour pouvoir générer un tel fichier patch:&lt;br /&gt;
&lt;br /&gt;
- Avoir un répertoire qui contient la version de Dolibarr de référence (résultat de la mise à jour CVS ou bien tout simplement l&#039;arborescence résultant de la décompression d&#039;un snapshot tgz de Dolibarr). On appellera ce répertoire &#039;&#039;&#039;ancien_rep&#039;&#039;&#039;. Vous pouvez récupérer le snapshot de la version de dev en cours sur le  [http://www.dolibarr.org/downloads/ site officiel de Dolibarr - espace téléchargement - version développement].&lt;br /&gt;
&lt;br /&gt;
- Avoir un autre répertoire qui contient l&#039;arborescence de Dolibarr mais dans laquelle vous faites ou avez fait vos modifications. On appellera ce répertoire &#039;&#039;&#039;nouveau_rep&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Pour générer le fichier patch, il suffit alors de lancer la commande &#039;&#039;&#039;diff&#039;&#039;&#039; (en standard sous Linux, fourni dans [http://www.cygwin.org/cygwin cygwin] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;*.patch&amp;quot; --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&amp;quot;*.rej&amp;quot;&lt;br /&gt;
     --exclude=&amp;quot;*.orig&amp;quot; --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  &lt;br /&gt;
     ancien_rep nouveau_rep  &amp;gt; mypatch.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Un script ksh réalisant cette commande est disponible dans le répertoire &#039;&#039;&#039;build/patch&#039;&#039;&#039;.&lt;br /&gt;
Envoyer votre patch sur la ML à l&#039;adresse &#039;&#039;&#039;dolibarr-dev@nongnu.org&#039;&#039;&#039;.&lt;br /&gt;
L&#039;intégration de votre patch n&#039;est toutefois pas garantie, pas plus que le délai, mais si le patch est réalisé en suivant rigoureusement cette procédure, il a de forte chance d&#039;être au moins testé (dans le cas contraire les chances sont proches de 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Sous Windows:&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Windows, une &#039;&#039;méthode moins Pro&#039;&#039; mais qui donne le même résultat est la suivante. Installer l&#039;excellent outil open source de comparaison Winmerge qui sait fabriquer des patchs au format &#039;&#039;diff -Naur&#039;&#039;. Pour cela, comparer avec Winmerge le fichier référence et le fichier modifié et choisir dans le menu &#039;&#039;&amp;quot;Tools - Generate patch&amp;quot;&#039;&#039; (&#039;&#039;Générer des retouches&#039;&#039; en version française). Saisir un nom de fichier comme &#039;&#039;&amp;quot;resultat.patch&amp;quot;&#039;&#039;, cocher la case &#039;&#039;&amp;quot;Append&amp;quot;&#039;&#039; et choisir l&#039;option &#039;&#039;&amp;quot;Format Unified&amp;quot;&#039;&#039; (&#039;&#039;Style : unifié&#039;&#039; en version française). Cliquer sur &#039;&#039;&amp;quot;Ok&amp;quot;&#039;&#039;.&lt;br /&gt;
Éventuellement recommencer pour chaque fichier modifié.&lt;br /&gt;
Au final, on obtient un beau fichier &#039;&#039;resultat.patch&#039;&#039; qui contient toutes les modifications au bon format.&lt;br /&gt;
&lt;br /&gt;
Au lieu de rechercher manuellement vos fichiers, si vous avez installé conjointement &#039;&#039;TortoiseCVS&#039;&#039; et &#039;&#039;Winmerge&#039;&#039;, vous pouvez vous contenter de votre version modifiée sur votre ordinateur, et de la version CVS en ligne. Sous l&#039;explorateur Windows, faites un clic droit sur le fichier qui doit être patché, et choisissez &amp;quot;CVS comparer&amp;quot; (pas WinMerge qui se trouve quelques lignes plus bas). Tortoise va lui-même lancer WinMerge. Puis reprenez la procédure décrite ci-dessus.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Tester/Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Pour appliquer un ficiher patch sur une version non modifié afin d&#039;intégrer les modifications décrites dans le fichier patch, vous pouvez utiliser l&#039;utilitaire &#039;&#039;&#039;patch&#039;&#039;&#039;.&lt;br /&gt;
Imaginons que vous avez un répertoire des sources d&#039;une version non modifiée de Dolibarr sur un serveur. Pour appliquer le patch, placer dans le répertoire racine de Dolibarr et lancez la commande:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
patch -u -p0 -d . &amp;lt; monfichier.patch&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;Pour information: -p0 permet d&#039;utiliser le chemin entier tel que mentionné dans le fichier de patch pour retrouver les fichiers à modifier dans votre arborescence source (-pn en retire les n premiers niveau de l&#039;arborescence)&lt;br /&gt;
-d permet de préciser le chemin relatif vers le dossier à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch doit etre au format unifié)&lt;br /&gt;
-u permet de préciser que le patch est en mode unifié&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Comment packager/livrer un module =&lt;br /&gt;
Voir la page [[Développement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement module - Créer un package pour livrer et installer votre module]]&lt;br /&gt;
&lt;br /&gt;
= Comment être informé de ce qui se passe sur Dolibarr ? =&lt;br /&gt;
Voir la page [[FAQ Comment être informé de l&#039;actualité de Dolibarr ?]]&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Outils_de_d%C3%A9veloppement&amp;diff=18330</id>
		<title>Outils de développement</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Outils_de_d%C3%A9veloppement&amp;diff=18330"/>
		<updated>2010-02-10T16:43:00Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Eclipse et plugins */ Ajout procédure de configuration d&amp;#039;Eclipse pour CVS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Tout environnement de développement peut être utilisé.&lt;br /&gt;
Toutefois voici une liste d&#039;outils fortement recommandés pour leur complétude, leur qualité et la productivité du développement qu&#039;ils apportent. Ils sont utilisés par la plupart des développeurs principaux de Dolibarr. Notons que toutes ces solutions sont gratuites et OpenSource.&lt;br /&gt;
&lt;br /&gt;
= Pour tout développeur =&lt;br /&gt;
&lt;br /&gt;
Voici le socle de travail recommandé, toutefois tout outil respectant les standards Web, PHP, Mysql peuvent faire l&#039;affaire.&lt;br /&gt;
&lt;br /&gt;
== Un serveur AMP ==&lt;br /&gt;
&lt;br /&gt;
* Apache, Mysql et PHP&lt;br /&gt;
&lt;br /&gt;
Sur Linux: Ces 3 produits sont disponibles dans toutes distributions.&lt;br /&gt;
&lt;br /&gt;
Sur Windows: Installez [http://www.wampserver.com/ WampServer 2] (base Mysql, Apache et PHP tout clé en main). Ce serveur WAMP offre le trio MySql+Apache+PHP, avec possibilité de basculer de version pour n&#039;importe lequel de ces composants d&#039;un simple clic).&lt;br /&gt;
&lt;br /&gt;
== Firefox et plugins ==&lt;br /&gt;
* Firefox 3.0 avec les plugins: &lt;br /&gt;
** HTML Validator,&lt;br /&gt;
** Firebug + Firecookie,&lt;br /&gt;
** Phplangeditor et les Dictionnaires des langues si vous compter traduire&lt;br /&gt;
** Cert Viewer Plus si vous comptez faire des tests en HTTPS, &lt;br /&gt;
** FoxyProxy si vous voulez basculer rapidement votre navigateur vers des utilitaires Proxy (WebScarab)...&lt;br /&gt;
** User agent switcher pour simuler des accès depuis un smartphone&lt;br /&gt;
A télécharger depuis le site http://www.firefox.com&lt;br /&gt;
&lt;br /&gt;
== SquirrelSQL ==&lt;br /&gt;
* SquirrelSQL pour l&#039;administration de base&lt;br /&gt;
A télécharger depuis le site http://squirrel-sql.sf.net&lt;br /&gt;
&lt;br /&gt;
== Eclipse et plugins ==&lt;br /&gt;
=== Installation d&#039;Eclipse ===&lt;br /&gt;
Je recommande la version 3.4 d&#039;Eclipse disponible sur le site&lt;br /&gt;
http://www.acceleo.org/pages/download-acceleo-2-6-0/en qui embarque la plupart des plugins intéressant.&lt;br /&gt;
Une fois lancé, vous pouvez aller dans le centre de mise a jour, Help -&amp;gt; Software updates pour mettre à jour Eclipse avec la version 3.4.2 M20090211-1700.&lt;br /&gt;
&lt;br /&gt;
Sinon toute version disponible sur le site [http://www.eclipse.org Eclipse].&lt;br /&gt;
&lt;br /&gt;
=== Installation du plugin Eclipse pour PHP: PDT. ===&lt;br /&gt;
Si vous avez installé la version Eclipse ci-dessus, il suffit d&#039;utiliser la procédure Find And Install et ajouter l&#039;URL de mise à jour: http://download.eclipse.org/tools/pdt/updates/&lt;br /&gt;
&lt;br /&gt;
Installer la version 1.0.5 de PDT. La version 0.2.0 est buggué avec Eclipse 3.4.x.&lt;br /&gt;
&lt;br /&gt;
=== Configurer Eclipse pour récupérer la version CVS ===&lt;br /&gt;
&lt;br /&gt;
Une fois qu&#039;Eclipse est installé, vous pouvez vous connecter au repository CVS pour y récupérer la dernière version de développement.&lt;br /&gt;
&lt;br /&gt;
* Créer un nouveau projet : File &amp;gt;&amp;gt; New &amp;gt;&amp;gt; Projects puis sélectionner &amp;quot;Project from CVS&amp;quot; et &amp;quot;Next&amp;quot;&lt;br /&gt;
* Sélectionner &amp;quot;Create a new repository location&amp;quot; puis &amp;quot;Next&amp;quot;&lt;br /&gt;
* Remplir la fenêtre suivante comme ceci :&lt;br /&gt;
** Host : cvs.savannah.nongnu.org&lt;br /&gt;
** Repository path : /cvsroot/dolibarr&lt;br /&gt;
** User : anonymous&lt;br /&gt;
** Password :  (laisser vide)&lt;br /&gt;
** Connection type : pserver&lt;br /&gt;
** Use default port &lt;br /&gt;
* Ensuite remplir le champ Use specified module name : dolibarr&lt;br /&gt;
* Choisir ensuite le nom que le projet aura sur votre machine :&lt;br /&gt;
** Cocher Check out as a projet in the workspace&lt;br /&gt;
** Project Name : dolibarr&lt;br /&gt;
** Cocher Checkout subfolders&lt;br /&gt;
* Ensuite, laisser le chemin par défaut du workspace et &amp;quot;Next&amp;quot;&lt;br /&gt;
* Enfin, sélectionner la branche à charger&lt;br /&gt;
** HEAD est la version de développement&lt;br /&gt;
** Les version 2.6, 2.6, etc., se trouvent dans Branches&lt;br /&gt;
* Cliquer sur &amp;quot;Finish&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Les fichiers devraient être téléchargés sur votre disque dur.&lt;br /&gt;
&lt;br /&gt;
Pour ensuite mettre à jour la version de votre machine, il faut passer en perspective &amp;quot;Team Synchronizing&amp;quot; pour utiliser la fonction &amp;quot;Synchronize CVS&amp;quot;, ce qui aura pour effet de télécharger les dernières versions sur votre disque dur. Seuls les fichiers qui ont été modifiés sont téléchargés.&lt;br /&gt;
&lt;br /&gt;
= Optionnel =&lt;br /&gt;
&lt;br /&gt;
== Si vous gérez d&#039;autres projets sous SVN ==&lt;br /&gt;
* Installation du plugin SVN pour Eclipse: SubClipse.&lt;br /&gt;
Pour cela, utiliser la procédure Find And Install et ajouter l&#039;URL de mise à jour: &lt;br /&gt;
 http://subclipse.tigris.org/install.html&lt;br /&gt;
ou bien&lt;br /&gt;
* Installation du plugin SVN pour Eclipse: Subversive&lt;br /&gt;
 http://community.polarion.com/projects/subversive/download/eclipse/2.0/ganymede-site/ - [required] Subversive SVN Connectors&lt;br /&gt;
 http://community.polarion.com/projects/subversive/download/integrations/ganymede-site/ - [optional] Subversive Integrations&lt;br /&gt;
&lt;br /&gt;
== Si vous désirez faire des scripts en Perl ==&lt;br /&gt;
* Installation du plugin Eclipse pour Perl: EPIC&lt;br /&gt;
Pour cela, utiliser la procédure Find And Install et ajouter l&#039;URL de mise à jour: http://e-p-i-c.sourceforge.net/updates&lt;br /&gt;
&lt;br /&gt;
== Si vous désirez développer des modules avec le générateur UML2Dolibarr ==&lt;br /&gt;
&lt;br /&gt;
Une méthode pour générer un module fonctionnel depuis l&#039;UML est en cours de mise au point.&lt;br /&gt;
Plus d&#039;informations sur la page [[UML2Dolibarr - Générer un module par MDA]]. &lt;br /&gt;
Pour l&#039;utiliser, vous devez installer les composants suivants (si vous avez installé la version d&#039;Eclipse recommandé plus haut, tout ceci est déjà fait):&lt;br /&gt;
&lt;br /&gt;
* Installation de TopCased 1.4 ou +: http://www.topcased.org&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;acceleo 2.2.1 ou +&lt;br /&gt;
Pour cela, utiliser la procédure &#039;&#039;&#039;Find And Install&#039;&#039;&#039; et ajouter l&#039;URL de mise à jour:&lt;br /&gt;
http://www.acceleo.org/update/&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;UML2Dolibarr&lt;br /&gt;
Pour cela, récupérer les projets par la commande:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
svn checkout svn://svn.forge.objectweb.org/svnroot/acceleo/trunk/modules/community/uml21/dolibarr/trunk/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
et les importer dans Eclipse.&lt;br /&gt;
&lt;br /&gt;
== Si vous êtes sous Windows ==&lt;br /&gt;
&lt;br /&gt;
* Notepad++ (pour ceux qui ne supportent pas java ou utilisent un vieux coucou trop faible pour Eclipse).&lt;br /&gt;
&lt;br /&gt;
* WinMerge (pour la comparaison de fichiers ou répertoires)&lt;br /&gt;
&lt;br /&gt;
* CygWin (pour la commande patch et la commande en ligne cvs si vous préferez les lignes de commandes)&lt;br /&gt;
&lt;br /&gt;
== Si vous désirez faire du debuggage et tunning avec XDebug ==&lt;br /&gt;
&lt;br /&gt;
* Installer xdebug&lt;br /&gt;
Sous Ubuntu: Installer le package php-xdebug&lt;br /&gt;
&lt;br /&gt;
Sous Wampserver/Windows, téléchargé le fichier php_debug_xxx.dll sur http://www.xdebug.org et le placer dans le répertoire ext de php de WampServer.&lt;br /&gt;
&lt;br /&gt;
* Modifier le fichier php.ini (ou xdebug.ini) pour ajouter les paramètres:&lt;br /&gt;
&lt;br /&gt;
 [xdebug]&lt;br /&gt;
 xdebug.remote_enable=on&lt;br /&gt;
 xdebug.remote_handle=dbgp&lt;br /&gt;
 xdebug.remote_host=localhost&lt;br /&gt;
 xdebug.remote_port=9000&lt;br /&gt;
 xdebug.profiler_enable=1&lt;br /&gt;
 xdebug.show_local_vars=off&lt;br /&gt;
 xdebug.profiler_output_dir=c:/temp&lt;br /&gt;
 xdebug.profiler_append=0&lt;br /&gt;
&lt;br /&gt;
* Ensuite pour analyser les fichiers de profiling générés par XDebug, vous pouvez installer KCacheGrind (Linux) ou WinCacheGrind (Windows).&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
Si vous êtes un développeur officiel avec accès CVS en écriture, ajouter dans la configuration CVS de votre Eclipse, une entrée CVS.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;:ext:yourlogin@cvs.savannah.nongnu.org:/cvsroot/dolibarr&#039;&#039;&#039; pour la version principale de Dolibarr&lt;br /&gt;
* &#039;&#039;&#039;:ext:yourlogin@cvs.savannah.nongnu.org:/cvsroot/dolibarrmod&#039;&#039;&#039; pour les modules externes&lt;br /&gt;
&lt;br /&gt;
Sinon il vous faut récupérer les sources depuis le tarball disponible sur le site web Dolibarr ( http://www.dolibarr.fr ) dans l&#039;espace téléchargement&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=18186</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=18186"/>
		<updated>2010-02-05T10:26:47Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Générer la classe PHP d&amp;#039;accès */&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;
== Créer votre descripteur ==&lt;br /&gt;
&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]] 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 ==&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:ComposedProducts:@composition:/composition/show_composition.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 qui contient la correspondance entre le code traduction et le libellé à afficher.&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 onlget&#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érer 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 à votre page ainsi que le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039;.&lt;br /&gt;
Modifier le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; 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 &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; (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ée.&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 â etre iniitlaisé, 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 était 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;
Aller sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaitre un icone qui permet d&#039;accéder à la page de configuratione tvous devez etre capable de modifier ces options et les voir conservé 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 le permission 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ée 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;action s 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>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=18152</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=18152"/>
		<updated>2010-02-04T09:48:31Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Ajouter les onglets d&amp;#039;une fiche entité sur ses propres pages */&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;
== Créer votre descripteur ==&lt;br /&gt;
&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]] 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 ==&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; 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 un onglet sur 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:ComposedProducts:@composition:/composition/show_composition.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 fundation 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 qui contient la correspondance entre le code traduction et le libellé à afficher.&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 mêmes onglets qu&#039;une fiche entité (produit, tiers, etc.) sur vos IHM.&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;
&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;
** &#039;&#039;À compléter&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer un objet correspondant à l&#039;entité voulue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créer un 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($id) de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet à récupérer.&lt;br /&gt;
&lt;br /&gt;
Il faudrait donc avoir passé cet identifiant dans l&#039;url (ex : view.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;
$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. Préparer la liste des onglets correspondants à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utiliser la fonction XX_prepare_head($obj), ou XX 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&#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 à votre page ainsi que le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039;.&lt;br /&gt;
Modifier le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; 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 &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; (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ée.&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;
=== Arborescence et fonctionnement ===&lt;br /&gt;
A compléter...&lt;br /&gt;
&lt;br /&gt;
=== Réaliser vos pages templates ===&lt;br /&gt;
A compléter...&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;
Aller sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaitre un icone qui permet d&#039;accéder à la page de configuratione tvous devez etre capable de modifier ces options et les voir conservé 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 le permission 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ée 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;action s 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>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_module&amp;diff=18151</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=18151"/>
		<updated>2010-02-03T21:42:39Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* File:Art.png Ajouter vos onglets sur les fiches entités (optionnel) */  Ajout d&amp;#039;une section pour l&amp;#039;affichage des onglets existant sur de nouvelles pages&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;
== Créer votre descripteur ==&lt;br /&gt;
&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]] 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 ==&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; 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 un onglet sur 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:ComposedProducts:@composition:/composition/show_composition.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 fundation 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 qui contient la correspondance entre le code traduction et le libellé à afficher.&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 mêmes onglets qu&#039;une fiche entité (produit, tiers, etc.) sur vos IHM.&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;
&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;
** &#039;&#039;À compléter&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;2. Créer un objet correspondant à l&#039;entité voulue&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Créer un 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($id) de la classe correspondante, en passant en paramètre l&#039;identifiant de l&#039;objet à récupérer.&lt;br /&gt;
&lt;br /&gt;
Il faudrait donc avoir passé cet identifiant dans l&#039;url (ex : view.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;
$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. Préparer la liste des onglets correspondants à l&#039;entité choisie&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Utiliser la fonction XX_prepare_head($obj), ou XX 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&#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 &amp;lt;div class=&#039;&#039;&amp;gt; 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 (&amp;lt;/div&amp;gt;) 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 à votre page ainsi que le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039;.&lt;br /&gt;
Modifier le fichier &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; 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 &#039;&#039;&#039;pre.inc.php&#039;&#039;&#039; (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ée.&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;
=== Arborescence et fonctionnement ===&lt;br /&gt;
A compléter...&lt;br /&gt;
&lt;br /&gt;
=== Réaliser vos pages templates ===&lt;br /&gt;
A compléter...&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;
Aller sur la page &#039;&#039;&#039;Configuration-&amp;gt;module&#039;&#039;&#039;, vous devez voir apparaitre un icone qui permet d&#039;accéder à la page de configuratione tvous devez etre capable de modifier ces options et les voir conservé 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 le permission 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ée 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;action s 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>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Documentation_D%C3%A9veloppeur&amp;diff=18085</id>
		<title>Documentation Développeur</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Documentation_D%C3%A9veloppeur&amp;diff=18085"/>
		<updated>2010-01-29T10:44:01Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Développer un nouveau module/extension pour les IHM (nouveaux écrans) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Informations générales =&lt;br /&gt;
Ce chapitre regroupe des informations générales qu&#039;il est nécessaire de lire avant de commencer toute action de développement sur Dolibarr.&lt;br /&gt;
# [[Projet Dolibarr|Organisation du projet]]&lt;br /&gt;
# [[Outils et principe|A savoir avant de commencer à developper]]&lt;br /&gt;
# [[Outils de développement|Environnement et Outils de développement]]&lt;br /&gt;
# [[Librairies externes et dépendances]]&lt;br /&gt;
# [[Langages et normes|Langage et normes de développement]]&lt;br /&gt;
# [[FAQ_D%C3%A9veloppeur#R.C3.A9cup.C3.A9rer.2Fmettre_.C3.A0_jour_la_version_CVS_d.C3.A9veloppeur|Récupérer une version depuis le CVS]]&lt;br /&gt;
&lt;br /&gt;
= La configuration technique de Dolibarr =&lt;br /&gt;
La configuration technique de Dolibarr (mode authentification à l&#039;application, identifiant de la base de données et location de l&#039;espace de stockage des fichiers) est définie dans le seul fichier de configuration conf/conf.php.&lt;br /&gt;
Voir [[Fichier de configuration]] pour plus d&#039;informations.&lt;br /&gt;
&lt;br /&gt;
= La Base de données =&lt;br /&gt;
# [[Charte de nommage]]&lt;br /&gt;
# [[Liste des tables]]&lt;br /&gt;
&lt;br /&gt;
= Liste des modules existant =&lt;br /&gt;
La documentation technique, spécifique à un module fonctionnel standard de Dolibarr, est définie sur la page de documentation développeur de chaque module. Choisissez la page qui vous concerne pour y accéder:&lt;br /&gt;
&lt;br /&gt;
* La liste des modules standards est définie sur la page [[:Category:Liste des Modules|Liste des Modules]]&lt;br /&gt;
* La liste des modules complémentaires est définie sur la page [[:Category:Modules_complémentaires|Modules complémentaires]]&lt;br /&gt;
&lt;br /&gt;
= Développer un nouveau module/extension pour les [http://fr.wikipedia.org/wiki/Interface_homme-machine IHM] (nouveaux écrans) =&lt;br /&gt;
Cette section décrit comment développer un nouveau module sur l&#039;interface utilisateur de Dolibarr (IHM).&lt;br /&gt;
Un module pour l&#039;IHM contient aussi bien des écrans que des données propres, voir une feuille de style.&lt;br /&gt;
Le développement de script ne rentre pas dans ce périmètre et est décrit au chapitre suivant.&lt;br /&gt;
Le développement de modules de numérotations, de documents, de thèmes ou de triggers est décrit dans des chapitres suivants également.&lt;br /&gt;
&lt;br /&gt;
Pour développer votre propre module d&#039;extension des IHM, aller sur le didacticiel: [[Développement module]]&lt;br /&gt;
&lt;br /&gt;
= Développer un script ligne de commande ou batch =&lt;br /&gt;
Cette section décrit la procédure pour développer son propre script batch afin de réaliser des traitements dans Dolibarr (lecture, écriture, etc...).&lt;br /&gt;
La réalisation de modification sur l&#039;interface utilisateur (IHM) ne rentre pas dans ce périmètre. Voir le chapitre précédent pour cela.&lt;br /&gt;
&lt;br /&gt;
Pour développer un script quel qu&#039;il soit, comme un script de traitement cron ou encore un script d&#039;import de données issues d&#039;un autre système, se référer à la page: [[Développement de scripts]]&lt;br /&gt;
&lt;br /&gt;
= Le Système de paramétrage =&lt;br /&gt;
Il existe 2 niveaux de paramétrage dans Dolibarr.&lt;br /&gt;
* Le global est stocké dans la [[Table llx_const]].&lt;br /&gt;
* Le paramétrage propre à un utilisateur est stocké dans la [[Table llx_user_param]]&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Constantes]]&lt;br /&gt;
&lt;br /&gt;
= Le Système de menus =&lt;br /&gt;
Voir la page [[Système de menus]]&lt;br /&gt;
&lt;br /&gt;
= Le Système des thèmes =&lt;br /&gt;
Voir la page [[Themes]]&lt;br /&gt;
&lt;br /&gt;
= Le Système des boites =&lt;br /&gt;
Voir la page [[Système des boites]]&lt;br /&gt;
&lt;br /&gt;
= Le Système d&#039;authentification =&lt;br /&gt;
Voir la page [[Authentification]]&lt;br /&gt;
&lt;br /&gt;
= Le Système des permissions =&lt;br /&gt;
Voir la page [[Permissions]]&lt;br /&gt;
&lt;br /&gt;
= Le Système de traduction =&lt;br /&gt;
Voir la page [[Système de traduction]]&lt;br /&gt;
&lt;br /&gt;
= La Gestion d&#039;erreur =&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Gestion d&#039;erreur]]&lt;br /&gt;
&lt;br /&gt;
= Les modules de numérotation =&lt;br /&gt;
Pour chaque entité créée dans l&#039;application, Dolibarr attribue une référence. Afin de pouvoir adapter cette référence à toute utilisation, Dolibarr utilise des modules pour définir la règle de génération de cette référence. Des modules sont fournis en standard donc certains sont génériques et permettent de définir le masque de numérotation (nombre sur x caractère, avec ou sans prefix, incluant la date ou pas, etc), ce qui permet de répondre à la plupart des besoins. Toutefois, il existe toujours des cas où le module fourni en standard ne répond pas au besoin. Dans ce cas il est nécessaire de développer son propre module de numérotation.&lt;br /&gt;
Plus d&#039;information sur la page [[Créer un module de numérotation]]&lt;br /&gt;
&lt;br /&gt;
= Les modèles et la génération de documents =&lt;br /&gt;
Plus de documentation au sujet de la génération de documents depuis des modèles est disponible sur la page [[Creer un modele de document]]&lt;br /&gt;
&lt;br /&gt;
= Le stockage des fichiers/documents =&lt;br /&gt;
Voir la page [[Document générés]]&lt;br /&gt;
&lt;br /&gt;
= Les exports/imports de masse =&lt;br /&gt;
# [[Imports de masse]]&lt;br /&gt;
# [[Exports|Exports de masse]]&lt;br /&gt;
&lt;br /&gt;
= Interfaces et liens avec d&#039;autres applications =&lt;br /&gt;
# [[Interfaces Dolibarr vers exterieur]] (Triggers Dolibarr)&lt;br /&gt;
# [[Interfaces Exterieur vers Dolibarr]]&lt;br /&gt;
# [[Services Web]]&lt;br /&gt;
&lt;br /&gt;
= FAQ =&lt;br /&gt;
Toutes FAQ sont disponibles via la page d&#039;index [[:Category:FAQ FR|FAQ FR]]&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Produits&amp;diff=17976</id>
		<title>Module Produits</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Produits&amp;diff=17976"/>
		<updated>2010-01-14T15:10:44Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Produit]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Produits|&lt;br /&gt;
num=50|&lt;br /&gt;
devdoc=[[Module Produits (développeur)]]|&lt;br /&gt;
userdoc=Cette page|}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
Ce module permet de gérer un catalogue de produits. Voir aussi le [[Module Services]] pour gérer un catalogue de services.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
{{NoInstallModuleFr}}&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
{{ActivationModuleFr}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Une barre de recherche des produits peut être utilisée à la place de la liste déroulante (pratique si grand nombre de produits).&lt;br /&gt;
&lt;br /&gt;
Il faut pour cela activer, dans le module produits, l&#039;option &amp;quot;Utiliser une barre de recherche ...&amp;quot; et laisser AJAX/Javascript activé dans les paramètres d&#039;interface utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Définition =&lt;br /&gt;
== Produits ==&lt;br /&gt;
Un produit Dolibarr est un bien à gérer, soit parce qu&#039;il caractérise un objet proposé à des clients, soit parce qu&#039;il caractérise un objet obtenus auprès de fournisseurs.&lt;br /&gt;
Il s&#039;agit de biens matériels, contrairement aux [[Services]].&lt;br /&gt;
&lt;br /&gt;
Un produit répond, en résumé, aux règles suivantes:&lt;br /&gt;
* Un produit peut se stocker dans un entrepôt (seuls les produits d&#039;ailleurs apparaissent dans le module [[Module_Stock|Stock]]. Les services n&#039;y apparaissent pas).&lt;br /&gt;
* Un produit peut se livrer (seuls les produits d&#039;ailleurs apparaissent dans le module [[Module Expédition|Expedition]]. Les services n&#039;y apparaissent pas. Ces derniers sont réalisés ou non, mais pas livrés).&lt;br /&gt;
* Un produit est en général un bien matériel. Sa valeur souvent se déprécie avec le temps (Un produit d&#039;occasion vaut moins que le même produit neuf).&lt;br /&gt;
&lt;br /&gt;
== Produits associés ==&lt;br /&gt;
Des produits associés sont des [[Produits|produits]] attachés à un produit père.&lt;br /&gt;
&lt;br /&gt;
Un produit associé répond aux règles suivantes:&lt;br /&gt;
* Lors de l&#039;ajout d&#039;un produit dans un document (propale, facture, commande), seule la ligne du produit père est affichées.&lt;br /&gt;
* Le stock d&#039;un sous-produit est incrémenté/décrémenté quand le produit est décrémenté.&lt;br /&gt;
&lt;br /&gt;
= Cycle de vie / Règles de gestion =&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
= Exemples de cas d&#039;utilisation =&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCMP01: &lt;br /&gt;
|situation=&lt;br /&gt;
|actions=&lt;br /&gt;
}}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Produits&amp;diff=17975</id>
		<title>Module Produits</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Produits&amp;diff=17975"/>
		<updated>2010-01-14T15:09:59Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Produit]]&lt;br /&gt;
{{TemplateDocUtil}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Produits|&lt;br /&gt;
num=50|&lt;br /&gt;
devdoc=[[Module Produits (développeur)]]|&lt;br /&gt;
userdoc=Cette page|}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
Ce module permet de gérer un catalogue de produits. Voir aussi le [[Module Services]] pour gérer un catalogue de services.&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
{{NoInstallModuleFr}}&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
{{ActivationModuleFr}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Remarque :&#039;&#039;&#039; Une barre de recherche des produits peut être utilisée à la place de la liste déroulante (pratique si grand nombre de produits).&lt;br /&gt;
Il faut pour cela activer, dans le module produits, l&#039;option &amp;quot;Utiliser une barre de recherche ...&amp;quot; et laisser AJAX/Javascript activé dans les paramètres d&#039;interface utilisateur.&lt;br /&gt;
&lt;br /&gt;
= Définition =&lt;br /&gt;
== Produits ==&lt;br /&gt;
Un produit Dolibarr est un bien à gérer, soit parce qu&#039;il caractérise un objet proposé à des clients, soit parce qu&#039;il caractérise un objet obtenus auprès de fournisseurs.&lt;br /&gt;
Il s&#039;agit de biens matériels, contrairement aux [[Services]].&lt;br /&gt;
&lt;br /&gt;
Un produit répond, en résumé, aux règles suivantes:&lt;br /&gt;
* Un produit peut se stocker dans un entrepôt (seuls les produits d&#039;ailleurs apparaissent dans le module [[Module_Stock|Stock]]. Les services n&#039;y apparaissent pas).&lt;br /&gt;
* Un produit peut se livrer (seuls les produits d&#039;ailleurs apparaissent dans le module [[Module Expédition|Expedition]]. Les services n&#039;y apparaissent pas. Ces derniers sont réalisés ou non, mais pas livrés).&lt;br /&gt;
* Un produit est en général un bien matériel. Sa valeur souvent se déprécie avec le temps (Un produit d&#039;occasion vaut moins que le même produit neuf).&lt;br /&gt;
&lt;br /&gt;
== Produits associés ==&lt;br /&gt;
Des produits associés sont des [[Produits|produits]] attachés à un produit père.&lt;br /&gt;
&lt;br /&gt;
Un produit associé répond aux règles suivantes:&lt;br /&gt;
* Lors de l&#039;ajout d&#039;un produit dans un document (propale, facture, commande), seule la ligne du produit père est affichées.&lt;br /&gt;
* Le stock d&#039;un sous-produit est incrémenté/décrémenté quand le produit est décrémenté.&lt;br /&gt;
&lt;br /&gt;
= Cycle de vie / Règles de gestion =&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
&lt;br /&gt;
= Exemples de cas d&#039;utilisation =&lt;br /&gt;
{{ToComplete}}&lt;br /&gt;
{{ExamplesCaseFr&lt;br /&gt;
|nom=UCMP01: &lt;br /&gt;
|situation=&lt;br /&gt;
|actions=&lt;br /&gt;
}}&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Syslog_(d%C3%A9veloppeur)&amp;diff=17973</id>
		<title>Module Syslog (développeur)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Syslog_(d%C3%A9veloppeur)&amp;diff=17973"/>
		<updated>2010-01-14T10:37:20Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Remarque */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Syslog]]&lt;br /&gt;
[[Category:Liste des Modules]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Syslog|&lt;br /&gt;
num=42|&lt;br /&gt;
devdoc=Cette page|&lt;br /&gt;
userdoc=Aucune}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonction du module =&lt;br /&gt;
&lt;br /&gt;
Ce module permet d&#039;activer la fonction de logging (journalisation) dans Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= Détails du module =&lt;br /&gt;
&lt;br /&gt;
Le logging permet d&#039;enregistrer des messages de log :&lt;br /&gt;
&lt;br /&gt;
* Dans un fichier &lt;br /&gt;
** Le fichier par défaut sera &#039;&#039;&#039;DOL_DATA_ROOT/dolibarr.log&#039;&#039;&#039; (par exemple &#039;&#039;&#039;www.monsite.fr/dolibarr/documents/dolibarr.log&#039;&#039;&#039;).&lt;br /&gt;
** Il est possible de changer le fichier d&#039;enregistrement dans la page de configuration du module.&lt;br /&gt;
* Dans les logs PHP (avec la fonction syslog())&lt;br /&gt;
&lt;br /&gt;
= Fonction PHP =&lt;br /&gt;
&lt;br /&gt;
== Définition ==&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le logging dans du code PHP, il faut utiliser la fonction suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_syslog($message, $level = LOG_INFO)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cette fonction est définie à la ligne 22 du fichier dolibarr/htdocs/lib/functions.lib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Paramètres ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;$message&#039;&#039;&#039; : chaîne à enregistrer dans le fichier de log&lt;br /&gt;
* &#039;&#039;&#039;$level&#039;&#039;&#039; : constante permettant d&#039;indiquer le niveau du message. Elle peut prendre les valeurs suivantes:&lt;br /&gt;
** Sur serveur Windows : LOG_ERR=4, LOG_WARNING=5, LOG_NOTICE=LOG_INFO=LOG_DEBUG=6&lt;br /&gt;
** Sur serveur Unix : LOG_ERR=3, LOG_WARNING=4, LOG_INFO=6, LOG_DEBUG=7&lt;br /&gt;
** Il est ensuite possible de configurer le niveau d&#039;enregistrement des logs dans la page de configuration du module.&lt;br /&gt;
&lt;br /&gt;
= Remarques =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Les fonctions syslog sont bugguées sous Windows et genèrent des fautes de protection mémoire.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pour resoudre, utiliser le loggage fichier, au lieu du loggage syslog (configuration du module). Si SYSLOG_FILE_NO_ERROR défini, on ne gère pas erreur écriture log.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Source: documentation Doxygen&lt;br /&gt;
&lt;br /&gt;
= Voir aussi =&lt;br /&gt;
&lt;br /&gt;
Documentation Doxygen : [http://www.dolibarr.fr/doxygen/d9/d69/functions_8lib_8php.html#a9862cc723ca3a2d05ef5723946cc9250]&lt;br /&gt;
&lt;br /&gt;
{{ToComplete}}&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Module_Syslog_(d%C3%A9veloppeur)&amp;diff=17972</id>
		<title>Module Syslog (développeur)</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Module_Syslog_(d%C3%A9veloppeur)&amp;diff=17972"/>
		<updated>2010-01-14T10:36:02Z</updated>

		<summary type="html">&lt;p&gt;Dmartin: /* Fonction du module */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Syslog]]&lt;br /&gt;
[[Category:Liste des Modules]]&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
{{TemplateModFR}}&lt;br /&gt;
{{BasculeDevUser|&lt;br /&gt;
nom=Syslog|&lt;br /&gt;
num=42|&lt;br /&gt;
devdoc=Cette page|&lt;br /&gt;
userdoc=Aucune}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Fonction du module =&lt;br /&gt;
&lt;br /&gt;
Ce module permet d&#039;activer la fonction de logging (journalisation) dans Dolibarr.&lt;br /&gt;
&lt;br /&gt;
= Détails du module =&lt;br /&gt;
&lt;br /&gt;
Le logging permet d&#039;enregistrer des messages de log :&lt;br /&gt;
&lt;br /&gt;
* Dans un fichier &lt;br /&gt;
** Le fichier par défaut sera &#039;&#039;&#039;DOL_DATA_ROOT/dolibarr.log&#039;&#039;&#039; (par exemple &#039;&#039;&#039;www.monsite.fr/dolibarr/documents/dolibarr.log&#039;&#039;&#039;).&lt;br /&gt;
** Il est possible de changer le fichier d&#039;enregistrement dans la page de configuration du module.&lt;br /&gt;
* Dans les logs PHP (avec la fonction syslog())&lt;br /&gt;
&lt;br /&gt;
= Fonction PHP =&lt;br /&gt;
&lt;br /&gt;
== Définition ==&lt;br /&gt;
&lt;br /&gt;
Pour utiliser le logging dans du code PHP, il faut utiliser la fonction suivante :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
dol_syslog($message, $level = LOG_INFO)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Cette fonction est définie à la ligne 22 du fichier dolibarr/htdocs/lib/functions.lib.php&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Paramètres ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;$message&#039;&#039;&#039; : chaîne à enregistrer dans le fichier de log&lt;br /&gt;
* &#039;&#039;&#039;$level&#039;&#039;&#039; : constante permettant d&#039;indiquer le niveau du message. Elle peut prendre les valeurs suivantes:&lt;br /&gt;
** Sur serveur Windows : LOG_ERR=4, LOG_WARNING=5, LOG_NOTICE=LOG_INFO=LOG_DEBUG=6&lt;br /&gt;
** Sur serveur Unix : LOG_ERR=3, LOG_WARNING=4, LOG_INFO=6, LOG_DEBUG=7&lt;br /&gt;
** Il est ensuite possible de configurer le niveau d&#039;enregistrement des logs dans la page de configuration du module.&lt;br /&gt;
&lt;br /&gt;
= Remarque =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&amp;quot;Les fonctions syslog sont bugguées sous Windows et genèrent des fautes de protection mémoire.&lt;br /&gt;
&lt;br /&gt;
Pour resoudre, utiliser le loggage fichier, au lieu du loggage syslog (configuration du module). Si SYSLOG_FILE_NO_ERROR défini, on ne gère pas erreur écriture log.&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Voir aussi =&lt;br /&gt;
&lt;br /&gt;
Documentation Doxygen : [http://www.dolibarr.fr/doxygen/d9/d69/functions_8lib_8php.html#a9862cc723ca3a2d05ef5723946cc9250]&lt;br /&gt;
&lt;br /&gt;
{{ToComplete}}&lt;/div&gt;</summary>
		<author><name>Dmartin</name></author>
	</entry>
</feed>