<?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=Mcg</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=Mcg"/>
	<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php/Special:Contributions/Mcg"/>
	<updated>2026-11-13T07:20:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Premiers_param%C3%A9trages&amp;diff=8358</id>
		<title>Premiers paramétrages</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Premiers_param%C3%A9trages&amp;diff=8358"/>
		<updated>2009-02-04T13:14:10Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Quelques options cachées */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation proprement dite de Dolibarr, vous devez le paramétrer pour l&#039;adapter à vos besoins avant de le mettre en production.&lt;br /&gt;
&lt;br /&gt;
== Société/Institution ==&lt;br /&gt;
&lt;br /&gt;
Pour commencer, à partir de la page d&#039;accueil, rendez-vous dans la partie &amp;quot;Configuration -&amp;gt; Société/Institution&amp;quot; et éditez les informations de votre institution.&lt;br /&gt;
N&#039;oubliez pas d&#039;indiquer votre pays car certaines fonctions (TVA) en dépendent.&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
&lt;br /&gt;
L&#039;activation des modules est très importante. Elle dépend de l&#039;utilisation que vous prévoyez de faire de Dolibarr. Il est très peu probable que vous ayez besoin de la totalité des modules.&lt;br /&gt;
Il vous faut donc activer les modules dont vous aurez très probablement besoin. Par exemple: Sociétés, Factures éventuellement Comptabilité.&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;êtes pas sûr de vous, activez les modules les uns après les autres et voyez les fonctionnalités qu&#039;ils ajoutent dans Dolibarr (vérifiez avant les droits, voir ci-dessous). Il est bien sûr possible de désactiver des modules après coup.&lt;br /&gt;
&lt;br /&gt;
Une fois activés, certains modules nécessitent une configuration supplémentaire (cliquer sur l&#039;icône qui apparait tout à droite sur la même ligne). &lt;br /&gt;
Voir, par exemple, pour les factures [[FactureConfiguration]].&lt;br /&gt;
&lt;br /&gt;
== Affichage ==&lt;br /&gt;
&lt;br /&gt;
Cette partie vous permet de choisir la langue et la présentation des pages. Dans un premier temps vous devriez conserver les options par défaut.&lt;br /&gt;
&lt;br /&gt;
== Autres (Boites, Alertes, Sécurité, Limites et précisions, EMails, Dico...) ==&lt;br /&gt;
Les autres entrées du menu Configuration sont des options avancées.&lt;br /&gt;
Il n&#039;est pas obligatoire de les parcourir.&lt;br /&gt;
&lt;br /&gt;
== Utilisateurs ==&lt;br /&gt;
La dernière étape consiste à créer les utilisateurs et à attribuer les permissions.&lt;br /&gt;
Presque tous les modules, même activés précédemment, ne sont pas accessibles si on n&#039;en donne pas la permission.&lt;br /&gt;
Pour cela, vous pouvez vous rendre dans le menu &#039;&#039;&#039;Accueil -&amp;gt; Utilisateurs &amp;amp; Groupes&#039;&#039;&#039; pour définir les utilisateurs et leurs droits. Attention, il faudra penser à vérifier et redéfinir les droits utilisateurs quand vous activerez à nouveau de nouveaux modules.&lt;br /&gt;
La liste des droits disponibles dépendant des modules activés (voir plus haut), il est recommandé de configurer cette partie après avoir activé les modules désirés.&lt;br /&gt;
Pour certaines actions, si vous n&#039;avez pas les droits pour faire une action, Dolibarr ne vous la proposera pas. Vous risquez de rater des choses utiles et/ou importantes.&lt;br /&gt;
Pour donner les droits à un utilisateur ou vous-même si vous êtes administrateur, aller dans &#039;&#039;&#039;Accueil -&amp;gt; Utilisateurs &amp;amp; Groupes&#039;&#039;&#039;, choisissez la fiche de l&#039;utilisateur désiré, puis cliquer sur l&#039;onglet &#039;&#039;&#039;Permission&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Quelques options cachées ==&lt;br /&gt;
Quelques options non visibles dans les interfaces (souvent car en bêta ou en expérimentation) sont disponibles. Dans la plupart des cas, vous n&#039;avez pas besoin de ces fonctions et leur utilisation peut rendre instable l&#039;application.&lt;br /&gt;
&lt;br /&gt;
Pour les activer il faut définir une constante à 1 dans &#039;&#039;&#039;Accueil - Configuration - Divers&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Options globales ===&lt;br /&gt;
* MAIN_APPLICATION_TITLE =&amp;gt; Permet de définir le nom de l&#039;application (qui apparait sur la page de login par defaut).&lt;br /&gt;
&lt;br /&gt;
* MAIN_CONFIRM_AJAX =&amp;gt; Si cette constante est définie (à autre chose que 0), le message de confirmation de suppression de lignes de facture, propal, etc, est une popup Ajax, au lieu d&#039;un formulaire affiché par rechargement de la page.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_FULL_SCANLIST =&amp;gt; Constante à définir pour désactiver le scan complet des tables afin de connaitre le nombre total d&#039;éléments pour permettre des paginations affichant le nombre de pages. A activer sur les systèmes ayant un nombre très important de données (Tables de + de 500 000 enregistrements).&lt;br /&gt;
&lt;br /&gt;
* MAIN_AUTOFILL_DATE =&amp;gt; Si cette constante est définie (à autre chose que 0), la date de facture, propal, commande ou paiement est préremplie avec la date du jour. Il est fortement recommandé de NE PAS ACTIVER cette option, ceci générant une saisie sans validation de la part des utilisateurs sur les dates, ce qui se traduit par des données incorrectes enregistrées et un beau casse tête lorsqu&#039;il faut faire sa compta ! Toutefois l&#039;option reste disponible, à la demande de certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* MAIN_AUTOFILL_TOWNFROMZIP =&amp;gt; Permet le remplissage automatique de la ville depuis le code postal. Ajax ne doit pas etre désactivé pour que cette option fonctionne (Fonction bugguée).&lt;br /&gt;
&lt;br /&gt;
* MAIN_MAIL_ALLOW_SENDMAIL_F =&amp;gt; Sur les systèmes Linux ou BSD, la fonction d&#039;envoi de mail de PHP utilise la commande sendmail local au serveur. Dans certains cas, l&#039;email émetteur doit être passé en ligne de commande par l&#039;option -f à sendmail. Cette option permet donc de demander à Dolibarr d&#039;utiliser la fonction &#039;&#039;&#039;mail&#039;&#039;&#039; de php en intégrant l&#039;option -f. Notons que dans la plupart des cas, même avec sendmail, l&#039;email émetteur est bien géré car intégré avec les autres paramètres dans l&#039;entête technique du mail. Cette option permet juste de passer outre certaines configurations qui rendent obligatoire l&#039;option -f.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DEMO =&amp;gt; Désactive certaines fonctions pour rendre l&#039;application figée à certains niveaux. Ceci est requis si Dolibarr est en accès comme site de démo à des utilisateurs qui aiment un peu trop faire n&#039;importe quoi.&lt;br /&gt;
&lt;br /&gt;
* MAIN_USE_HOURMIN_IN_DATE_RANGE =&amp;gt; Sur toutes les lignes de détail d&#039;entité (facture, commande, contrat...), il est possible de définir l&#039;heure en plus du jour sur les champs date de début et de fin de services.&lt;br /&gt;
&lt;br /&gt;
* MAIN_SHOW_LOGO =&amp;gt; Affiche logo société en haut du menu gauche.&lt;br /&gt;
&lt;br /&gt;
* MAIN_REMOVE_INSTALL_WARNING =&amp;gt; Supprime le warning de sécurité apparent aux administrateurs si l&#039;URL /install est accessible. Il est préférable de ne pas utiliser ce paramètre mais de plutôt placer un fichier nommé install.lock dans la racine de Dolibarr, ce qui a pour effet non seulement de supprimer le warning mais aussi d&#039;empêcher tout utilisation de l&#039;outil d&#039;installation et mise à jour (qui ne requiert pas d&#039;habilitation) tant que ce fichier est présent.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_FORCE_SAVEAS =&amp;gt; Si votre navigateur propose systématiquement d&#039;enregistrer les fichiers sur disques (comme les PDF), essayer d&#039;ajouter cette option. Les fichiers pourront alors s&#039;afficher dans le lecteur du navigateur.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_PDF_COMPRESSION =&amp;gt; Désactive la compression sur les PDF générés. Ne fonctionne qu&#039;avec certains modèles de génération PDF.&lt;br /&gt;
&lt;br /&gt;
=== Module Propositions Commerciales ===&lt;br /&gt;
Aucune&lt;br /&gt;
&lt;br /&gt;
=== Module Factures ===&lt;br /&gt;
* FACTURE_ENABLE_RECUR =&amp;gt; Active la fonction des factures prédéfinies. Fonction instable.&lt;br /&gt;
* FACTURE_VENTILATION =&amp;gt; Active une veille fonctionnalité de ventilation comptable. Fonction instable.&lt;br /&gt;
&lt;br /&gt;
=== Module Commandes ===&lt;br /&gt;
* COMMANDE_REQUIRE_SOURCE =&amp;gt; Rend obligatoire la saisie du champ source lors de la création d&#039;une commande.&lt;br /&gt;
&lt;br /&gt;
=== Module Contrat ===&lt;br /&gt;
* CONTRAT_EDITWHENVALIDATED =&amp;gt; Rend possible la modification d&#039;un contrat après qu&#039;il ait été validé.&lt;br /&gt;
&lt;br /&gt;
=== Module Agenda ===&lt;br /&gt;
* AGENDA_MAX_EVENTS_DAY_VIEW =&amp;gt; Défini le nombre max d&#039;entrées visibles pour chaque jour dans l&#039;agenda. Vaut 3 par défaut. La valeur 0 signifie aucune limite.&lt;br /&gt;
&lt;br /&gt;
=== Module Produit ===&lt;br /&gt;
* PRODUCT_CANVAS_ABILITY =&amp;gt; Autorise les fonctions canvas (Ancien système de module).&lt;br /&gt;
Ceci rend visible les fonctions du module de livres basé sur l&#039;ancienne architecture.&lt;br /&gt;
&lt;br /&gt;
=== Module Bookmark ===&lt;br /&gt;
* BOOKMARKS_SHOW_IN_MENU =&amp;gt; Mettre le nombre de marques-pages qui s&#039;affichent dans le menu gauche.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Premiers_param%C3%A9trages&amp;diff=8357</id>
		<title>Premiers paramétrages</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Premiers_param%C3%A9trages&amp;diff=8357"/>
		<updated>2009-02-04T13:12:02Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Utilisateurs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Après l&#039;installation proprement dite de Dolibarr, vous devez le paramétrer pour l&#039;adapter à vos besoins avant de le mettre en production.&lt;br /&gt;
&lt;br /&gt;
== Société/Institution ==&lt;br /&gt;
&lt;br /&gt;
Pour commencer, à partir de la page d&#039;accueil, rendez-vous dans la partie &amp;quot;Configuration -&amp;gt; Société/Institution&amp;quot; et éditez les informations de votre institution.&lt;br /&gt;
N&#039;oubliez pas d&#039;indiquer votre pays car certaines fonctions (TVA) en dépendent.&lt;br /&gt;
&lt;br /&gt;
== Modules ==&lt;br /&gt;
&lt;br /&gt;
L&#039;activation des modules est très importante. Elle dépend de l&#039;utilisation que vous prévoyez de faire de Dolibarr. Il est très peu probable que vous ayez besoin de la totalité des modules.&lt;br /&gt;
Il vous faut donc activer les modules dont vous aurez très probablement besoin. Par exemple: Sociétés, Factures éventuellement Comptabilité.&lt;br /&gt;
&lt;br /&gt;
Si vous n&#039;êtes pas sûr de vous, activez les modules les uns après les autres et voyez les fonctionnalités qu&#039;ils ajoutent dans Dolibarr (vérifiez avant les droits, voir ci-dessous). Il est bien sûr possible de désactiver des modules après coup.&lt;br /&gt;
&lt;br /&gt;
Une fois activés, certains modules nécessitent une configuration supplémentaire (cliquer sur l&#039;icône qui apparait tout à droite sur la même ligne). &lt;br /&gt;
Voir, par exemple, pour les factures [[FactureConfiguration]].&lt;br /&gt;
&lt;br /&gt;
== Affichage ==&lt;br /&gt;
&lt;br /&gt;
Cette partie vous permet de choisir la langue et la présentation des pages. Dans un premier temps vous devriez conserver les options par défaut.&lt;br /&gt;
&lt;br /&gt;
== Autres (Boites, Alertes, Sécurité, Limites et précisions, EMails, Dico...) ==&lt;br /&gt;
Les autres entrées du menu Configuration sont des options avancées.&lt;br /&gt;
Il n&#039;est pas obligatoire de les parcourir.&lt;br /&gt;
&lt;br /&gt;
== Utilisateurs ==&lt;br /&gt;
La dernière étape consiste à créer les utilisateurs et à attribuer les permissions.&lt;br /&gt;
Presque tous les modules, même activés précédemment, ne sont pas accessibles si on n&#039;en donne pas la permission.&lt;br /&gt;
Pour cela, vous pouvez vous rendre dans le menu &#039;&#039;&#039;Accueil -&amp;gt; Utilisateurs &amp;amp; Groupes&#039;&#039;&#039; pour définir les utilisateurs et leurs droits. Attention, il faudra penser à vérifier et redéfinir les droits utilisateurs quand vous activerez à nouveau de nouveaux modules.&lt;br /&gt;
La liste des droits disponibles dépendant des modules activés (voir plus haut), il est recommandé de configurer cette partie après avoir activé les modules désirés.&lt;br /&gt;
Pour certaines actions, si vous n&#039;avez pas les droits pour faire une action, Dolibarr ne vous la proposera pas. Vous risquez de rater des choses utiles et/ou importantes.&lt;br /&gt;
Pour donner les droits à un utilisateur ou vous-même si vous êtes administrateur, aller dans &#039;&#039;&#039;Accueil -&amp;gt; Utilisateurs &amp;amp; Groupes&#039;&#039;&#039;, choisissez la fiche de l&#039;utilisateur désiré, puis cliquer sur l&#039;onglet &#039;&#039;&#039;Permission&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Quelques options cachées ==&lt;br /&gt;
Quelques options non visibles dans les interfaces (souvent car en bêta ou en expérimentation) sont disponibles. Dans la plupart des cas, vous n&#039;avez pas besoin de ces fonctions et leur utilisation peu rendre instable l&#039;application.&lt;br /&gt;
&lt;br /&gt;
Pour les activer il faut définir une constante à 1 dans &#039;&#039;&#039;Accueil - Configuration - Divers&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
=== Options globales ===&lt;br /&gt;
* MAIN_APPLICATION_TITLE =&amp;gt; Permet de définir le nom de l&#039;application (qui apparait sur la page de login par defaut).&lt;br /&gt;
&lt;br /&gt;
* MAIN_CONFIRM_AJAX =&amp;gt; Si cette constante est définie (à autre chose que 0), le message de confirmation de suppression de lignes de facture, propal, etc, est une popup Ajax, au lieu d&#039;un formulaire affiché par rechargement de la page.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_FULL_SCANLIST =&amp;gt; Constante à définir pour désactiver le scan complet des tables afin de connaitre le nombre total d&#039;éléments pour permettre des paginations affichant le nombre de pages. A activer sur les systèmes ayant un nombre très important de données (Tables de + de 500 000 enregistrements).&lt;br /&gt;
&lt;br /&gt;
* MAIN_AUTOFILL_DATE =&amp;gt; Si cette constante est définie (à autre chose que 0), la date de facture, propal, commande ou paiement est préremplie avec la date du jour. Il est fortement recommandé de NE PAS ACTIVER cette option, ceci générant une saisie sans validation de la part des utilisateurs sur les dates, ce qui se traduit par des données incorrectes enregistrées et un beau casse tête lorsqu&#039;il faut faire sa compta ! Toutefois l&#039;option reste disponible, à la demande de certains utilisateurs.&lt;br /&gt;
&lt;br /&gt;
* MAIN_AUTOFILL_TOWNFROMZIP =&amp;gt; Permet le remplissage automatique de la ville depuis le code postal. Ajax ne doit pas etre désactivé pour que cette option fonctionne (Fonction bugguée).&lt;br /&gt;
&lt;br /&gt;
* MAIN_MAIL_ALLOW_SENDMAIL_F =&amp;gt; Sur les systèmes Linux ou BSD, la fonction d&#039;envoi de mail de PHP utilise la commande sendmail local au serveur. Dans certains cas, l&#039;email émetteur doit être passé en ligne de commande par l&#039;option -f à sendmail. Cette option permet donc de demander à Dolibarr d&#039;utiliser la fonction &#039;&#039;&#039;mail&#039;&#039;&#039; de php en intégrant l&#039;option -f. Notons que dans la plupart des cas, même avec sendmail, l&#039;email émetteur est bien géré car intégré avec les autres paramètres dans l&#039;entête technique du mail. Cette option permet juste de passer outre certaines configurations qui rendent obligatoire l&#039;option -f.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DEMO =&amp;gt; Désactive certaines fonctions pour rendre l&#039;application figée à certains niveaux. Ceci est requis si Dolibarr est en accès comme site de démo à des utilisateurs qui aiment un peu trop faire n&#039;importe quoi.&lt;br /&gt;
&lt;br /&gt;
* MAIN_USE_HOURMIN_IN_DATE_RANGE =&amp;gt; Sur toutes les lignes de détail d&#039;entité (facture, commande, contrat...), il est possible de définir l&#039;heure en plus du jour sur les champs date de début et de fin de services.&lt;br /&gt;
&lt;br /&gt;
* MAIN_SHOW_LOGO =&amp;gt; Affiche logo société en haut du menu gauche.&lt;br /&gt;
&lt;br /&gt;
* MAIN_REMOVE_INSTALL_WARNING =&amp;gt; Supprime le warning de sécurité apparent aux administrateurs si l&#039;URL /install est accessible. Il est préférable de ne pas utiliser ce paramètre mais de plutôt placer un fichier nommé install.lock dans la racine de Dolibarr, ce qui a pour effet non seulement de supprimer le warning mais aussi d&#039;empêcher tout utilisation de l&#039;outil d&#039;installation et mise à jour (qui ne requiert pas d&#039;habilitation) tant que ce fichier est présent.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_FORCE_SAVEAS =&amp;gt; Si votre navigateur propose systématiquement d&#039;enregistrer les fichiers sur disques (comme les PDF), essayer d&#039;ajouter cette option. Les fichiers pourront alors s&#039;afficher dans le lecteur du navigateur.&lt;br /&gt;
&lt;br /&gt;
* MAIN_DISABLE_PDF_COMPRESSION =&amp;gt; Désactive la compression sur les PDF générés. Ne fonctionne qu&#039;avec certains modèles de génération PDF.&lt;br /&gt;
&lt;br /&gt;
=== Module Propositions Commerciales ===&lt;br /&gt;
Aucune&lt;br /&gt;
&lt;br /&gt;
=== Module Factures ===&lt;br /&gt;
* FACTURE_ENABLE_RECUR =&amp;gt; Active la fonction des factures prédéfinies. Fonction instable.&lt;br /&gt;
* FACTURE_VENTILATION =&amp;gt; Active une veille fonctionnalité de ventilation comptable. Fonction instable.&lt;br /&gt;
&lt;br /&gt;
=== Module Commandes ===&lt;br /&gt;
* COMMANDE_REQUIRE_SOURCE =&amp;gt; Rend obligatoire la saisie du champ source lors de la création d&#039;une commande.&lt;br /&gt;
&lt;br /&gt;
=== Module Contrat ===&lt;br /&gt;
* CONTRAT_EDITWHENVALIDATED =&amp;gt; Rend possible la modification d&#039;un contrat après qu&#039;il ait été validé.&lt;br /&gt;
&lt;br /&gt;
=== Module Agenda ===&lt;br /&gt;
* AGENDA_MAX_EVENTS_DAY_VIEW =&amp;gt; Défini le nombre max d&#039;entrées visibles pour chaque jour dans l&#039;agenda. Vaut 3 par défaut. La valeur 0 signifie aucune limite.&lt;br /&gt;
&lt;br /&gt;
=== Module Produit ===&lt;br /&gt;
* PRODUCT_CANVAS_ABILITY =&amp;gt; Autorise les fonctions canvas (Ancien système de module).&lt;br /&gt;
Ceci rend visible les fonctions du module de livres basé sur l&#039;ancienne architecture.&lt;br /&gt;
&lt;br /&gt;
=== Module Bookmark ===&lt;br /&gt;
* BOOKMARKS_SHOW_IN_MENU =&amp;gt; Mettre le nombre de marques-pages qui s&#039;affichent dans le menu gauche.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_de_scripts&amp;diff=8356</id>
		<title>Développement de scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_de_scripts&amp;diff=8356"/>
		<updated>2009-02-04T13:08:18Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Développer un nouveau script */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Localisation ==&lt;br /&gt;
Les scripts en ligne de commande de Dolibarr doivent être situés dans le répertoire &#039;&#039;&#039;scripts&#039;&#039;&#039; de Dolibarr. Les scripts sont ensuite répartis dans des sous-répertoires en fonction de leur vocation.&lt;br /&gt;
Un certain nombre de scripts est donc fourni en standard.&lt;br /&gt;
&lt;br /&gt;
== Développer un nouveau script ==&lt;br /&gt;
Les scripts étant souvent réalisés pour un besoin spécifique, il y a de fortes chances que vous ne trouviez pas celui qui vous intéresse. Dans ce cas, nous allons vous expliquer comment développer votre propre script.&lt;br /&gt;
&lt;br /&gt;
=== Etape 1 - Création du squelette du script ===&lt;br /&gt;
La première étape est de reprendre le squelette de script disponible en &#039;&#039;&#039;dev/skeletons/skeleton_scripts.php&#039;&#039;&#039; et de le recopier en renommant, ce script dans le répertoire &#039;&#039;&#039;scripts/monrep/monscript.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois le script renommé, donnez lui les droits en exécution par la commande:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd scripts/monrep;&lt;br /&gt;
chmod a+rx monscript.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, lancez le pour voir si vous pouvez exécuter un script en mode ligne de commande. Pour cela, taper:&lt;br /&gt;
&amp;lt;pre&amp;gt;php-cli ./monscript.php&lt;br /&gt;
ou&lt;br /&gt;
php ./monscript.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous devriez obtenir le résultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: monscript.php param1 param2 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Etape 2 - Edition du code du script ===&lt;br /&gt;
Modifier le contenu du script pour réaliser les opérations qui vous intéressent.&lt;br /&gt;
Tout le code qui se trouve entre les balises&lt;br /&gt;
&amp;lt;pre&amp;gt;// ---------- START OF YOUR CODE HERE&amp;lt;/pre&amp;gt;&lt;br /&gt;
et&lt;br /&gt;
&amp;lt;pre&amp;gt;// ---------- END OY YOUR CODE&amp;lt;/pre&amp;gt;&lt;br /&gt;
est fourni à titre d&#039;exemple.&lt;br /&gt;
Vous pouvez le supprimer et y mettre le code qui vous intéresse.&lt;br /&gt;
Notez que dans cette portion, vous pouvez utiliser la variable $db qui est la ressource d&#039;accès à la base Dolibarr et qui est déjà initialisée.&lt;br /&gt;
L&#039;objet $conf qui contient la configuration Dolibarr est également disponible.&lt;br /&gt;
&lt;br /&gt;
==== Exemple insertion d&#039;un produit ====&lt;br /&gt;
Par exemple pour insérer un produit dans la base dolibarr, vous pouvez y placer le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Inclusion classe métier utilisateur et product&lt;br /&gt;
require_once(DOL_DOCUMENT_ROOT.&amp;quot;/user.class.php&amp;quot;);&lt;br /&gt;
require_once(DOL_DOCUMENT_ROOT.&amp;quot;/product.class.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Création d&#039;une instance utilisateur&lt;br /&gt;
$user=new User($db);&lt;br /&gt;
&lt;br /&gt;
// Création d&#039;une instance de product&lt;br /&gt;
$myproduct=new Product($db);&lt;br /&gt;
&lt;br /&gt;
// Définition des propriétés de l&#039;instance utilisateur&lt;br /&gt;
$user-&amp;gt;id = 0;&lt;br /&gt;
&lt;br /&gt;
// Définition des propriétés de l&#039;instance product&lt;br /&gt;
$product-&amp;gt;ref                = &#039;1234&#039;&lt;br /&gt;
$product-&amp;gt;libelle            = &#039;libelle&#039;;&lt;br /&gt;
$product-&amp;gt;price              = &#039;10&#039;;&lt;br /&gt;
$product-&amp;gt;price_base_type    = &#039;HT&#039;;&lt;br /&gt;
$product-&amp;gt;tva_tx             = &#039;19.6&#039;;&lt;br /&gt;
$product-&amp;gt;type               = 0;&lt;br /&gt;
$product-&amp;gt;status             = 1;&lt;br /&gt;
$product-&amp;gt;description        = &#039;Description&#039;;&lt;br /&gt;
$product-&amp;gt;note               = &#039;Note&#039;;&lt;br /&gt;
$product-&amp;gt;weight             = 10; &lt;br /&gt;
$product-&amp;gt;weight_units       = 0; &lt;br /&gt;
&lt;br /&gt;
// Création du produit en base&lt;br /&gt;
$idproduct = $product-&amp;gt;create($user);&lt;br /&gt;
&lt;br /&gt;
// Gestion erreur&lt;br /&gt;
if ($idproduct &amp;lt; 0) dolibarr_print_error($db,$product-&amp;gt;error);&lt;br /&gt;
else print &amp;quot;Produit $idproduct cree.\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_de_scripts&amp;diff=8355</id>
		<title>Développement de scripts</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=D%C3%A9veloppement_de_scripts&amp;diff=8355"/>
		<updated>2009-02-04T13:05:58Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Localisation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Localisation ==&lt;br /&gt;
Les scripts en ligne de commande de Dolibarr doivent être situés dans le répertoire &#039;&#039;&#039;scripts&#039;&#039;&#039; de Dolibarr. Les scripts sont ensuite répartis dans des sous-répertoires en fonction de leur vocation.&lt;br /&gt;
Un certain nombre de scripts est donc fourni en standard.&lt;br /&gt;
&lt;br /&gt;
== Développer un nouveau script ==&lt;br /&gt;
Les scripts étant souvent réalisés pour un besoin spécifiques, il y a de forte chance que vous ne trouviez pas celui qui vous intéresse. Dans ce cas, nous allons vous expliquer comment développer votre propre script.&lt;br /&gt;
&lt;br /&gt;
=== Etape 1 - Création du squelette du script ===&lt;br /&gt;
La première étape est de reprendre le squelette de script disponible en &#039;&#039;&#039;dev/skeletons/skeleton_scripts.php&#039;&#039;&#039; et de recopier en le renommant, ce script dans le répertoire &#039;&#039;&#039;scripts/monrep/monscript.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Une fois le script renommé, donnez lui les droits en exécution par la commande:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd scripts/monrep;&lt;br /&gt;
chmod a+rx monscript.php&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Ensuite, lancez le pour voir si vous pouvez exécuter un script en mode ligne de commande. Pour cela, taper:&lt;br /&gt;
&amp;lt;pre&amp;gt;php-cli ./monscript.php&lt;br /&gt;
ou&lt;br /&gt;
php ./monscript.php&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous devriez obtenir le resultat suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Usage: monscript.php param1 param2 ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Etape 2 - Edition du code du script ===&lt;br /&gt;
Modifier le contenu du script pour réaliser les opérations qui vous intéressent.&lt;br /&gt;
Tout le code qui se trouve entre les balises&lt;br /&gt;
&amp;lt;pre&amp;gt;// ---------- START OF YOUR CODE HERE&amp;lt;/pre&amp;gt;&lt;br /&gt;
et&lt;br /&gt;
&amp;lt;pre&amp;gt;// ---------- END OY YOUR CODE&amp;lt;/pre&amp;gt;&lt;br /&gt;
est fourni à titre d&#039;exemple.&lt;br /&gt;
Vous pouvez le supprimer et y mettre le code qui vous intéresse.&lt;br /&gt;
Notez que dans cette portion, vous pouvez utiliser la variable $db qui est la ressource d&#039;accès à la base Dolibarr et qui est déjà initialisée.&lt;br /&gt;
L&#039;objet $conf qui contient la configuration Dolibarr est également disponible.&lt;br /&gt;
&lt;br /&gt;
==== Exemple insertion d&#039;un produit ====&lt;br /&gt;
Par exemple pour insérer un produit dans la base dolibarr, vous pouvez y placer le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Inclusion classe métier utilisateur et product&lt;br /&gt;
require_once(DOL_DOCUMENT_ROOT.&amp;quot;/user.class.php&amp;quot;);&lt;br /&gt;
require_once(DOL_DOCUMENT_ROOT.&amp;quot;/product.class.php&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
// Création d&#039;une instance utilisateur&lt;br /&gt;
$user=new User($db);&lt;br /&gt;
&lt;br /&gt;
// Création d&#039;une instance de product&lt;br /&gt;
$myproduct=new Product($db);&lt;br /&gt;
&lt;br /&gt;
// Définition des propriétés de l&#039;instance utilisateur&lt;br /&gt;
$user-&amp;gt;id = 0;&lt;br /&gt;
&lt;br /&gt;
// Définition des propriétés de l&#039;instance product&lt;br /&gt;
$product-&amp;gt;ref                = &#039;1234&#039;&lt;br /&gt;
$product-&amp;gt;libelle            = &#039;libelle&#039;;&lt;br /&gt;
$product-&amp;gt;price              = &#039;10&#039;;&lt;br /&gt;
$product-&amp;gt;price_base_type    = &#039;HT&#039;;&lt;br /&gt;
$product-&amp;gt;tva_tx             = &#039;19.6&#039;;&lt;br /&gt;
$product-&amp;gt;type               = 0;&lt;br /&gt;
$product-&amp;gt;status             = 1;&lt;br /&gt;
$product-&amp;gt;description        = &#039;Description&#039;;&lt;br /&gt;
$product-&amp;gt;note               = &#039;Note&#039;;&lt;br /&gt;
$product-&amp;gt;weight             = 10; &lt;br /&gt;
$product-&amp;gt;weight_units       = 0; &lt;br /&gt;
&lt;br /&gt;
// Création du produit en base&lt;br /&gt;
$idproduct = $product-&amp;gt;create($user);&lt;br /&gt;
&lt;br /&gt;
// Gestion erreur&lt;br /&gt;
if ($idproduct &amp;lt; 0) dolibarr_print_error($db,$product-&amp;gt;error);&lt;br /&gt;
else print &amp;quot;Produit $idproduct cree.\n&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=8354</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=8354"/>
		<updated>2009-02-04T13:05:12Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Import des tiers et contacts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Voici quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
== Utiliser le module Import de Dolibarr ==&lt;br /&gt;
Ce module n&#039;est pas encore disponible.&lt;br /&gt;
Il est en cours de développement.&lt;br /&gt;
&lt;br /&gt;
En attendant, vous devez développer vos propres scripts d&#039;import comme décrit dans le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
== Développer son propre script d&#039;import ==&lt;br /&gt;
&lt;br /&gt;
=== Import des tiers et contacts ===&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujetes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs importants sont bien renseignés:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
=== Import des factures ===&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mise en pratique ===&lt;br /&gt;
&lt;br /&gt;
La page [[Developpement script]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
Des exemples sont fournis sur des cas de chargement de données.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=8353</id>
		<title>Imports de masse - Migrer mes données dans Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Imports_de_masse_-_Migrer_mes_donn%C3%A9es_dans_Dolibarr&amp;diff=8353"/>
		<updated>2009-02-04T13:01:24Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Utiliser le module Import de Dolibarr */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
Suite à une installation neuve de Dolibarr, les bases sont vides. Parfois on désire démarrer avec des données importées d&#039;un autre système.&lt;br /&gt;
Voici quelques informations pour vous y aider.&lt;br /&gt;
&lt;br /&gt;
== Utiliser le module Import de Dolibarr ==&lt;br /&gt;
Ce module n&#039;est pas encore disponible.&lt;br /&gt;
Il est en cours de développement.&lt;br /&gt;
&lt;br /&gt;
En attendant, vous devez développer vos propres scripts d&#039;import comme décrit dans le chapitre suivant.&lt;br /&gt;
&lt;br /&gt;
== Développer son propre script d&#039;import ==&lt;br /&gt;
&lt;br /&gt;
=== Import des tiers et contacts ===&lt;br /&gt;
Il faut distinguer les tiers des contacts physiques.&lt;br /&gt;
Dans les tiers on aura toutes les entités sujetes à facturation (aussi bien entreprises, association que particuliers). Les tiers sont obligatoires.&lt;br /&gt;
Les contacts physiques sont optionels. Il s&#039;agit juste d&#039;un annuaire de personnes (avec téléphone et fonction) liées à un tiers. Dans le cas d&#039;un tiers entreprise, il pourra y avoir plusieurs contacts physiques. Dans le cas d&#039;un particulier, le contact physique sera unique et identique au tiers (voire le contact physique ne sera pas renseigné).&lt;br /&gt;
&lt;br /&gt;
L&#039;import des tiers consiste à insérer des lignes dans la table [[Table llx_societe]].&lt;br /&gt;
S&#039;assurer que les champs important sont bien renseigné:&lt;br /&gt;
* Nom: Doit contenir le nom de la société&lt;br /&gt;
* Client: Doit contenir 1 si client, 2 si prospect, 0 sinon&lt;br /&gt;
* Fournisseur: Doit contenir 1 si fournisseur, 0 sinon&lt;br /&gt;
&lt;br /&gt;
L&#039;import des contacts physiques consiste à insérer des lignes dans la table [[Table llx_socpeople]].&lt;br /&gt;
S&#039;assurer que les champs important sont bien renseigné:&lt;br /&gt;
* Name: Doit contenir le nom de la personne&lt;br /&gt;
* Firstname: Doit contenir le prénom de la société&lt;br /&gt;
* fk_soc: Doit contenir l&#039;id de la ligne Tiers dans la [[Table llx_societe]].&lt;br /&gt;
&lt;br /&gt;
=== Import des factures ===&lt;br /&gt;
A compléter&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Mise en pratique ===&lt;br /&gt;
&lt;br /&gt;
La page [[Developpement script]] vous explique comment créer votre propre script de traitement Dolibarr.&lt;br /&gt;
Des exemples sont fournis sur des cas de chargement de données.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Installation_-_Mise_%C3%A0_jour&amp;diff=8352</id>
		<title>Installation - Mise à jour</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Installation_-_Mise_%C3%A0_jour&amp;diff=8352"/>
		<updated>2009-02-04T12:59:14Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Procédure d&amp;#039;installation manuelle */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Les procédures suivantes décrivent comment installer ou mettre à jour Dolibarr sur une plateforme Linux, sans package particulier.&lt;br /&gt;
&lt;br /&gt;
Si vous chercher un mode opératoire pour Windows, celui-ci peut être adapté. Toutefois, il existe aussi une distribution Dolibarr nommée &#039;&#039;&#039;DoliWamp&#039;&#039;&#039; qui permet de faire une installation Dolibarr sous Windows avec tous les prérequis (Apache, Mysql, PHP) sans connaissance informatique (Voir la page de [http://www.nltechno.com/pages/dolibarrwinbin.php téléchargement de DoliWamp chez NLTechno]).&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Linux et avez déjà un serveur Apache, Mysql et PHP d&#039;opérationnel, les chapitres suivants vous présentent comment installer et mettre à jour une version de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Procédure d&#039;installation manuelle ==&lt;br /&gt;
&lt;br /&gt;
Prérequis: Apache, Mysql et PHP sont présent et opérationnel.&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit l&#039;installation manuelle (recommandée) sur un système GNU/Linux (Debian, Mandriva, ...), elle est valable avec d&#039;autres systèmes moyennant quelques modifications.&lt;br /&gt;
Elle est applicable pour toute version de Dolibarr &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
* Vérifiez que vous avez bien Apache, Mysql et PHP d&#039;installés (consulter pour cela la liste des packages installés sur votre machine grâce au gestionnaire de mise à jour de package de votre distribution).&lt;br /&gt;
&lt;br /&gt;
* Placez-vous dans le répertoire dans lequel installer Dolibarr (le répertoire racine défini pour votre serveur web)&lt;br /&gt;
 $ cd /var/www&lt;br /&gt;
# Pour Debian et les familles Ubuntu, il s&#039;agit en général de: /var/www&lt;br /&gt;
# Pour Mandriva: /var/www/html&lt;br /&gt;
# Pour RedHat: à compléter&lt;br /&gt;
# Pour Suse: à compléter&lt;br /&gt;
&lt;br /&gt;
* Récupérez l&#039;archive de l&#039;application&lt;br /&gt;
 $ wget http://www.dolibarr.org/files/dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Décompressez l&#039;archive&lt;br /&gt;
 $ tar xvfz dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Renommez le répertoire dolibarr-x.y.z en dolibarr afin d&#039;avoir un nom de répertoire indépendant de la version (où x.y.z correspond à la version source)&lt;br /&gt;
 $ mv dolibarr-x.y.z dolibarr&lt;br /&gt;
&lt;br /&gt;
* En tant que root, créez, dans le répertoire dolibarr/htdocs/conf, un fichier de configuration vide, et attribuez-lui comme propriétaire du fichier, l&#039;utilisateur du serveur web (exemple www-data sur debian, nobody sur une vieille RedHat, apache sur une autre version ...). Ceci est requis car le serveur web a besoin d&#039;écrire dans ce fichier lors de l&#039;installation.&lt;br /&gt;
 $ cd dolibarr ; touch htdocs/conf/conf.php ; chown www-data htdocs/conf/conf.php&lt;br /&gt;
&lt;br /&gt;
* Toujours en root, créez le répertoire qui servira aux documents générés ou stockés par Dolibarr (factures pdf, images, ...), et attribuez lui comme propriétaire, l&#039;utilisateur du serveur web (exemple www-data sur Debian, nobody sur une vieille RedHat, Apache sur une Mandriva ou une RedHat récente, ...). Le serveur web doit avoir les droits en écriture dans ce répertoire.&lt;br /&gt;
 $ mkdir documents ; chown www-data documents&lt;br /&gt;
&lt;br /&gt;
* Pointez votre navigateur sur la page principale&lt;br /&gt;
 http://127.0.0.1/dolibarr/htdocs/&lt;br /&gt;
&lt;br /&gt;
* Suivez les instructions de l&#039;installation&lt;br /&gt;
&lt;br /&gt;
* Pour des raisons de sécurité nous vous conseillons, une fois l&#039;installation terminée, de créer un fichier install.lock dans le répertoire d&#039;installation, que seul root doit avoir le droit d&#039;effacer.&lt;br /&gt;
 $ touch /var/www/dolibarr/install.lock; chmod ug-w /var/www/dolibarr;&lt;br /&gt;
&lt;br /&gt;
== Procédure de mise à jour manuelle ==&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit la mise à jour manuelle de Dolibarr (depuis une ancienne version) vers une plus récente.&lt;br /&gt;
Elle est applicable dès lors que la mise à jour se fait pour une version de Dolibarr &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
* Placez-vous dans le répertoire dans lequel a été installé Dolibarr (le répertoire racine de votre serveur web, par exemple /var/www sous Debian)&lt;br /&gt;
 $ cd /var/www&lt;br /&gt;
&lt;br /&gt;
* Récupérez l&#039;archive de la nouvelle version&lt;br /&gt;
 $ wget http://www.nltechno.com/files/dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Décompressez l&#039;archive&lt;br /&gt;
 $ tar xvfz dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Recopiez les nouveaux fichiers (qui ont été décompressés dans le répertoire dolibarr-x.y.z) vers  le répertoire où vous avez votre ancienne version de Dolibarr&lt;br /&gt;
 $ cp -r dolibarr-x.y.z/* dolibarr&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez alors supprimer le répertoire des fichiers sources&lt;br /&gt;
 $ rm -fr dolibarr-x.y.z&lt;br /&gt;
&lt;br /&gt;
* Pointez votre navigateur sur la page d&#039;install&lt;br /&gt;
 http://127.0.0.1/dolibarr/install/&lt;br /&gt;
&lt;br /&gt;
* Choisissez &#039;&#039;Mise à jour&#039;&#039; dans le menu proposé&lt;br /&gt;
&lt;br /&gt;
* Pour des raisons de sécurité nous vous conseillons, une fois la mise à jour terminée, de verrouiller le répertoire d&#039;installation. Dans le cas contraire, Dolibarr vous avertira d&#039;un message dans l&#039;interface une fois loggé&lt;br /&gt;
 $ echo &amp;gt; dolibarr/install.lock&lt;br /&gt;
 $ chmod 444 dolibarr/install.lock&lt;br /&gt;
&lt;br /&gt;
== Configurer une connexion LDAP ==&lt;br /&gt;
&lt;br /&gt;
A compléter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Importer des données externes ==&lt;br /&gt;
&lt;br /&gt;
Pour cette opération, consulter la page [[Imports_de_masse]].&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Installation_-_Mise_%C3%A0_jour&amp;diff=8351</id>
		<title>Installation - Mise à jour</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Installation_-_Mise_%C3%A0_jour&amp;diff=8351"/>
		<updated>2009-02-04T12:57:04Z</updated>

		<summary type="html">&lt;p&gt;Mcg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocUtil}}&lt;br /&gt;
&lt;br /&gt;
Les procédures suivantes décrivent comment installer ou mettre à jour Dolibarr sur une plateforme Linux, sans package particulier.&lt;br /&gt;
&lt;br /&gt;
Si vous chercher un mode opératoire pour Windows, celui-ci peut être adapté. Toutefois, il existe aussi une distribution Dolibarr nommée &#039;&#039;&#039;DoliWamp&#039;&#039;&#039; qui permet de faire une installation Dolibarr sous Windows avec tous les prérequis (Apache, Mysql, PHP) sans connaissance informatique (Voir la page de [http://www.nltechno.com/pages/dolibarrwinbin.php téléchargement de DoliWamp chez NLTechno]).&lt;br /&gt;
&lt;br /&gt;
Si vous êtes sous Linux et avez déjà un serveur Apache, Mysql et PHP d&#039;opérationnel, les chapitres suivants vous présentent comment installer et mettre à jour une version de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Procédure d&#039;installation manuelle ==&lt;br /&gt;
&lt;br /&gt;
Prérequis: Apache, Mysql et PHP sont présent et opérationnel.&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit l&#039;installation manuelle (recommandée) sur un système GNU/Linux (Debian, Mandriva, ...), elle est valable avec d&#039;autres systèmes moyennant quelques modifications.&lt;br /&gt;
Elle est applicable pour toute version de Dolibarr &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
* Vérifiez que vous avez bien Apache, Mysql et PHP d&#039;installés (consulter pour cela la liste des packages installés sur votre machine grâce au gestionnaire de mise à jour de package de votre distribution).&lt;br /&gt;
&lt;br /&gt;
* Placez-vous dans le répertoire dans lequel installer Dolibarr (le répertoire racine défini pour votre serveur web)&lt;br /&gt;
 $ cd /var/www&lt;br /&gt;
# Pour Debian et les familles Ubuntu, il s&#039;agit en général de: /var/www&lt;br /&gt;
# Pour Mandriva: /var/www/html&lt;br /&gt;
# Pour RedHat: à compléter&lt;br /&gt;
# Pour Suse: à compléter&lt;br /&gt;
&lt;br /&gt;
* Récupérez l&#039;archive de l&#039;application&lt;br /&gt;
 $ wget http://www.dolibarr.org/files/dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Décompressez l&#039;archive&lt;br /&gt;
 $ tar xvfz dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Renommez le répertoire dolibarr-x.y.z en dolibarr afin d&#039;avoir un nom de répertoire indépendant de la version (ou x.y.z correspond a la version source)&lt;br /&gt;
 $ mv dolibarr-x.y.z dolibarr&lt;br /&gt;
&lt;br /&gt;
* En tant que root, créez, dans le répertoire dolibarr/htdocs/conf, un fichier de configuration vide, et attribuez-lui comme propriétaire du fichier, l&#039;utilisateur du serveur web (exemple www-data sur debian, nobody sur une vieille RedHat, apache sur une autre version ...). Ceci est requis car le serveur web a besoin d&#039;écrire dans ce fichier lors de l&#039;installation.&lt;br /&gt;
 $ cd dolibarr ; touch htdocs/conf/conf.php ; chown www-data htdocs/conf/conf.php&lt;br /&gt;
&lt;br /&gt;
* Toujours en root, créez le répertoire qui servira aux documents générés ou stockés par Dolibarr (factures pdf, images, ...), et attribuez lui comme propriétaire, l&#039;utilisateur du serveur web (exemple www-data sur Debian, nobody sur une vieille RedHat, Apache sur une Mandriva ou une RedHat récente, ...). Le serveur web doit avoir les droits en écriture dans ce répertoire.&lt;br /&gt;
 $ mkdir documents ; chown www-data documents&lt;br /&gt;
&lt;br /&gt;
* Pointez votre navigateur sur la page principale&lt;br /&gt;
 http://127.0.0.1/dolibarr/htdocs/&lt;br /&gt;
&lt;br /&gt;
* Suivez les instructions de l&#039;installation&lt;br /&gt;
&lt;br /&gt;
* Pour des raisons de sécurité nous vous conseillons, une fois l&#039;installation terminée, de créer un fichier install.lock dans le répertoire d&#039;installation, que seul root doit avoir le droit d&#039;effacer.&lt;br /&gt;
 $ touch /var/www/dolibarr/install.lock; chmod ug-w /var/www/dolibarr;&lt;br /&gt;
&lt;br /&gt;
== Procédure de mise à jour manuelle ==&lt;br /&gt;
&lt;br /&gt;
Cette procédure décrit la mise à jour manuelle de Dolibarr (depuis une ancienne version) vers une plus récente.&lt;br /&gt;
Elle est applicable dès lors que la mise à jour se fait pour une version de Dolibarr &amp;gt;= 2.0.0&lt;br /&gt;
&lt;br /&gt;
* Placez-vous dans le répertoire dans lequel a été installé Dolibarr (le répertoire racine de votre serveur web, par exemple /var/www sous Debian)&lt;br /&gt;
 $ cd /var/www&lt;br /&gt;
&lt;br /&gt;
* Récupérez l&#039;archive de la nouvelle version&lt;br /&gt;
 $ wget http://www.nltechno.com/files/dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Décompressez l&#039;archive&lt;br /&gt;
 $ tar xvfz dolibarr.tgz&lt;br /&gt;
&lt;br /&gt;
* Recopiez les nouveaux fichiers (qui ont été décompressés dans le répertoire dolibarr-x.y.z) vers  le répertoire où vous avez votre ancienne version de Dolibarr&lt;br /&gt;
 $ cp -r dolibarr-x.y.z/* dolibarr&lt;br /&gt;
&lt;br /&gt;
* Vous pouvez alors supprimer le répertoire des fichiers sources&lt;br /&gt;
 $ rm -fr dolibarr-x.y.z&lt;br /&gt;
&lt;br /&gt;
* Pointez votre navigateur sur la page d&#039;install&lt;br /&gt;
 http://127.0.0.1/dolibarr/install/&lt;br /&gt;
&lt;br /&gt;
* Choisissez &#039;&#039;Mise à jour&#039;&#039; dans le menu proposé&lt;br /&gt;
&lt;br /&gt;
* Pour des raisons de sécurité nous vous conseillons, une fois la mise à jour terminée, de verrouiller le répertoire d&#039;installation. Dans le cas contraire, Dolibarr vous avertira d&#039;un message dans l&#039;interface une fois loggé&lt;br /&gt;
 $ echo &amp;gt; dolibarr/install.lock&lt;br /&gt;
 $ chmod 444 dolibarr/install.lock&lt;br /&gt;
&lt;br /&gt;
== Configurer une connexion LDAP ==&lt;br /&gt;
&lt;br /&gt;
A compléter.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Importer des données externes ==&lt;br /&gt;
&lt;br /&gt;
Pour cette opération, consulter la page [[Imports_de_masse]].&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Projet_Dolibarr&amp;diff=8350</id>
		<title>Projet Dolibarr</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Projet_Dolibarr&amp;diff=8350"/>
		<updated>2009-02-04T11:05:14Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Les acteurs et leurs rôles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Cette page les différents postes occupés dans le projet Dolibarr ainsi que les postes à pourvoir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Les acteurs et leurs rôles ==&lt;br /&gt;
&lt;br /&gt;
L&#039;équipe Dolibarr actuelle est constituée de différents responsables, soutenus voire sponsorisés par divers contributeurs physiques ou sociétés.&lt;br /&gt;
Les lignes suivantes présentent les différents rôles et postes occupés dans la gestion du projet Dolibarr.&lt;br /&gt;
De nombreux rôles et postes sont à pourvoir. Les volontaires pour postuler à une responsabilité dans le projet sont invités à se manifester sur la mailing list dev de Dolibarr.&lt;br /&gt;
Pour juste aider au développement, voir la page [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur - Comment devenir développeur officiel]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les rôles développeurs ===&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Développeur grade [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Yoda]] (Chefs de projet commiteurs CVS, tous modules) ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Gérer le projet Dolibarr au sens large.&lt;br /&gt;
&lt;br /&gt;
Ont ce rôle actuellement (par ordre alphabétique):&lt;br /&gt;
* [[Laurent Destailleur]] ([http://www.nltechno.com NLTechno]) - Contributeur / Mainteneur officiel&lt;br /&gt;
* [[Régis Houssin]] - Contributeur&lt;br /&gt;
* [[Rodolphe Quiédeville]] - Créateur / ex-Mainteneur (2002 à juin 2008)&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Non&lt;br /&gt;
&lt;br /&gt;
==== Développeur grade [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Jedi]] module X (Chefs de projet commiteurs CVS, module X) ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Externaliser le développement de nouveaux modules en dehors des équipes qui forment le noyau dur des développements Dolibarr.&lt;br /&gt;
&lt;br /&gt;
A ce rôle actuellement pour module OSCommerce: &lt;br /&gt;
* [[Jean Heimburger]] ([http://www.tiaris.fr Tiaris])&lt;br /&gt;
Fonction à pourvoir pour module X: Oui pour les modules n&#039;existant pas et à créer (1 responsable par module). Se manifester pour endosser ce rôle avec une idée de nouveau module.&lt;br /&gt;
&lt;br /&gt;
==== Développeur grade [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Amiral]] (Commiteurs CVS, patch correctifs) ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Développer, intégrer ou simplement valider et commiter dans le CVS, les &#039;&#039;&#039;patchs correctifs&#039;&#039;&#039;.&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 la qualité des patch qui ont été envoyée est satisfaisante, qu&#039;un Maitre Yoda en place vous offrira un accès CVS direct. Vous êtes devenu un Amiral 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 Jedi ou Maitre Yoda qui estime que vous avez soumis suffisamment de patch pour être un sérieux Amiral. L&#039;accès CVS d&#039;un Amiral 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 soit personnelles ou issues d&#039;un patch soumis par un Chasseur). 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 une traduction échappe à cette contrainte (pas de restrictions pour les traductions). Le non respect de cette contrainte, peut provoquer une rétrogradation au rang de Chasseur. 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 développeurs (Chasseurs) très important (grâce au système de patch). &lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Oui (Ce rôle ne s&#039;obtient pas toutefois simplement en postulant, Voir [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Comment_devenir_développeur_officiel]] pour le circuit à suivre)&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement ou récemment (comptes validés dans savannah, par ordre alphabétique) :&lt;br /&gt;
* [[Marc Barilley]] (marc_ocebo)&lt;br /&gt;
* [[Jean-Louis Bergamo]] (jbergamo) - Désengagé. &lt;br /&gt;
* [[Raphaël Bertrand]] (raphael_bertrand)&lt;br /&gt;
* [[Guillaume Carta]] (bouda)&lt;br /&gt;
* [[André Cianfarini]] (andre)&lt;br /&gt;
* [[Christophe Combelles]] (ccomb)&lt;br /&gt;
* [[Cyrille de Lambert]] (cdelambert) - Auguria (http://www.auguria.net)&lt;br /&gt;
* [[Loic Le Bleis]] (activedev)&lt;br /&gt;
* [[Gaëtan Frenoy]] (gfrenoy)&lt;br /&gt;
* [[Julien Jehl]] (jjehl)&lt;br /&gt;
* [[Juanjo Menent]] (simnandez)&lt;br /&gt;
* [[Benoit Mortier]] - Désengagé.&lt;br /&gt;
* [[Marc Henry Parmiseux]] (marconi)&lt;br /&gt;
* [[Paul Pulain]] (tipaul)&lt;br /&gt;
* [[Patrick Raguin]] (patrickrgn)&lt;br /&gt;
* [[Eric Seigne]] (erics)&lt;br /&gt;
* [[Simon Tosser]] (simontosser)&lt;br /&gt;
* [[Yannick Warnier]] (ywarnier)&lt;br /&gt;
+ Les développeurs de grade supérieurs.&lt;br /&gt;
&lt;br /&gt;
==== Développeur grade [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Chasseur]] (Soumission fichier patch) ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Intégrer et commiter dans le CVS, les patchs correctifs de bogues.&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Oui (sans limite. Patch à soumettre sur la Mailing-List dev Dolibarr)&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement:&lt;br /&gt;
* Nombre trop variable pour être recensé.&lt;br /&gt;
&lt;br /&gt;
==== Développeur grade [[FAQ_Développeur#Comment_devenir_d.C3.A9veloppeur_officiel|Membre alliance]] (Utilisateur n&#039;ayant jamais soumis de correctifs) ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Soumettre son premier patch pour passer au grade chasseur.&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Oui (sans limite. Patch à soumettre sur la Mailing-List dev Dolibarr)&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement:&lt;br /&gt;
* Impossible à déterminer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Les autres rôles dans le projet Dolibarr (Rôle A à J) ===&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
==== Role A: Hébergement site web (dolibarr.fr et dolibarr.org) ==== &lt;br /&gt;
&lt;br /&gt;
Objectif: Fournir et maintenir une plateforme d&#039;hébergement du site Dolibarr basée sur Joomla.&lt;br /&gt;
&lt;br /&gt;
A ce rôle actuellement:&lt;br /&gt;
* [[Régis Houssin]]&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Non&lt;br /&gt;
&lt;br /&gt;
==== Role B: Hébergement site démo (http://demo.dolibarr.org) ==== &lt;br /&gt;
&lt;br /&gt;
Objectif: Fournir et maintenir une plateforme d&#039;hébergement du site de démo online Dolibarr.&lt;br /&gt;
&lt;br /&gt;
A ce rôle actuellement:&lt;br /&gt;
* [[Laurent Destailleur]] ([http://www.nltechno.com NLTechno])&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Non&lt;br /&gt;
&lt;br /&gt;
==== Role C: Hébergement wiki (wiki.dolibarr.org) ==== &lt;br /&gt;
&lt;br /&gt;
Objectif: Fournir et maintenir une plateforme d&#039;hébergement du wiki Dolibarr&lt;br /&gt;
&lt;br /&gt;
A ce rôle actuellement: &lt;br /&gt;
* [[Laurent Destailleur]] ([http://www.nltechno.com NLTechno])&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Non&lt;br /&gt;
&lt;br /&gt;
==== Role D: Responsable distribution DoliWamp (Installeur Dolibarr pour Windows) ====&lt;br /&gt;
&lt;br /&gt;
A ce rôle actuellement: &lt;br /&gt;
* [[Laurent Destailleur]] ([http://www.nltechno.com NLTechno])&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Non&lt;br /&gt;
&lt;br /&gt;
==== Role E: Outils de création de modules par MDA (UML2Dolibarr) ====&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement ou récemment:&lt;br /&gt;
* [[Patrick Raguin]] (Société [http://www.auguria.net/ Auguria])&lt;br /&gt;
* [[Samuel Bouchet]] (Société [http://www.auguria.net/ Auguria])&lt;br /&gt;
&lt;br /&gt;
Fonction à pourvoir: Voir société Auguria si reprise envisagée de l&#039;outil.&lt;br /&gt;
&lt;br /&gt;
==== Role F: Gestion de l&#039;association Dolibarr ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Créer et gérer une association de promotion et d&#039;utilisateurs Dolibarr&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement: &lt;br /&gt;
* [[Cyrille De Lambert]] (Société [http://www.auguria.net/ Auguria])&lt;br /&gt;
* A pourvoir (1 président, 1 trésorier, 1 secrétaire).&lt;br /&gt;
&lt;br /&gt;
Articles en relation: [[AssociationDolibarr]]&lt;br /&gt;
&lt;br /&gt;
==== Role G: Animation du site Web Dolibarr ==== &lt;br /&gt;
&lt;br /&gt;
Objectif: Saisie régulièrement des news et articles en anglais et français sur le site Web Dolibarr&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement: &lt;br /&gt;
* Fonction à pourvoir. Merci aux amateurs de se manifester sur la ML Dolibarr. Volontaires fortement désirés.&lt;br /&gt;
&lt;br /&gt;
==== Role H: Promoteur/Communication pour Dolibarr ====&lt;br /&gt;
&lt;br /&gt;
Objectif: &lt;br /&gt;
* Faire de la &#039;&#039;&#039;communication/évangélisation&#039;&#039;&#039; pour Dolibarr, sur les forums, sites de news, presse, etc...&lt;br /&gt;
* Mettre à jour la page wiki &#039;&#039;&#039;Revues de presse&#039;&#039;&#039; ([[Presse papier]] et [[Presse en ligne]]). &lt;br /&gt;
* Saisir des articles sur le site Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement:&lt;br /&gt;
* [[Cyrille de Lambert]] (cdelambert) - Auguria (http://www.auguria.net)&lt;br /&gt;
* Fonction à pourvoir. Merci aux amateurs de se manifester sur la ML Dolibarr. Volontaires fortement désirés.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Articles en relation: Quelques exemples de [[modèles de messages]] utilisés pour annoncer les beta ou release.&lt;br /&gt;
&lt;br /&gt;
==== Role I: Traducteur langue X ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Traduire Dolibarr dans d&#039;autres langues. Consolider les traductions existantes.&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement: &lt;br /&gt;
* Fonction à pourvoir. Pas de limite dans le nombre.&lt;br /&gt;
1 responsable par langue serait suffisant, mais plus serait mieux.&lt;br /&gt;
* Français: [[Laurent Destailleur]] (eldy)&lt;br /&gt;
* Anglais: [[Laurent Destailleur]] (eldy)&lt;br /&gt;
* Espagnol: [[Juanjo Menent]] (simnandez)&lt;br /&gt;
* Portugais:&lt;br /&gt;
* Italien:&lt;br /&gt;
* Allemand:&lt;br /&gt;
* Hollandais:&lt;br /&gt;
* Allemand:&lt;br /&gt;
* Finlandais:&lt;br /&gt;
* Roumain:&lt;br /&gt;
* Russe:&lt;br /&gt;
* Danois:&lt;br /&gt;
* Norvégien:&lt;br /&gt;
* Polonais:&lt;br /&gt;
&lt;br /&gt;
Articles en relation: [[Documentation traducteur]]&lt;br /&gt;
&lt;br /&gt;
==== Role J: Testeur Dolibarr ====&lt;br /&gt;
&lt;br /&gt;
Objectif: Tester la version courante de Dolibarr (CVS) et reporter sur la mailing-list le maximum de bugs.&lt;br /&gt;
&lt;br /&gt;
Identifiés comme ayant ce rôle actuellement: &lt;br /&gt;
* Une cinquantaines de personnes régulières environ (chiffre obtenu par analyse des messages du forum), beaucoup plus si on intègre les rapporteurs occasionnels.&lt;br /&gt;
&lt;br /&gt;
== Les accès CVS ==&lt;br /&gt;
&lt;br /&gt;
Le serveur CVS est hébergé chez savannah.&lt;br /&gt;
* Les instructions d&#039;accès au CVS en lecture pour récupérer la version courante de développement sont sur [https://savannah.nongnu.org/cvs/?group=dolibarr cette page]&lt;br /&gt;
* En ce qui concerne, les requêtes pour obtenir un accès en écriture, lire la [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel]]) pour connaître l&#039;organisation du projet et les étapes à franchir avant d&#039;atteindre ce but.&lt;br /&gt;
&lt;br /&gt;
Un suivi graphique des commits CVS de la branche principale de développement est également disponible sur la page [http://www.nltechno.com/stats/dolibarr/cvschangelogbuilder_dolibarr.html suivante].&lt;br /&gt;
&lt;br /&gt;
== Les Mailing-lists ==&lt;br /&gt;
&lt;br /&gt;
Le serveur de mailing-list est hébergé chez savannah.&lt;br /&gt;
Les instructions d&#039;accès au CVS sont sur [https://savannah.nongnu.org/mail/?group=dolibarr cette page]&lt;br /&gt;
&lt;br /&gt;
Lire la [[FAQ Développeur]] pour plus d&#039;informations.&lt;br /&gt;
&lt;br /&gt;
== Actions dans les cartons ==&lt;br /&gt;
* Mettre en place backup croisé joomla / demo-wiki (a faire)&lt;br /&gt;
* Appel a développeur (a faire)&lt;br /&gt;
* Création association (en cours, voir [[AssociationDolibarr]])&lt;br /&gt;
* Intégration module caisse (en cours)&lt;br /&gt;
* Développer les taches en priorité High pour releaser la 2.6&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Fichier_de_configuration&amp;diff=8343</id>
		<title>Fichier de configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Fichier_de_configuration&amp;diff=8343"/>
		<updated>2009-02-03T19:21:31Z</updated>

		<summary type="html">&lt;p&gt;Mcg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Le fichier de configuration de Dolibarr est &#039;&#039;&#039;conf/conf.php&#039;&#039;&#039;. Il est écrit par la procédure d&#039;installation automatisée.&lt;br /&gt;
Le contenu du fichier standard est :&lt;br /&gt;
&lt;br /&gt;
     $dolibarr_main_document_root=&amp;quot;/home/www/dolibarr/htdocs&amp;quot;;&lt;br /&gt;
     $dolibarr_main_url_root=&amp;quot;http://mondomaine.com/dolibarr&amp;quot;;&lt;br /&gt;
     $dolibarr_main_db_type=&amp;quot;mysql&amp;quot;;&lt;br /&gt;
     $dolibarr_main_db_host=&amp;quot;localhost&amp;quot;;&lt;br /&gt;
     $dolibarr_main_db_name=&amp;quot;dolibarr&amp;quot;;&lt;br /&gt;
     $dolibarr_main_db_user=&amp;quot;dolibarr&amp;quot;;&lt;br /&gt;
     $dolibarr_main_db_pass=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
Dolibarr fournit un fichier conf modèle nommé conf/conf.php.example où chaque paramètre est commenté.&lt;br /&gt;
&lt;br /&gt;
Ce fichier ne doit pas jamais être ni modifié, ni lu directement, par aucune fonctionnalité de Dolibarr.&lt;br /&gt;
&lt;br /&gt;
Il est créé par la procédure d&#039;installation ou de mise a jour de Dolibarr (install/index.php) qui est la seule habilitée à effectuer des actions sur ce fichier.&lt;br /&gt;
&lt;br /&gt;
Le contenu de ce fichier est accessible au développement à travers de constantes ou de l&#039;objet &#039;&#039;&#039;$conf&#039;&#039;&#039; créé par le script &#039;&#039;&#039;master.inc.php&#039;&#039;&#039; qui est appelé par tout programme PHP (scripts ou pages).&lt;br /&gt;
&lt;br /&gt;
Ainsi:&lt;br /&gt;
# $dolibarr_main_document_root est connu dans le code grâce à la constante: DOL_DOCUMENT_ROOT&lt;br /&gt;
# $dolibarr_main_url_root est connu dans le code grâce à la constante: DOL_URL_ROOT&lt;br /&gt;
# $dolibarr_main_db_type est accessible par $conf-&amp;gt;db-&amp;gt;type&lt;br /&gt;
# $dolibarr_main_db_host est accessible par $conf-&amp;gt;db-&amp;gt;host&lt;br /&gt;
# $dolibarr_main_db_name est accessible par $conf-&amp;gt;db-&amp;gt;name&lt;br /&gt;
# $dolibarr_main_db_user est accessible par $conf-&amp;gt;db-&amp;gt;login&lt;br /&gt;
# $dolibarr_main_db_pass n&#039;est pas accessible. Il est lu par le script &#039;&#039;&#039;master.inc.php&#039;&#039;&#039; (appelé par tout fichier PHP) qui crée un connexion db puis efface de sa mémoire le mot de passe.&lt;br /&gt;
&lt;br /&gt;
Normalement, vos développements ne devraient avoir besoin que des constantes DOL_DOCUMENT_ROOT (qui indique le chemin physique du répertoire de stockage de fichiers temporaires ou à conserver) et DOL_URL_ROOT (qui indique le chemin URL vers le répertoire racine de Dolibarr).&lt;br /&gt;
D&#039;autres informations et objets sont disponibles après insertion de l&#039;include de &#039;&#039;&#039;master.inc.php&#039;&#039;&#039; dans son code. Voir les tutoriaux sur le développements de modules Dolibarr pour plus d&#039;information.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8342</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8342"/>
		<updated>2009-02-03T19:16:37Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Communication Logique métier - Données (ORM): */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se créent à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de données.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autres.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8341</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8341"/>
		<updated>2009-02-03T19:15:16Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Motifs d&amp;#039;organisation du code: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se créent à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de données.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8340</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8340"/>
		<updated>2009-02-03T19:14:03Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Répertoires de travail */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se créent à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créé dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8339</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8339"/>
		<updated>2009-02-03T19:13:19Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Création de tables */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se créent à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8338</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8338"/>
		<updated>2009-02-03T19:12:54Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Les nombres réels, montants et calculs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemples qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se crée à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8337</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8337"/>
		<updated>2009-02-03T19:11:08Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Les dates et TimeZone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de données contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthodes insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment où la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemple qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyés par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se crée à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8336</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8336"/>
		<updated>2009-02-03T19:08:58Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Normes HTML */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quotés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de donnée contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthode insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment ou la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemple qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyés par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se crée à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8335</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8335"/>
		<updated>2009-02-03T19:07:06Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Normes SQL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de problème. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non du moteur de base de données. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quottés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent etre absolu et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionner par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de donnée contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthode insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment ou la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemple qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyés par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se crée à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8334</id>
		<title>Langages et normes</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Langages_et_normes&amp;diff=8334"/>
		<updated>2009-02-03T19:03:57Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Normes PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Versions ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner sur:&lt;br /&gt;
# Tous OS (Windows, Linux, MACOS...)&lt;br /&gt;
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d&#039;accès base de donnée).&lt;br /&gt;
# Mysql 3.1 ou +&lt;br /&gt;
&lt;br /&gt;
== Normes PHP ==&lt;br /&gt;
&lt;br /&gt;
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l&#039;extension .php&lt;br /&gt;
&lt;br /&gt;
* L&#039;appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_GET, $_POST, $_COOKIES, $_SERVER, $_ENV.&lt;br /&gt;
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l&#039;option &#039;&#039;&#039;register_long_arrays&#039;&#039;&#039; est à off.&lt;br /&gt;
De plus, le code doit fonctionner quand l&#039;option PHP &#039;&#039;&#039;register_globals&#039;&#039;&#039; est à off (recommandé par PHP) aussi bien que quand l&#039;option &#039;&#039;&#039;register_globals&#039;&#039;&#039; à on (par défaut sur de nombreuses installations).&lt;br /&gt;
&lt;br /&gt;
* Les smart tags PHP ne sont pas utilisés. Les sections de code doivent commencer par &#039;&#039;&#039;&amp;lt;?php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Pas d&#039;utilisation de la variable &#039;&#039;&#039;PHP_SELF&#039;&#039;&#039;. Utiliser a la place $_SERVER[&amp;quot;PHP_SELF&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=1;$var2=1;$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
plutôt que&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$var1=$var2=$var3=1;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
qui est moins performant.&lt;br /&gt;
&lt;br /&gt;
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;Mon texte affiche ma &#039;.$variable.&#039; !&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d&#039;une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Bloc de commentaire&lt;br /&gt;
 *&lt;br /&gt;
 * Fin du bloc&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$monobjet = new MonObjet($db);&lt;br /&gt;
$result=$monobjet-&amp;gt;fetch($idobject);&lt;br /&gt;
&lt;br /&gt;
for ($i = 1 , $i &amp;lt; 2 ; $i++)&lt;br /&gt;
{&lt;br /&gt;
  // commentaire sur une ligne&lt;br /&gt;
  print $i;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.&lt;br /&gt;
&lt;br /&gt;
Les fonctions doivent retourner 0 en cas de succès, et un nombre &amp;lt;0 en cas d&#039;erreur.&lt;br /&gt;
A ce jour, très peu de fonctions respectent ce standard mais c&#039;est celui vers lequel il faut tendre.&lt;br /&gt;
&lt;br /&gt;
== Normes SQL ==&lt;br /&gt;
&lt;br /&gt;
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d&#039;éviter les confusions. Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = &#039;$id&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Dans les requètes SQL, on quote les champs mais pas les numériques qui contiennent des montantsdestinés a etre stokés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d&#039;une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l&#039;impression qu&#039;il n&#039;y a pas de probleme. Et c&#039;est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.&lt;br /&gt;
&lt;br /&gt;
Exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bon:     INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, 412.62)&lt;br /&gt;
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES (&#039;txt&#039;, &#039;412.62&#039;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remarque, le pb des float est general et pas seulement sur les acces base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:&lt;br /&gt;
&#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin. (voir doc fonction)&lt;br /&gt;
&lt;br /&gt;
* Dolibarr doit fonctionner même avec l&#039;option &#039;&#039;&#039;strict&#039;&#039;&#039; de Mysql active.&lt;br /&gt;
&lt;br /&gt;
* Les fonctions NOW ou SYSDATE sont interdites au sein des ordres SQL. S&#039;il faut saisir la date du moment dans un champ, la valeur doit venir du PHP et non de moteur de base de donnée. Ceci afin d&#039;avoir une meilleure portabilité du code mais surtout d&#039;avoir une gestion correcte des TimeZone.&lt;br /&gt;
&lt;br /&gt;
== Normes HTML ==&lt;br /&gt;
&lt;br /&gt;
* Tous les attributs dans les balises HTML doivent être *en minuscule* et quottés avec des *doubles quote* (Norme xhtml)&lt;br /&gt;
&lt;br /&gt;
* Les liens href doivent etre absolu et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l&#039;appel de la fonction img_picto.&lt;br /&gt;
Par exemple:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &#039;&amp;lt;a href=&amp;quot;&#039;.DOL_URL_ROOT.&#039;/monrep/mapage.php&amp;quot;&amp;gt;&#039;.img_picto(&#039;Texte alt&#039;,&#039;nompictopng&#039;,&#039;&#039;).&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Le javascript et l&#039;appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur &amp;quot;$conf-&amp;gt;use_javascript&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if ($conf-&amp;gt;use_javascript)&lt;br /&gt;
{&lt;br /&gt;
...  // Le code php qui génère du javascript est ici&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionner par le point ci-dessus).&lt;br /&gt;
&lt;br /&gt;
* Les scripts externes sont écrits en Perl s&#039;ils ne peuvent l&#039;être en php, l&#039;utilisation d&#039;un autre langage n&#039;est pas interdit mais doit être discuté au préalable dans la mailing list des développeurs. Le langage devra être maitrisé par au moins 2 développeurs pour en assurer la maintenance.&lt;br /&gt;
&lt;br /&gt;
== Normes Dolibarr et squelettes de code ==&lt;br /&gt;
&lt;br /&gt;
=== Squelettes de code ===&lt;br /&gt;
Afin d&#039;uniformiser le code et d&#039;accélérer le développement de nouveaux composants dans Dolibarr, se trouvent dans le répertoire &#039;&#039;&#039;dev/skeletons&#039;&#039;&#039;, 4 squelettes de code tout préparés.&lt;br /&gt;
&lt;br /&gt;
* 1 qui sert d&#039;exemple de descripteur de module: &#039;&#039;&#039;myModule.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle classe: &#039;&#039;&#039;skeleton_class.class.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire une nouvelle page: &#039;&#039;&#039;skeleton_page.php&#039;&#039;&#039;&lt;br /&gt;
* 1 qui sert d&#039;exemple de code pour faire un script à exécuter en ligne de commande: &#039;&#039;&#039;skeleton_script.php&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Servez-vous en comme exemple.&lt;br /&gt;
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développement.&lt;br /&gt;
&lt;br /&gt;
=== Les dates et TimeZone ===&lt;br /&gt;
Dolibarr se veut une application mutli-utilisateur et multi-localisation. Il convient donc de stocker les dates dans le bon format. Pour éviter les problèmes de conversion, les règles suivantes doivent être appliquées:&lt;br /&gt;
* Une date en mémoire doit être au format Timestamp GMT.&lt;br /&gt;
* Une date stockée en base de donnée contient le Timestamp GMT en rapport avec la date soumise dans la requête en heure locale &amp;lt;b&amp;gt;du serveur PHP&amp;lt;/b&amp;gt;. Cela ne concerne pas les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base).&lt;br /&gt;
Ainsi le 1er janvier 1970, 2 heures à Paris (TZ=+1) sera stocké en mémoire sera soumis à la base de données avec la chaine &#039;19700101020000&#039; (PHP convertit en heure de son TZ et la base déconvertit avec son TZ qui est le même que celui de PHP).&lt;br /&gt;
&lt;br /&gt;
Les méthodes select doivent donc traduire les champs dates lus qui sont au format chaine TZ de la base (&#039;19700101020000&#039;) par appel de la méthode db-&amp;gt;jdate afin de récupérer une information en mémoire au format Timestamp GMT. Et les méthode insert doivent lors de la génération de la requête convertir la date mémoire connue en variable, par la méthode db-&amp;gt;idate (Voir exemples générés par le squelette).&lt;br /&gt;
&lt;br /&gt;
* Les dates mises à jour automatiquement par la base (champ &#039;&#039;&#039;tms&#039;&#039;&#039; en base) contiennent le Timestamp GMT au moment ou la modification est faite. Les méthodes select récupèrent directement cette donnée en mémoire au format Timestamp GMT.&lt;br /&gt;
&lt;br /&gt;
=== L&#039;encodage UTF8/ISO ===&lt;br /&gt;
Dolibarr stocke les informations de manière suivante:&lt;br /&gt;
* En base de donnée, les données sont en UTF8 ou ISO. Cela dépend du pagecode de la base, donc des options à la création de cette base. Dans tous les cas le driver d&#039;accès base Dolibarr (dans /lib/database) s&#039;arrange à la lecture et insertion pour convertir vers et depuis de l&#039;UTF8.&lt;br /&gt;
* Les données en mémoires sont donc stockées en UTF8 (instances d&#039;objets PHP).&lt;br /&gt;
* Les pages web affichées à l&#039;écran sont au format UTF8 (avec les versions &amp;lt; 2.5.1, c&#039;est le vieux paramètre $character_set du fichier conf.php qui définissait le format de sortie).&lt;br /&gt;
&lt;br /&gt;
=== Les nombres réels, montants et calculs ===&lt;br /&gt;
En PHP comme dans d&#039;autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.&lt;br /&gt;
Essayer de faire par exemple &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print 239.2 - 229.3 - 9.9;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vous n&#039;obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d&#039;autres exemple qui ne fonctionnent pas.&lt;br /&gt;
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyés par la fonction price2num avec le 2eme paramètre renseigné à: &#039;MU&#039;, &#039;MT&#039; ou &#039;MS&#039; selon le besoin (voir doc fonction).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print price2num(239.2 - 229.3 - 9.9, &#039;MT&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
S&#039;il ne s&#039;agit pas d&#039;un prix sur lequel s&#039;adapte les paramètres MU, MT ou MS, il faut utiliser la fonction &#039;&#039;&#039;round()&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Création de tables ===&lt;br /&gt;
Ne pas créer de table à l&#039;utilisation, c&#039;est-à-dire à la &#039;&#039;&#039;première utilisation&#039;&#039;&#039; du module.&lt;br /&gt;
Si vous créez un module qui utilise des tables qui ne sont pas intégrées en standard dans le code de Dolibarr, veillez à suivre le didacticiel Créer un module qui explique comment joindre des tables qui se crée à l&#039;activation du module et non à son utilisation (voir plus haut).&lt;br /&gt;
&lt;br /&gt;
=== Logs ===&lt;br /&gt;
Ajouter des traces dans votre code avec la fonction&lt;br /&gt;
dolibarr_syslog($yourmessage, LOG_INFO|LOG_DEBUG|LOG_WARNING|LOG_ERR);&lt;br /&gt;
&lt;br /&gt;
=== Répertoires de travail ===&lt;br /&gt;
Si vous avez besoin de créer un répertoire de travail, dans votre code, faites référence à ce répertoire par&lt;br /&gt;
DOL_DATA_ROOT.&#039;/monmodule&#039;.&lt;br /&gt;
Le répertoire peut être créer dans votre code à l&#039;exécution par le code suivant:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$mymoduledir=DOL_DATA_ROOT.&#039;/monmodule&#039;;&lt;br /&gt;
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si vous avez besoin d&#039;un répertoire qui contiendra des données temporaire, ce répertoire doit être DOL_DATA_ROOT.&#039;/monmodule/temp&#039;&lt;br /&gt;
&lt;br /&gt;
== Programmation Objet ==&lt;br /&gt;
&lt;br /&gt;
=== Motifs d&#039;organisation du code: ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Martin Fowler&#039;&#039;&#039; a identifié 3 méthodes d&#039;organisation du code appelées &#039;&#039;&#039;motifs&#039;&#039;&#039;:&lt;br /&gt;
* Le &#039;&#039;&#039;Transaction Script&#039;&#039;&#039; (Le code est linéraire en fonction d&#039;une action utilisateur).&lt;br /&gt;
C&#039;est le motif à l&#039;ancienne utilisé dans les langages procéduraux.&lt;br /&gt;
Inconvénient: Redondance du code. Nécessité de connaitre le modèle physique pour développer.&lt;br /&gt;
* Le &#039;&#039;&#039;Domain Model&#039;&#039;&#039;&lt;br /&gt;
C&#039;est un concept possible depuis les langages objets. Ce sont les procédures métiers (qui doivent être identifiés avant) qui servent de bases pour les classes objets.&lt;br /&gt;
Inconvénient: Motif complexe à maintenir.&lt;br /&gt;
* Le &#039;&#039;&#039;Table Module&#039;&#039;&#039;&lt;br /&gt;
Un intermédiaire entre les 2 précédents où l&#039;on a une instance unique de classe par table de la base de donnée.&lt;br /&gt;
&lt;br /&gt;
Comme le montre les squelettes de code (voir point précédent), Dolibarr se base sur le principe du &#039;&#039;&#039;Table Module&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Communication Logique métier - Données (ORM): ===&lt;br /&gt;
&lt;br /&gt;
Il existe 3 modes de liaisons:&lt;br /&gt;
* Le Table And Row Data Gateway&lt;br /&gt;
C&#039;est le plus simple. On crée une table par classe et chaque classe est un pont avec la table correspondante, voir une classe par ligne de table. Une instance de classe étant alors un enregistrement de la table. La classe ne contient que du code d&#039;accès aux lignes ou colonnes de tables.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode mis en oeuvre quand on utilise certains Frameworks d&#039;ORM comme &#039;&#039;&#039;iBatis&#039;&#039;&#039; (http://ibatis.apache.org/).&lt;br /&gt;
&lt;br /&gt;
* Le Active Record&lt;br /&gt;
Identique au précédent, mais on se permet d&#039;ajouter quelques fonctions métiers sur la classe, à conditions que ces fonctions soient propres à la table ou à l&#039;enregistrement.&lt;br /&gt;
&lt;br /&gt;
Exemple: C&#039;est le mode choisi pour les développements Dolibarr et de nombreuses autres applications PHP qui ont leur propre framework et pratiques de développements.&lt;br /&gt;
&lt;br /&gt;
* Le Data Mapper&lt;br /&gt;
Les classes représentent les entités du problème et non les données. Il faut donc doubler, tripler... ces classes avec des classes Mapper pour accéder aux données.&lt;br /&gt;
Plus &amp;quot;puriste&amp;quot; sur le papier car plus proche du métier, ce mode a aussi l&#039;inconvénient d&#039;être plus complexe sur le plan pratique.&lt;br /&gt;
Exemple: C&#039;est le choix si on utilise le Framework d&#039;ORM &#039;&#039;&#039;Propel&#039;&#039;&#039; (http://propel.phpdb.org/trac/). On le trouve donc sur des applications plus lourdes basées sur cet ORM entre autre.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour les développements Dolibarr, il est recommandé d&#039;utiliser le mode de liaison &#039;&#039;&#039;Active Record&#039;&#039;&#039; qui offre les avantages d&#039;un modèle proche du métier sans en avoir la complexité et sans trop masquer non plus la technique. C&#039;est dans ce mode que le développement, la compréhension du code et la maintenance technique et/ou fonctionnelle semble la plus productive (ceci est toutefois un éternel débat entre les puristes et les pragmatiques, débat dans lequel personne ne peut vraiment avoir raison, car tout dépend des objectifs à atteindre).&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Librairies_externes_et_d%C3%A9pendances&amp;diff=8333</id>
		<title>Librairies externes et dépendances</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Librairies_externes_et_d%C3%A9pendances&amp;diff=8333"/>
		<updated>2009-02-03T19:00:57Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Librairies PHP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Librairies embarquées dans le code source (valable pour la version 2.4) ==&lt;br /&gt;
&lt;br /&gt;
Toutes les librairies embarqués Dolibarr sont situées, soit dans le répertoire &#039;&#039;&#039;htdocs/includes&#039;&#039;&#039;:&lt;br /&gt;
* Librairies AdoDb-Date&lt;br /&gt;
* Librairies PHP-barcode&lt;br /&gt;
* Librairies Fckeditor (http://www.fckeditor.net)&lt;br /&gt;
* Librairies de génération de pdf FPDF (http://www.fpdf.org)&lt;br /&gt;
* Librairies de génération de pdf FPDI&lt;br /&gt;
* Librairies chargement RSS Magpierss&lt;br /&gt;
* Librairies Nusoap modifié pour ne pas avoir de conflit avec PHP5&lt;br /&gt;
* Librairies PHP_WriteExcel&lt;br /&gt;
* Librairies Prototype&lt;br /&gt;
* Librairies PWC&lt;br /&gt;
* Librairies Scriptaculous&lt;br /&gt;
* Librairies Treemenu&lt;br /&gt;
* Librairies VCard&lt;br /&gt;
&lt;br /&gt;
Soit dans le répertoire &#039;&#039;&#039;external-libs&#039;&#039;&#039;:&lt;br /&gt;
* Librairies Artichow pour les graphismes&lt;br /&gt;
* Librairies Smarty (non utilisé)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Toutes ces librairies embarquées doivent respecter les règles suivantes:&lt;br /&gt;
* Elles doivent être compatibles avec la licence de Dolibarr. Le fichier &#039;&#039;&#039;COPYRIGHT&#039;&#039;&#039; dans la racine de Dolibarr liste toutes les librairies embarquée avec leur licence en vigueur.&lt;br /&gt;
* Si une modification est faite sur le livrable d&#039;une librairie externe, la modification doit être notifiée dans le fichier &#039;&#039;&#039;htdocs/includes/dolibarr_changes.txt&#039;&#039;&#039;. Normalement, on ne devrait jamais toucher aux librairies externes et les utiliser tel que disponibles. Ceci afin de permettre une mise à jour sans avoir à gérer des reports de modifications.&lt;br /&gt;
&lt;br /&gt;
== Librairies Apache ==&lt;br /&gt;
Aucune librairie particulière requise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Librairies PHP ==&lt;br /&gt;
&#039;&#039;&#039;Librairie&#039;&#039;&#039;: php4-imagick (package dev-php/PECL-imagick sou Gentoo)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Statut&#039;&#039;&#039;: Optionnel&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rôle&#039;&#039;&#039;: Les onglets &amp;quot;Aperçu&amp;quot; ne sont pas opérationnels si ce module n&#039;est pas présent. Dans ce cas, il est possible de les désactiver depuis le menu Configuration - Affichage.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Outils_de_d%C3%A9veloppement&amp;diff=8332</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=8332"/>
		<updated>2009-02-03T18:59:20Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Optionnel */&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 tous ==&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;
* Firefox 3.0 avec les plugins: Tamper Data, HTMLValidator, Phplangeditor, Firebug + Firecookie.&lt;br /&gt;
A télécharger depuis le site http://www.firefox.com&lt;br /&gt;
&lt;br /&gt;
* SquirrelSql pour l&#039;administration de base&lt;br /&gt;
A télécharger depuis le site http://squirrelsql.sf.net&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;Eclipse 3.2 ou 3.3&lt;br /&gt;
A télécharger depuis le site http://www.eclipse.org&lt;br /&gt;
&lt;br /&gt;
* Installation du plugin Eclipse pour PHP: PDT.&lt;br /&gt;
Pour cela, 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;
== Optionnel ==&lt;br /&gt;
&lt;br /&gt;
=== Si vous gérez d&#039;autres projets sous SVN ===&lt;br /&gt;
* Installation du plugin pour Eclipse pour SVN: SubClipse.&lt;br /&gt;
Pour cela, utiliser la procédure Find And Install et ajouter l&#039;URL de mise à jour: http://subclipse.tigris.org/install.html&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.sf.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;
* Vérifier dans Eclipse - Help - Software update - Manage Configuration que votre Eclipse contient les composants &lt;br /&gt;
- Si Eclipse 3.2:&lt;br /&gt;
# EMF 2.2.2&lt;br /&gt;
# UML2 2.0.3&lt;br /&gt;
- Si Eclipse 3.3:&lt;br /&gt;
# EMF 2.3.0&lt;br /&gt;
# UML2 2.1.1&lt;br /&gt;
&lt;br /&gt;
Si non, les installer via la procédure &#039;&#039;&#039;Find And Install&#039;&#039;&#039; et choisir EMF et UML2 End-User.&lt;br /&gt;
&lt;br /&gt;
* Installation de TopCased 1.4&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://topcased-mm.gforge.enseeiht.fr/release/update-site3.3/&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;acceleo 2.2.1&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 désirez faire du debuggage avec XDebug ===&lt;br /&gt;
&lt;br /&gt;
* Installer xdebug (package php-xdebug sous Ubuntu)&lt;br /&gt;
&lt;br /&gt;
* Modifier le fichier php.ini (ou xdebug.ini) pour ajouter les paramètres&lt;br /&gt;
- xdebug.remote_enable=1&lt;br /&gt;
&lt;br /&gt;
- xdebug.profiler_enable=1&lt;br /&gt;
&lt;br /&gt;
- xdebug.show_local_vars=1&lt;br /&gt;
&lt;br /&gt;
=== Et si vous êtes sous Windows ===&lt;br /&gt;
&lt;br /&gt;
* WampServer 2 (pour le base Mysql, Apache et PHP tout clé en main). Ce serveur WAMP offre le trio MySql+Apache+PHP installé en clé en main, avec possibilité de basculer de version pour n&#039;importe lequel des ces composants d&#039;un simple clic). Un must !&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;
== 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;&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>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Outils_de_d%C3%A9veloppement&amp;diff=8331</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=8331"/>
		<updated>2009-02-03T18:57:55Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Pour tous */&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 tous ==&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;
* Firefox 3.0 avec les plugins: Tamper Data, HTMLValidator, Phplangeditor, Firebug + Firecookie.&lt;br /&gt;
A télécharger depuis le site http://www.firefox.com&lt;br /&gt;
&lt;br /&gt;
* SquirrelSql pour l&#039;administration de base&lt;br /&gt;
A télécharger depuis le site http://squirrelsql.sf.net&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;Eclipse 3.2 ou 3.3&lt;br /&gt;
A télécharger depuis le site http://www.eclipse.org&lt;br /&gt;
&lt;br /&gt;
* Installation du plugin Eclipse pour PHP: PDT.&lt;br /&gt;
Pour cela, 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;
== Optionnel ==&lt;br /&gt;
&lt;br /&gt;
=== Si vous gérez d&#039;autres projets sous SVN ===&lt;br /&gt;
* Installation du plugin pour Eclipse pour SVN: SubClipse.&lt;br /&gt;
Pour cela, utiliser la procédure Find And Install et ajouter l&#039;URL de mise a jour: http://subclipse.tigris.org/install.html&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 a jour: http://e-p-i-c.sf.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;
* Vérifier dans Eclipse - Help - Software update - Manage Configuration que votre Eclipse contient les composants &lt;br /&gt;
- Si Eclipse 3.2:&lt;br /&gt;
# EMF 2.2.2&lt;br /&gt;
# UML2 2.0.3&lt;br /&gt;
- Si Eclipse 3.3:&lt;br /&gt;
# EMF 2.3.0&lt;br /&gt;
# UML2 2.1.1&lt;br /&gt;
&lt;br /&gt;
Si non, les installer via la procédure &#039;&#039;&#039;Find And Install&#039;&#039;&#039; et choisir EMF et UML2 End-User.&lt;br /&gt;
&lt;br /&gt;
* Installation de TopCased 1.4&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 a jour:&lt;br /&gt;
http://topcased-mm.gforge.enseeiht.fr/release/update-site3.3/&lt;br /&gt;
&lt;br /&gt;
* Installation d&#039;acceleo 2.2.1&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 a 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 désirez faire du debuggage avec XDebug ===&lt;br /&gt;
&lt;br /&gt;
* Installer xdebug (package php-xdebug sous Ubuntu)&lt;br /&gt;
&lt;br /&gt;
* Modifier le fichier php.ini (ou xdebug.ini) pour ajouter les paramètres&lt;br /&gt;
- xdebug.remote_enable=1&lt;br /&gt;
&lt;br /&gt;
- xdebug.profiler_enable=1&lt;br /&gt;
&lt;br /&gt;
- xdebug.show_local_vars=1&lt;br /&gt;
&lt;br /&gt;
=== Et si vous êtes sous Windows ===&lt;br /&gt;
&lt;br /&gt;
* WampServer 2 (pour le base Mysql, Apache et PHP tout clé en main). Ce serveur WAMP offre le trio MySql+Apache+PHP installé en clé en main, avec possibilité de basculer de version pour n&#039;importe lequel des ces composants d&#039;un simple clic). Un must !&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;
== 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;&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>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=A_savoir_avant_de_commencer&amp;diff=8330</id>
		<title>A savoir avant de commencer</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=A_savoir_avant_de_commencer&amp;diff=8330"/>
		<updated>2009-02-03T18:56:55Z</updated>

		<summary type="html">&lt;p&gt;Mcg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
Si vous souhaitez devenir développeur de Dolibarr vous devez :&lt;br /&gt;
&lt;br /&gt;
# Lire ce wiki et plus particulièrement la [[Documentation Développeur]] dans son intégralité (dont est issue cette page).&lt;br /&gt;
# Créer un compte sur [http://savannah.nongnu.org Savannah] et s&#039;inscrire à la mailing-list ML développeur ([http://savannah.nongnu.org/mail/?group=dolibarr Voir ici]). Inutile de demander à faire partie du groupe &amp;quot;Dolibarr&amp;quot; savannah, ceci donnant accès au CVS, cela n&#039;est validé que lorsque votre grade passe au rang de Amiral, Jedi ou Yoda (Voir [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel]] pour plus d&#039;informations).&lt;br /&gt;
# Poster sur cette ML, une courte présentation de vos cursus, attentes ou intentions.&lt;br /&gt;
# Vous pouvez commencer par réaliser des évolutions chez vous et les tester sans géner l&#039;organisation de Dolibarr.&lt;br /&gt;
# Pour soumettre vos premiers travaux ou encore devenir développeur officiel, il est important de savoir que ceci passe par un circuit qui peut être long mais qui est nécessaire pour garantir la qualité de Dolibarr. Plus d&#039;info sur ces liens:&lt;br /&gt;
* [[FAQ_D%C3%A9veloppeur#Soumettre_un_patch.2C_amelioration_ou_participer_au_d.C3.A9veloppement|FAQ Développeur (soumettre un patch)]]&lt;br /&gt;
* [[FAQ_D%C3%A9veloppeur#Comment_devenir_d.C3.A9veloppeur_officiel|FAQ Développeur (devenir développeur officiel)]]&lt;br /&gt;
&lt;br /&gt;
Ces quelques obligations n&#039;ont pour seul but que le développement se fasse dans les meilleures conditions possibles.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Documentation_D%C3%A9veloppeur&amp;diff=8329</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=8329"/>
		<updated>2009-02-03T18:55:06Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Les modules de numérotation */&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;
# [[Outils et principe|A savoir avant de commencer]]&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|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;
# [[Mise à jour du format de la base]]&lt;br /&gt;
&lt;br /&gt;
== Comprendre un module existant ==&lt;br /&gt;
La documentation, pour les développeurs, spécifique à un module fonctionnel standard de Dolibarr, est définie sur la page [[Modules]].&lt;br /&gt;
&lt;br /&gt;
La liste des modules complémentaires est définie sur la page des Modules complémentaires [http://wiki.dolibarr.org/index.php?title=Category:Modules_compl%C3%A9mentaires&amp;amp;]&lt;br /&gt;
&lt;br /&gt;
== Développer un nouveau module/extension pour les 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: [[Developpement 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: [[Developpement script]]&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;
# [[FAQ Développeur]]&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8328</id>
		<title>Developer FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8328"/>
		<updated>2009-02-03T18:53:14Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Changer mon système de numérotation des factures en cours de route */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToTranslate}}&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Récupérer/mettre à jour une version CVS développeur ==&lt;br /&gt;
&#039;&#039;&#039;Effectuer une sauvegarde de ses données et de sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous avez déjà une installation en place, sauvegarder votre fichier htdocs/conf/conf.php au cas où.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer la version CVS de la branche de développement principale (appelée HEAD). L&#039;opération consiste à récupérer la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, voir la [http://www.dolibarr.org/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=64&amp;amp;&amp;amp;Itemid=36 version CVS du jour].&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par CVS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la dernière version en cours de développement, vous pouvez aussi directement utiliser [http://savannah.nongnu.org/cvs/?group=dolibarr le serveur CVS en mode anonyme], si vous disposez d&#039;un client CVS (commande CVS sous Linux, ou TortoiseCVS par exemple sous Windows).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer un snapshot intégral (sans suivi cvs) dans le répertoire courant est:&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q checkout -r HEAD -d ./ dolibarr/&lt;br /&gt;
&#039;&#039;&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;
La commande permettant de mettre à jour localement une copie de travail CVS qui a déjà été rapatriée:&lt;br /&gt;
&#039;&#039;Sous linux (script shell):&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q update -P -d&lt;br /&gt;
Sous Windows avec Tortoise cvs&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&#039;&#039;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications sur les fichiers intégrés au cvs:&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&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;
&#039;&#039;&#039;Récupération d&#039;une autre branche par CVS&#039;&#039;&#039;&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;
&#039;&#039;&#039;Restaurer sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Restaurer le fichier de configuration (./htdocs/conf/conf.php) d&#039;après sa sauvegarde si vous l&#039;avez écrasé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mise a jour de la base&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La deuxième étape consiste à migrer la base. Pour celà, 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;
== Démarrer le développement ==&lt;br /&gt;
&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;
== Comment créer un nouveau thème ==&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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Par exemple, pour passer d&#039;un modèle FAYYMM999 à Terre (FAYYMM-999), vous pouvez exécuter la requête suivante:&lt;br /&gt;
&amp;lt;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Soumettre un patch, amélioration ou participer au développement ==&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;
Sous tout OS:&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/component/option,com_docman/task,cat_view/gid,50/Itemid,36/lang,en/ site officiel de Dolibarr].&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] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&#039;*.rej&#039; --exclude=&#039;*.orig&#039;&lt;br /&gt;
 --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  ancien_rep  nouveau_rep  &amp;gt; fichier.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Envoyer votre patch sur la ML.&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;
Sous Windows:&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;Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Si votre patch n&#039;a pas encore été appliqué, mais que vous souhaitez de votre coté l&#039;appliquer sur votre serveur linux fraichement mis à jour depuis la CVS, cela est possible grâce à l&#039;utilitaire patch. &lt;br /&gt;
En admettant que vous avez créé votre patch à partir du répertoire htdocs de votre copie locale du cvs modifiée par vos soins, et que vous avez envoyé votre patch (monfichier.patch) sur le serveur dans le dossier patchs situé au meme niveau que votre dossier htdocs distant, la commande suivante devrait faire l&#039;affaire (executée depuis le dossier patchs):&lt;br /&gt;
 patch -u -p0 -d ../htdocs &amp;lt; monfichier.patch&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 (-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 htdocs à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch en mode 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 pour utilisation ==&lt;br /&gt;
Voir la page [[Developpement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement moduel - Créer un package pour livrer et installer votre module]]&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, or 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égis 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;habilitation 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 science fiction. 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;
&lt;br /&gt;
* &#039;&#039;&#039;Membre de l&#039;alliance&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aide 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;Membre&#039;&#039;&#039; de l&#039;alliance Dolibarr (Votre grade est au niveau &#039;&#039;&#039;Membre&#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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chasseur de l&#039;alliance&#039;&#039;&#039;&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;
A votre première soumission acceptée (incluse dans le CVS par un Amiral ou Jedi), 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;
&lt;br /&gt;
* &#039;&#039;&#039;Amiral de l&#039;alliance&#039;&#039;&#039;&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 la qualité des patch qui ont été envoyés est satisfaisante, qu&#039;un Yoda en place vous offrira un accès CVS direct.&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 soit 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 une traduction échappe à 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;
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;
&lt;br /&gt;
* &#039;&#039;&#039;Jedi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est encore au bout d&#039;un temps variable (sûrement le plus long de tous) au rang d&#039;Amiral, et si la qualité des patch qui ont été envoyés 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;
&lt;br /&gt;
* &#039;&#039;&#039;Yoda&#039;&#039;&#039;&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 par succession, suite au départ d&#039;un Yoda qui se retire, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Et Dark Vador alors ?&lt;br /&gt;
&lt;br /&gt;
Il existe. Dans la galaxie Dolibarr, on qualifie de Dark Vador, le parasite qui pollue 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 constructives qui aident à progresser. La mauvaise foi ou le mauvais ton est souvent de rigueur chez les Dark Vador...&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un seul Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Le projet Dolibarr]] pour connaitre la liste des personnes à chaque grade actuellement.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8327</id>
		<title>Developer FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8327"/>
		<updated>2009-02-03T18:52:06Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Comment créer un nouveau thème */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToTranslate}}&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Récupérer/mettre à jour une version CVS développeur ==&lt;br /&gt;
&#039;&#039;&#039;Effectuer une sauvegarde de ses données et de sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous avez déjà une installation en place, sauvegarder votre fichier htdocs/conf/conf.php au cas où.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer la version CVS de la branche de développement principale (appelée HEAD). L&#039;opération consiste à récupérer la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, voir la [http://www.dolibarr.org/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=64&amp;amp;&amp;amp;Itemid=36 version CVS du jour].&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par CVS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la dernière version en cours de développement, vous pouvez aussi directement utiliser [http://savannah.nongnu.org/cvs/?group=dolibarr le serveur CVS en mode anonyme], si vous disposez d&#039;un client CVS (commande CVS sous Linux, ou TortoiseCVS par exemple sous Windows).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer un snapshot intégral (sans suivi cvs) dans le répertoire courant est:&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q checkout -r HEAD -d ./ dolibarr/&lt;br /&gt;
&#039;&#039;&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;
La commande permettant de mettre à jour localement une copie de travail CVS qui a déjà été rapatriée:&lt;br /&gt;
&#039;&#039;Sous linux (script shell):&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q update -P -d&lt;br /&gt;
Sous Windows avec Tortoise cvs&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&#039;&#039;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications sur les fichiers intégrés au cvs:&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&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;
&#039;&#039;&#039;Récupération d&#039;une autre branche par CVS&#039;&#039;&#039;&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;
&#039;&#039;&#039;Restaurer sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Restaurer le fichier de configuration (./htdocs/conf/conf.php) d&#039;après sa sauvegarde si vous l&#039;avez écrasé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mise a jour de la base&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La deuxième étape consiste à migrer la base. Pour celà, 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;
== Démarrer le développement ==&lt;br /&gt;
&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;
== Comment créer un nouveau thème ==&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;pre&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;/pre&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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soumettre un patch, amélioration ou participer au développement ==&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;
Sous tout OS:&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/component/option,com_docman/task,cat_view/gid,50/Itemid,36/lang,en/ site officiel de Dolibarr].&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] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&#039;*.rej&#039; --exclude=&#039;*.orig&#039;&lt;br /&gt;
 --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  ancien_rep  nouveau_rep  &amp;gt; fichier.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Envoyer votre patch sur la ML.&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;
Sous Windows:&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;Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Si votre patch n&#039;a pas encore été appliqué, mais que vous souhaitez de votre coté l&#039;appliquer sur votre serveur linux fraichement mis à jour depuis la CVS, cela est possible grâce à l&#039;utilitaire patch. &lt;br /&gt;
En admettant que vous avez créé votre patch à partir du répertoire htdocs de votre copie locale du cvs modifiée par vos soins, et que vous avez envoyé votre patch (monfichier.patch) sur le serveur dans le dossier patchs situé au meme niveau que votre dossier htdocs distant, la commande suivante devrait faire l&#039;affaire (executée depuis le dossier patchs):&lt;br /&gt;
 patch -u -p0 -d ../htdocs &amp;lt; monfichier.patch&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 (-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 htdocs à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch en mode 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 pour utilisation ==&lt;br /&gt;
Voir la page [[Developpement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement moduel - Créer un package pour livrer et installer votre module]]&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, or 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égis 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;habilitation 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 science fiction. 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;
&lt;br /&gt;
* &#039;&#039;&#039;Membre de l&#039;alliance&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aide 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;Membre&#039;&#039;&#039; de l&#039;alliance Dolibarr (Votre grade est au niveau &#039;&#039;&#039;Membre&#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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chasseur de l&#039;alliance&#039;&#039;&#039;&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;
A votre première soumission acceptée (incluse dans le CVS par un Amiral ou Jedi), 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;
&lt;br /&gt;
* &#039;&#039;&#039;Amiral de l&#039;alliance&#039;&#039;&#039;&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 la qualité des patch qui ont été envoyés est satisfaisante, qu&#039;un Yoda en place vous offrira un accès CVS direct.&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 soit 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 une traduction échappe à 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;
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;
&lt;br /&gt;
* &#039;&#039;&#039;Jedi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est encore au bout d&#039;un temps variable (sûrement le plus long de tous) au rang d&#039;Amiral, et si la qualité des patch qui ont été envoyés 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;
&lt;br /&gt;
* &#039;&#039;&#039;Yoda&#039;&#039;&#039;&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 par succession, suite au départ d&#039;un Yoda qui se retire, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Et Dark Vador alors ?&lt;br /&gt;
&lt;br /&gt;
Il existe. Dans la galaxie Dolibarr, on qualifie de Dark Vador, le parasite qui pollue 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 constructives qui aident à progresser. La mauvaise foi ou le mauvais ton est souvent de rigueur chez les Dark Vador...&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un seul Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Le projet Dolibarr]] pour connaitre la liste des personnes à chaque grade actuellement.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8326</id>
		<title>Developer FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8326"/>
		<updated>2009-02-03T18:51:30Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Récupérer/mettre à jour une version CVS développeur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToTranslate}}&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Récupérer/mettre à jour une version CVS développeur ==&lt;br /&gt;
&#039;&#039;&#039;Effectuer une sauvegarde de ses données et de sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous avez déjà une installation en place, sauvegarder votre fichier htdocs/conf/conf.php au cas où.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer la version CVS de la branche de développement principale (appelée HEAD). L&#039;opération consiste à récupérer la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, voir la [http://www.dolibarr.org/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=64&amp;amp;&amp;amp;Itemid=36 version CVS du jour].&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par CVS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la dernière version en cours de développement, vous pouvez aussi directement utiliser [http://savannah.nongnu.org/cvs/?group=dolibarr le serveur CVS en mode anonyme], si vous disposez d&#039;un client CVS (commande CVS sous Linux, ou TortoiseCVS par exemple sous Windows).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer un snapshot intégral (sans suivi cvs) dans le répertoire courant est:&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q checkout -r HEAD -d ./ dolibarr/&lt;br /&gt;
&#039;&#039;&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;
La commande permettant de mettre à jour localement une copie de travail CVS qui a déjà été rapatriée:&lt;br /&gt;
&#039;&#039;Sous linux (script shell):&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q update -P -d&lt;br /&gt;
Sous Windows avec Tortoise cvs&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&#039;&#039;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications sur les fichiers intégrés au cvs:&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&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;
&#039;&#039;&#039;Récupération d&#039;une autre branche par CVS&#039;&#039;&#039;&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;
&#039;&#039;&#039;Restaurer sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Restaurer le fichier de configuration (./htdocs/conf/conf.php) d&#039;après sa sauvegarde si vous l&#039;avez écrasé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mise a jour de la base&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La deuxième étape consiste à migrer la base. Pour celà, 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;
== Démarrer le développement ==&lt;br /&gt;
&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;
== 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;pre&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;/pre&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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soumettre un patch, amélioration ou participer au développement ==&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;
Sous tout OS:&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/component/option,com_docman/task,cat_view/gid,50/Itemid,36/lang,en/ site officiel de Dolibarr].&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] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&#039;*.rej&#039; --exclude=&#039;*.orig&#039;&lt;br /&gt;
 --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  ancien_rep  nouveau_rep  &amp;gt; fichier.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Envoyer votre patch sur la ML.&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;
Sous Windows:&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;Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Si votre patch n&#039;a pas encore été appliqué, mais que vous souhaitez de votre coté l&#039;appliquer sur votre serveur linux fraichement mis à jour depuis la CVS, cela est possible grâce à l&#039;utilitaire patch. &lt;br /&gt;
En admettant que vous avez créé votre patch à partir du répertoire htdocs de votre copie locale du cvs modifiée par vos soins, et que vous avez envoyé votre patch (monfichier.patch) sur le serveur dans le dossier patchs situé au meme niveau que votre dossier htdocs distant, la commande suivante devrait faire l&#039;affaire (executée depuis le dossier patchs):&lt;br /&gt;
 patch -u -p0 -d ../htdocs &amp;lt; monfichier.patch&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 (-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 htdocs à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch en mode 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 pour utilisation ==&lt;br /&gt;
Voir la page [[Developpement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement moduel - Créer un package pour livrer et installer votre module]]&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, or 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égis 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;habilitation 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 science fiction. 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;
&lt;br /&gt;
* &#039;&#039;&#039;Membre de l&#039;alliance&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aide 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;Membre&#039;&#039;&#039; de l&#039;alliance Dolibarr (Votre grade est au niveau &#039;&#039;&#039;Membre&#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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chasseur de l&#039;alliance&#039;&#039;&#039;&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;
A votre première soumission acceptée (incluse dans le CVS par un Amiral ou Jedi), 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;
&lt;br /&gt;
* &#039;&#039;&#039;Amiral de l&#039;alliance&#039;&#039;&#039;&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 la qualité des patch qui ont été envoyés est satisfaisante, qu&#039;un Yoda en place vous offrira un accès CVS direct.&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 soit 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 une traduction échappe à 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;
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;
&lt;br /&gt;
* &#039;&#039;&#039;Jedi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est encore au bout d&#039;un temps variable (sûrement le plus long de tous) au rang d&#039;Amiral, et si la qualité des patch qui ont été envoyés 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;
&lt;br /&gt;
* &#039;&#039;&#039;Yoda&#039;&#039;&#039;&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 par succession, suite au départ d&#039;un Yoda qui se retire, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Et Dark Vador alors ?&lt;br /&gt;
&lt;br /&gt;
Il existe. Dans la galaxie Dolibarr, on qualifie de Dark Vador, le parasite qui pollue 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 constructives qui aident à progresser. La mauvaise foi ou le mauvais ton est souvent de rigueur chez les Dark Vador...&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un seul Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Le projet Dolibarr]] pour connaitre la liste des personnes à chaque grade actuellement.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8325</id>
		<title>Developer FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8325"/>
		<updated>2009-02-03T18:49:58Z</updated>

		<summary type="html">&lt;p&gt;Mcg: /* Récupérer/mettre à jour une version CVS développeur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToTranslate}}&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Récupérer/mettre à jour une version CVS développeur ==&lt;br /&gt;
&#039;&#039;&#039;Effectuer une sauvegarde de ses données et de sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous avez déjà une installation en place, sauvegarder votre fichier htdocs/conf/conf.php au cas où.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer la version CVS de la branche de développement principale (appelée HEAD). L&#039;opération consiste à récupérer la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, voir la [http://www.dolibarr.org/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=64&amp;amp;&amp;amp;Itemid=36 version CVS du jour].&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par CVS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la dernière version en cours de développement, vous pouvez aussi directement utiliser [http://savannah.nongnu.org/cvs/?group=dolibarr le serveur CVS en mode anonyme], si vous disposez d&#039;un client CVS (commande CVS sous Linux, ou TortoiseCVS par exemple sous Windows).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer un snapshot intégral (sans suivi cvs) dans le répertoire courant est:&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q checkout -r HEAD -d ./ dolibarr/&lt;br /&gt;
&#039;&#039;&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;
La commande permettant de mettre à jour localement une copie de travail CVS qui a déjà été rappatriée:&lt;br /&gt;
&#039;&#039;Sous linux (script shell):&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q update -P -d&lt;br /&gt;
Sous Windows avec Tortoise cvs&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&#039;&#039;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications sur les fichiers intégrés au cvs:&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&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;
&#039;&#039;&#039;Récupération d&#039;une autre branche par CVS&#039;&#039;&#039;&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;
&#039;&#039;&#039;Restaurer sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Restaurer le fichier de configuration (./htdocs/conf/conf.php) d&#039;après sa sauvegarde si vous l&#039;avez écrasé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mise a jour de la base&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La deuxième étape consiste à migrer la base. Pour celà, 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;
== Démarrer le développement ==&lt;br /&gt;
&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;
== 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;pre&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;/pre&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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soumettre un patch, amélioration ou participer au développement ==&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;
Sous tout OS:&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/component/option,com_docman/task,cat_view/gid,50/Itemid,36/lang,en/ site officiel de Dolibarr].&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] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&#039;*.rej&#039; --exclude=&#039;*.orig&#039;&lt;br /&gt;
 --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  ancien_rep  nouveau_rep  &amp;gt; fichier.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Envoyer votre patch sur la ML.&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;
Sous Windows:&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;Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Si votre patch n&#039;a pas encore été appliqué, mais que vous souhaitez de votre coté l&#039;appliquer sur votre serveur linux fraichement mis à jour depuis la CVS, cela est possible grâce à l&#039;utilitaire patch. &lt;br /&gt;
En admettant que vous avez créé votre patch à partir du répertoire htdocs de votre copie locale du cvs modifiée par vos soins, et que vous avez envoyé votre patch (monfichier.patch) sur le serveur dans le dossier patchs situé au meme niveau que votre dossier htdocs distant, la commande suivante devrait faire l&#039;affaire (executée depuis le dossier patchs):&lt;br /&gt;
 patch -u -p0 -d ../htdocs &amp;lt; monfichier.patch&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 (-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 htdocs à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch en mode 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 pour utilisation ==&lt;br /&gt;
Voir la page [[Developpement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement moduel - Créer un package pour livrer et installer votre module]]&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, or 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égis 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;habilitation 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 science fiction. 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;
&lt;br /&gt;
* &#039;&#039;&#039;Membre de l&#039;alliance&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aide 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;Membre&#039;&#039;&#039; de l&#039;alliance Dolibarr (Votre grade est au niveau &#039;&#039;&#039;Membre&#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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chasseur de l&#039;alliance&#039;&#039;&#039;&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;
A votre première soumission acceptée (incluse dans le CVS par un Amiral ou Jedi), 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;
&lt;br /&gt;
* &#039;&#039;&#039;Amiral de l&#039;alliance&#039;&#039;&#039;&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 la qualité des patch qui ont été envoyés est satisfaisante, qu&#039;un Yoda en place vous offrira un accès CVS direct.&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 soit 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 une traduction échappe à 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;
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;
&lt;br /&gt;
* &#039;&#039;&#039;Jedi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est encore au bout d&#039;un temps variable (sûrement le plus long de tous) au rang d&#039;Amiral, et si la qualité des patch qui ont été envoyés 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;
&lt;br /&gt;
* &#039;&#039;&#039;Yoda&#039;&#039;&#039;&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 par succession, suite au départ d&#039;un Yoda qui se retire, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Et Dark Vador alors ?&lt;br /&gt;
&lt;br /&gt;
Il existe. Dans la galaxie Dolibarr, on qualifie de Dark Vador, le parasite qui pollue 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 constructives qui aident à progresser. La mauvaise foi ou le mauvais ton est souvent de rigueur chez les Dark Vador...&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un seul Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Le projet Dolibarr]] pour connaitre la liste des personnes à chaque grade actuellement.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
	<entry>
		<id>https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8324</id>
		<title>Developer FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.dolibarr.org/index.php?title=Developer_FAQ&amp;diff=8324"/>
		<updated>2009-02-03T18:48:24Z</updated>

		<summary type="html">&lt;p&gt;Mcg: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ToTranslate}}&lt;br /&gt;
{{TemplateDocDev}}&lt;br /&gt;
&lt;br /&gt;
== Récupérer/mettre à jour une version CVS développeur ==&lt;br /&gt;
&#039;&#039;&#039;Effectuer une sauvegarde de ses données et de sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Si vous avez déjà une installation en place, sauvegarder votre fichier htdocs/conf/conf.php au cas ou.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par download&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Cette méthode permet de récupérer la version CVS de la branche de développement principale (appelée HEAD). L&#039;opération consiste à récupérer la dernière version des fichiers de Dolibarr regroupés toutes les nuits dans un zip.&lt;br /&gt;
Pour cela, voir la [http://www.dolibarr.org/index.php?option=com_docman&amp;amp;task=cat_view&amp;amp;gid=64&amp;amp;&amp;amp;Itemid=36 version CVS du jour].&lt;br /&gt;
Les nouveaux fichiers doivent écraser les anciens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Récupération dernière version des sources par CVS&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Pour récupérer la dernière version en cours de développement, vous pouvez aussi directement utiliser [http://savannah.nongnu.org/cvs/?group=dolibarr le serveur CVS en mode anonyme], si vous disposez d&#039;un client CVS (commande CVS sous Linux, ou TortoiseCVS par exemple sous Windows).&lt;br /&gt;
&lt;br /&gt;
La commande permettant de récupérer un snapshot intégral (sans suivi cvs) dans le répertoire courant est:&lt;br /&gt;
&#039;&#039;&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q checkout -r HEAD -d ./ dolibarr/&lt;br /&gt;
&#039;&#039;&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;
La commande permettant de mettre à jour localement une copie de travail CVS qui a déjà été rappatriée:&lt;br /&gt;
&#039;&#039;Sous linux (script shell):&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&lt;br /&gt;
 export CVSROOT&lt;br /&gt;
 cvs -q update -P -d&lt;br /&gt;
Sous Windows avec Tortoise cvs&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&#039;&#039;&lt;br /&gt;
Et pour remettre au propre votre copie locale en annulant vos modifications sur les fichiers intégrés au cvs:&lt;br /&gt;
 &amp;quot;C:\Program Files\CVSNT\cvs.exe&amp;quot; -q update -P -C -d&lt;br /&gt;
 CVSROOT=:pserver:anonymous@cvs.savannah.nongnu.org:/sources/dolibarr&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;
&#039;&#039;&#039;Récupération d&#039;une autre branche par CVS&#039;&#039;&#039;&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;
&#039;&#039;&#039;Restaurer sa configuration&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Restaurer le fichier de configuration (./htdocs/conf/conf.php) d&#039;après sa sauvegarde si vous l&#039;avez écrasé.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Mise a jour de la base&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La deuxième étape consiste à migrer la base. Pour celà, 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;
== Démarrer le développement ==&lt;br /&gt;
&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;
== 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;pre&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;/pre&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;pre&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;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Soumettre un patch, amélioration ou participer au développement ==&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;
Sous tout OS:&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/component/option,com_docman/task,cat_view/gid,50/Itemid,36/lang,en/ site officiel de Dolibarr].&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] sous Windows) de la manière suivante:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
diff -Naur --exclude=CVS --exclude=&amp;quot;.#*&amp;quot; --exclude=&amp;quot;*~&amp;quot; --exclude=&#039;*.rej&#039; --exclude=&#039;*.orig&#039;&lt;br /&gt;
 --exclude=&amp;quot;*.bak&amp;quot; --exclude=conf.php --exclude=documents  ancien_rep  nouveau_rep  &amp;gt; fichier.patch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Envoyer votre patch sur la ML.&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;
Sous Windows:&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;Appliquer un patch&#039;&#039;&#039;&lt;br /&gt;
Si votre patch n&#039;a pas encore été appliqué, mais que vous souhaitez de votre coté l&#039;appliquer sur votre serveur linux fraichement mis à jour depuis la CVS, cela est possible grâce à l&#039;utilitaire patch. &lt;br /&gt;
En admettant que vous avez créé votre patch à partir du répertoire htdocs de votre copie locale du cvs modifiée par vos soins, et que vous avez envoyé votre patch (monfichier.patch) sur le serveur dans le dossier patchs situé au meme niveau que votre dossier htdocs distant, la commande suivante devrait faire l&#039;affaire (executée depuis le dossier patchs):&lt;br /&gt;
 patch -u -p0 -d ../htdocs &amp;lt; monfichier.patch&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 (-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 htdocs à patcher.&lt;br /&gt;
&amp;lt; permet de donner le chemin vers le fichier source à utiliser (le patch en mode 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 pour utilisation ==&lt;br /&gt;
Voir la page [[Developpement_module#Cr.C3.A9er_un_package_pour_livrer_et_installer_votre_module|Developpement moduel - Créer un package pour livrer et installer votre module]]&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, or 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égis 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;habilitation 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 science fiction. 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;
&lt;br /&gt;
* &#039;&#039;&#039;Membre de l&#039;alliance&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La première chose qu&#039;une personne désireuse d&#039;aide 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;Membre&#039;&#039;&#039; de l&#039;alliance Dolibarr (Votre grade est au niveau &#039;&#039;&#039;Membre&#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.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Chasseur de l&#039;alliance&#039;&#039;&#039;&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;
A votre première soumission acceptée (incluse dans le CVS par un Amiral ou Jedi), 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;
&lt;br /&gt;
* &#039;&#039;&#039;Amiral de l&#039;alliance&#039;&#039;&#039;&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 la qualité des patch qui ont été envoyés est satisfaisante, qu&#039;un Yoda en place vous offrira un accès CVS direct.&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 soit 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 une traduction échappe à 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;
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;
&lt;br /&gt;
* &#039;&#039;&#039;Jedi&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
C&#039;est encore au bout d&#039;un temps variable (sûrement le plus long de tous) au rang d&#039;Amiral, et si la qualité des patch qui ont été envoyés 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;
&lt;br /&gt;
* &#039;&#039;&#039;Yoda&#039;&#039;&#039;&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 par succession, suite au départ d&#039;un Yoda qui se retire, par nomination directe ou vote organisé par le Yoda partant.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
...Et Dark Vador alors ?&lt;br /&gt;
&lt;br /&gt;
Il existe. Dans la galaxie Dolibarr, on qualifie de Dark Vador, le parasite qui pollue 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 constructives qui aident à progresser. La mauvaise foi ou le mauvais ton est souvent de rigueur chez les Dark Vador...&lt;br /&gt;
Heureusement, statistiquement, on ne constate l&#039;apparition et la mort que d&#039;un seul Dark Vador par an environ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Voir la page [[Le projet Dolibarr]] pour connaitre la liste des personnes à chaque grade actuellement.&lt;/div&gt;</summary>
		<author><name>Mcg</name></author>
	</entry>
</feed>