Line 7:
Line 7:
[[de:Modul_Entwicklung]]
[[de:Modul_Entwicklung]]
[[zh:模块开发]]
[[zh:模块开发]]
+
[[ja:モジュール_開発]]
<!-- END interlang links -->
<!-- END interlang links -->
Line 33:
Line 34:
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le "Générateur de module" (aussi appelé "Module Builder"). Pour l'activer :
Depuis Dolibarr 9.0 il est possible de créer les fichiers principaux de votre module avec le "Générateur de module" (aussi appelé "Module Builder"). Pour l'activer :
−
*Activez le module "Générateur de Module" dans la section "Outils multi-modules"
+
*Activez le module "Générateur de Module" (ou "Module builder") dans la section "Outils multi-modules" de Configuration > Modules/Applications
[[File:Mod_builder_2.png|400px]]
[[File:Mod_builder_2.png|400px]]
Line 43:
Line 44:
=[[File:Art.png]] Exemple de modèle de module externe=
=[[File:Art.png]] Exemple de modèle de module externe=
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]
Un bon modèle/squelette de module externe Dolibarr est disponible ici : [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]
+
+
Vous trouverez aussi un exemple de réalisation de module via un cas pratique : la création d'un module afin de créer un calendrier des commandes fournisseurs : [[Exemple de cas pratique de Module Builder]]
=[[File:Art.png]] Créer un module=
=[[File:Art.png]] Créer un module=
Line 49:
Line 52:
==Créer un descripteur de Module (obligatoire)==
==Créer un descripteur de Module (obligatoire)==
'''Quand''' : Obligatoire dès qu'une extension est développée, quelle que soit sa vocation.
'''Quand''' : Obligatoire dès qu'une extension est développée, quelle que soit sa vocation.
−
'''Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le "Générateur de module"'''. Cet outil est encore encours de développement et de maturité mais peut dors et déjà être utilisé.
+
'''Depuis Dolibarr 9.0, il est possible de créer le descripteur de votre module avec le "Générateur de module"'''. Cet outil est encore encours de développement et de maturité mais peut d'ores et déjà être utilisé.
===Créer votre descripteur avec le générateur de module===
===Créer votre descripteur avec le générateur de module===
Line 96:
Line 99:
==Créer vos tables SQL et les classes PHP DAO (optionnel)==
==Créer vos tables SQL et les classes PHP DAO (optionnel)==
−
'''Quand''': Si votre module a besoin de gérer des données qui lui sont propres
+
'''Quand''' : Si votre module a besoin de gérer des données qui lui sont propres
===Créer vos fichiers .sql===
===Créer vos fichiers .sql===
Si votre module a vocation à gérer des données bien à lui, qui n'existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.
Si votre module a vocation à gérer des données bien à lui, qui n'existent pas en base dans la version standard de Dolibarr, il est nécessaire de définir des tables SQL pour stocker ces données.
−
Créer un sous-répertoire '''sql''' dans le répertoire de votre module (par exemple '''htdocs/custom/monmodule/sql''') afin d'y placer les scripts sql que vous allez créer (Avec ModuleBuilder ces répertoires et fichiers seront créés automatiquement suite à la création d'un Objet).
+
Créer un sous-répertoire '''sql''' dans le répertoire de votre module ('''monmodule/sql''') afin d'y placer les scripts sql que vous allez créer (Avec ModuleBuilder cette étape sera réalisée automatiquement suite à la création d'un nouvel Objet depuis l'onglet Objet).
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction '''init''' que la ligne
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction '''init''' que la ligne
Line 123:
Line 126:
Les ordres SQL des fichiers doivent être opérationnels pour la base de données '''mysql'''.
Les ordres SQL des fichiers doivent être opérationnels pour la base de données '''mysql'''.
−
Rem: Les fichiers des autres bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.
+
Rem: Les fichiers des autres types de bases ne sont pas à maintenir. Ils sont lus et convertis à la volée par le driver de la base de données.
===Tester vos fichiers .sql===
===Tester vos fichiers .sql===
−
Une fois les fichiers prêts, vous pouvez retourner sous Dolibarr puis désactiver le module, dropper les tables en base et réactiver le module.
+
Une fois les fichiers prêts, vous pouvez retourner dans l'écran de gestion des modules de Dolibarr puis désactiver le module, dropper les tables en base (si elles existent déjà) et réactiver le module.
Les tables doivent alors être recréées par l'activation du module.
Les tables doivent alors être recréées par l'activation du module.
Si tel n'est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.
Si tel n'est pas le cas, vérifiez vos scripts en les passant à la main, ou consultez les logs Dolibarr.
Line 133:
Line 136:
===Générer la classe PHP DAO d'accès aux tables===
===Générer la classe PHP DAO d'accès aux tables===
−
Depuis Dolibarr 9.0, il est possible de générer les fichiers DAO .class.php, comme les fichiers .sql de vos objets de votre module avec le "Générateur de module".
+
Le fichier de classe DAO PHP d'un object est généré automatiquement avec ModuleBuilder lors de la création d'un Object.
−
A défaut d'utiliser le générateur de module, vous trouverez des exemple dans le squelette de module, fichier '''htdocs/modulebuilder/templates/class/myobject.class.php'''.
+
À défaut d'utiliser le générateur de module, vous trouverez des exemples dans le squelette de module, fichier '''htdocs/modulebuilder/templates/class/myobject.class.php'''.
−
Dans cette classe, se trouve des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d'une ligne de la table. Editer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de '''class''' du module. Le Module Builder permet de faire cela en quelques clics de souris.
+
Dans cette classe, se trouvent des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d'une ligne de la table. Éditer le fichier pour utiliser le bon nom de module, de tables et placer ce fichier dans le sous-répertoire de '''class''' du module. Le Module Builder permet de faire cela en quelques clics de souris.
==Affichage des onglets (optionnel)==
==Affichage des onglets (optionnel)==
===Ajouter ou supprimer des onglets sur les fiches objets===
===Ajouter ou supprimer des onglets sur les fiches objets===
−
'''Quand''' : Pour ajouter votre propre onglet parmi les onglets standard d'une fiche entité (facture, commande, proposition commercial, adhérent...)
+
'''Quand''' : Pour ajouter votre propre onglet parmi les onglets d'un object standard (facture, commande, proposition commercial, adhérent...)
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this->tabs:
Pour cela, allez dans le fichier descripteur de module précédemment créé et modifiez le tableau $this->tabs:
Line 168:
Line 171:
Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.
Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.
−
===Ajouter les onglets standard d'un objet sur sa propre page===
+
===Ajouter les onglets standard d'un objet sur sa propre page d'onglet===
−
'''Quand''' : Pour afficher les onglets standard d'une fiche entité (produit, tiers, etc.) sur votre propre page onglet d'une entité.
+
'''Quand''' : Pour afficher les onglets existant d'un objet standard (produit, tiers, etc.) sur votre nouvelle page onglet.
Il faut appliquer la procédure suivante :
Il faut appliquer la procédure suivante :
Line 202:
Line 205:
</source>
</source>
−
'''3. Récupérer la liste des onglets correspondants à l'entité choisie'''
+
'''3. Récupérer la liste des onglets correspondant à l'entité choisie'''
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l'objet pour lequel vous voulez afficher les onglets.
Utilisez la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramètre à passer est l'objet pour lequel vous voulez afficher les onglets.
Line 245:
Line 248:
===Créer une page écran PHP brute===
===Créer une page écran PHP brute===
−
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire '''modulebuilder''' (Pour le développement d'un script en ligne de commande, voir [[Développement de scripts]]).
+
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire '''modulebuilder''' (Pour le développement d'un script en ligne de commande, voir [[Développement de scripts]]). La encore, si vous avez utilisez ModuleBuilder, des cas de pages (liste, page de création, onglet notes, etc...) auront été créés automatiquement lors de l'initialisation de l'objet.
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de '''htdocs''' (si non déjà fait) propre à votre module (Dans '''htdocs/monmodule''' par exemple) afin d'y placer les pages que vous allez créer.
Pour créer une nouvelle page écran utilisateur, créez un sous-répertoire de '''htdocs''' (si non déjà fait) propre à votre module (Dans '''htdocs/monmodule''' par exemple) afin d'y placer les pages que vous allez créer.
Line 292:
Line 295:
</source>
</source>
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n'intègre pas un cache des fichiers "non trouvés". Et comme un fichier donné n'est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).
La raison est que si le dol_include_once est pratique car il scanne chaque répertoire de chemin alternatif pour trouver le fichier, il est aussi moins performant car génère des accès et recherches disque à chaque appel (en effet, PHP intègre un cache des fichiers lus mais n'intègre pas un cache des fichiers "non trouvés". Et comme un fichier donné n'est que dans une seule arborescence, il y a toujours une arborescence alternative où il ne se trouve pas et qui génère des accès superflus au disque dur, pénalisant en terme de performance. Comme pour les fichiers internes à Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit être préféré).
−
−
===Remplacer les parties d'écrans templatés (version 3.3+)===
−
Certaines portions d'écran de Dolibarr sont isolées dans des fichiers templates.
−
Vous pouvez développer un module pour remplacer un ou plusieurs de ces templates par les vôtres.
−
{{ToComplete}}
===Accès à la base===
===Accès à la base===
Line 360:
Line 358:
Pour récupérer la valeur, à l'issu du POST, la commande est:
Pour récupérer la valeur, à l'issu du POST, la commande est:
<source lang="php">
<source lang="php">
−
$mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
+
$mydate = dol_mktime(12, 0 , 0, GETPOST('mykeymonth', 'int'), GETPOST('mykeyday', 'int'), GETPOST('mykeyyear', 'int'));
print strftime('%A %d %B %Y', $mydate);
print strftime('%A %d %B %Y', $mydate);
</source>
</source>
Line 374:
Line 372:
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).
Ensuite dans le descripteur de module, modifiez la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).
<source lang="php">
<source lang="php">
−
$this->config_page_url = array("monmodule_setupapage.php");
+
$this->config_page_url = array("setup.php@mymodule");
</source>
</source>
Line 461:
Line 459:
</source>
</source>
−
==Définir vos propres box (optionnel)==
+
==Définir vos propres box/widgets (optionnel)==
'''Quand''' : si votre module amène avec lui une ou plusieurs Boxes.
'''Quand''' : si votre module amène avec lui une ou plusieurs Boxes.
Line 477:
Line 475:
</source>
</source>
−
Ensuite créez les fichiers '''htdocs/monmodule/core/boxes/mabox0.php''', '''htdocs/monmodule/core/boxes/mabox1.php'''... en prenant exemple sur des box existantes (exemple dans le répertoire '''htdocs/core/boxes''')
+
Ensuite créez les fichiers '''htdocs/monmodule/core/boxes/mabox0.php''', '''htdocs/monmodule/core/boxes/maboxn.php'''... en prenant exemple sur des box existantes (exemple dans le répertoire '''htdocs/core/boxes''')
===Testez la présence de vos box dans Dolibarr===
===Testez la présence de vos box dans Dolibarr===
Désactivez et réactivez le module.
Désactivez et réactivez le module.
−
Allez dans le menu '''Accueil - Configuration - Boite'''.
+
Allez dans le menu '''Accueil - Configuration - Widgets'''.
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d'accueil et vérifiez qu'elles s'affichent correctement.
Vos box doivent apparaître dans la liste des box activables. Activez les puis allez sur la page d'accueil et vérifiez qu'elles s'affichent correctement.
Line 557:
Line 555:
Voir la page [[Themes]].
Voir la page [[Themes]].
+
+
==Ajouter un bouton (optionnel)==
+
Si vous souhaitez ajouter des boutons à vos enregistrements.
+
+
Voir la page [[Création de boutons]].
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=
=[[File:Art.png]] Quelques règles de codage et fonctions pour développeurs=
Line 588:
Line 591:
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
**Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s'avère être d'un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).
**Si la qualité est suffisante, que la licence le permet et que la fonctionnalité du module s'avère être d'un intérêt général, le code pourra être ajouté au code source de Dolibarr (sauf si vous ne le désirez pas).
+
+
Il également possible récupérer votre module au format .zip en ayant activé la variable [[Fichier de configuration|$dolibarr_allow_download_external_modules à 1 dans le fichier conf.php]].
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=
=[[File:Art.png]] Dépôt et validation du module externe sur Dolistore=
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]
Voir [[Module_Dolistore_Validation_Regles|Règles de Validation]]