Difference between revisions of "Modul Entwicklung"
m Tag: 2017 source edit |
PolyglotBot (talk | contribs) m (Updating interlang links (links to translated versions of this page in other languages) triggered by origin English page "Module_development" update.) |
||
(One intermediate revision by the same user not shown) | |||
Line 2: | Line 2: | ||
<!-- Do NOT edit this section | <!-- Do NOT edit this section | ||
Links below are automatically managed by PolyglotBot | Links below are automatically managed by PolyglotBot | ||
â | You can edit links on the English source page : | + | You can edit links on the English source page : Module_development --> |
[[en:Module_development]] | [[en:Module_development]] | ||
[[fr:DĂ©veloppement_module]] | [[fr:DĂ©veloppement_module]] | ||
[[es:Desarrollo_de_un_mĂłdulo]] | [[es:Desarrollo_de_un_mĂłdulo]] | ||
[[zh:æšĄććŒć]] | [[zh:æšĄććŒć]] | ||
+ | [[ja:ăąăžă„ăŒă«_éçș]] | ||
<!-- END interlang links --> | <!-- END interlang links --> | ||
Latest revision as of 07:58, 18 September 2023
Um ein neues Modul zu erstellen, gibt es mehrere Schritte. Dieses Tutorial soll beschreiben, wie Sie ein Modul hinzuzufĂŒgen können, um die Möglichkeiten von Dolibarr zu erweitern und eine oder mehreren folgender Funktionen einzufĂŒgen:
- Neue Tabellen in die Datenbank einfĂŒgen.
- EinfĂŒgen Ihre eigenen MenĂŒeintrĂ€ge
- HinzufĂŒgen eigener Bildschirmmasken fĂŒr die Eingabe/Ausgabe von neuen Tabellen
- Registerkarten auf den Seiten fĂŒr die Objektansicht und Bearbeitung (Rechnung, Produkt, Bestellung, Termine, ...)
- EinfĂŒgen eines Datenexport vordefiniert fĂŒr die Exportfunktion
- Neue Boxen/Widgets fĂŒr die Startseite hinzufĂŒgen.
- Substitutionsvariablen hinzufĂŒgen
- Neue Berechtigungen festlegen
- Triggercode bei einer bestimmten Dolibarr-Aktion auslösen
- Eigenen Code an den Dolibarr-Hooks einhÀngen
- EinfĂŒgen von eigenen Nummerierungsmodulen
- HinzufĂŒgen einer Dokumentvorlage
- HinzufĂŒgen eigenes Designs/Themevorlage
etc...
In den folgenden Kapiteln erfahren Sie, wie Sie all dies auf einfache Weise manuell umsetzen können.
Erstellen von Modulen mit dem Modulgenerator
Seit Dolibarr 9.0 ist es möglich, die Hauptdateien Ihres Moduls mit dem "Modul-Generator" (auch "Module Builder" genannt) zu erstellen. Um ihn zu aktivieren:
- Aktivieren Sie das Modul "Modulgenerator" in der Sektion "Multi-Modul-Tools".
- Dann klicken Sie auf das "Bug"-Symbol, das in der MenĂŒleiste oben rechts erschienen ist.
Beispiel fĂŒr eine Vorlage fĂŒr ein externes Modul
Eine gute modĂšle/squelette fĂŒr ein Dolibarr-Plugin gibt es hier: GitHub Dolibarr Module ModĂšle
Ein Modul erstellen
Die folgenden Unterkapitel beschreiben die Aktionen, die Sie durchfĂŒhren mĂŒssen, um ein Dolibarr-Modul zu erstellen. Die ersten Kapitel sind unabhĂ€ngig vom Zweck des Moduls obligatorisch, die folgenden hĂ€ngen davon ab, was das Modul tun soll.
Einen Moduldeskriptor erstellen (erforderlich)
Wann: Obligatorisch, sobald eine Erweiterung entwickelt wird, unabhÀngig von ihrer Bestimmung. Seit Dolibarr 9.0 ist es möglich, den Deskriptor Ihres Moduls mit dem "Modulgenerator" zu erstellen. Dieses Tool befindet sich noch in der Entwicklungsphase und ist noch nicht ausgereift, kann aber bereits genutzt werden.
Erstellen Sie Ihren Deskriptor mit dem Modulgenerator
- Starten Sie den Modulgenerator, indem Sie auf das "bug"-Symbol klicken.
- Geben Sie den Namen Ihres Moduls ohne Leerzeichen ein (der Name Ihres Moduls DARF NICHT das Zeichen underscore oder Unterstrich : _) und klicken Sie auf Erstellen.
- Ein Modul mit seinen ersten Dateien wurde initialisiert. Sie können nun die Einstellungen des Moduldeskriptors Àndern:
Alternative: Erstellen Sie Ihren Deskriptor manuell (ohne den Modulgenerator zu verwenden)
Der erste Schritt besteht also darin, eine Datei mit der Modulbeschreibung (Deskriptor) zu erstellen. Zu diesem Zweck:
- Erstellen Sie das Verzeichnis /htdocs/meinmodul/core/modules. Wechseln Sie dann in das Verzeichnis dev/skeletons und kopieren Sie die Datei modMyModule.class.php in dieses Verzeichnis htdocs/monmodule'/core/modules.
- Benennen Sie die Datei modMyModule.class.php um, indem Sie nur den Teil MyModule Àndern (die Datei muss mit mod beginnen).
Ăndern Sie anschlieĂend den Inhalt dieser Datei, um :
- den modMyModule in einen Wert, der dem Zweck Ihres Moduls entspricht. Dieser Wert sollte immer mit 'mod' beginnen und nur alphabetische Zeichen enthalten.
- $this->numero = 100000 durch eine freie Modulnummer. Um Konflikte zu vermeiden, können Sie auf folgender Seite nach bereits zugeteilten Nummern suchen: Liste der Modul-IDs.
- Ăndern Sie eventuell andere Variablen, die im Konstruktor definiert sind (Was sie bedeuten, finden Sie im Kommentar im Skelett-Code).
Der Deskriptor Ihres Moduls ist nun an seinem Platz.
Beispielvorlage fĂŒr ein Modul/Pluginodule
Ein gutes Vorlagen-GerĂŒst (Template) fĂŒr ein Modul finden sie hier: GitHub Dolibarr Modul-Template
Erstellen eines Moduls
In den folgenden Unterkapiteln werden die Aktionen beschrieben, welche zum Erstellen eines Dolibarr-Moduls ausgefĂŒhrt werden mĂŒssen. Die ersten Kapitel sind, unabhĂ€ngig vom Zweck des Moduls, zwingend erforderlich. Die folgenden Kapitel hĂ€ngen von der Funktion des Moduls ab.
Erstellen eines Moduldeskriptors (erforderlich)
Wann: Immer notwendig wenn eine Erweiterung entwickelt wird, unabhĂ€ngig von ihrem Zweck (Ausnahmen sind das HinzufĂŒgen eines Themas oder einer Dokumentvorlage).
Seit Dolibarr 9.0 sollten Sie das als Standardmodul bereitgestellte ModuleBuilder-Modul verwenden, um den Moduldeskriptor zu generieren.
Erstellen des Deskriptors
Der erste Schritt besteht darin, eine Modulbeschreibungsdatei (Deskriptor) zu erstellen. DafĂŒr gehen Sie wie folgt vor.
Die durchgestrichenen Teile der Anleitung sind nicht mehr aktuell und bedĂŒrfen einer grundlegenden Ăberarbeitung. !!!Verwenden Sie das ModuleBuilder-Modul!!!
Créer le répertoire /htdocs/monmodule/core/modules. Puis, aller dans le répertoire dev/skeletons et recopier le fichier modMyModule.class.php dans ce répertoire htdocs/monmodule/core/modules.Renommez le fichier modMyModule.class.php en modifiant seulement la partie MyModule (le fichier doit commencer par mod)
Ensuite, modifier le contenu de ce fichier afin de remplacer:
les modMyModule en une valeur qui corresponde à la vocation de votre module. Cette valeur doit toujours commencer par 'mod' et ne contenir que des caractÚres alphabétiques.$this->numero = 100000 par un numéro de module libre. Pour éviter tout conflit, vous pouvez consulter la page suivante pour retrouver les numéros déjà alloués: Liste des id de modules.Modifier éventuellement les autres variables définies dans le constructeurs (Voir le commentaire dans le code du squelette pour leur signification).
Le descripteur de votre module est alors en place.
Tester votre descripteur
Lancer Dolibarr et aller sur la page Configuration->module, vous devez voir apparaßtre une nouvelle ligne avec votre nouveau module et la possibilité de l'activer ou non (parcourez tous les onglets de chaque catégories de modules jusqu'à le retrouver).
C'est la valeur de $this->special qui détermine dans quel onglet se trouve votre module.
Arborescence d'un nouveau module
Voici l'arborescence Ă respecter pour l'organisation des fichiers d'un module.
Rem: Seule la deuxiĂšme ligne est obligatoire.
- mymodule/* contains php pages (note that you can also add any other subdir of your choice). Note: If your module is a metapackage (a module that will embed other modules in same zip, you must put here a file metapackage.conf)
- mymodule/build/ can contains any file you develop for compiling or building package
- mymodule/core/modules/ contains module descriptor file modMyModule.class.php
- mymodule/core/triggers contains triggers provided by module
- mymodule/admin/ contains pages to setup module
- mymodule/class/ contains PHP class files provided by module
- mymodule/css contains CSS files provided by module
- mymodule/js contains javascript files provided by module to add new functions
- mymodule/docs to provide doc and licence files
- mymodule/img contains images files provided by module
- mymodule/langs/xx_XX contains language files for language xx_XX (try to put at least en_US)
- mymodule/lib contains libraries provided and used by module
- mymodule/scripts to provide command line tools or scripts. Note: Command lines script must start with line #!/usr/bin/env php
- mymodule/sql contains SQL file provided by module to add new tables or indexes
- mymodule/theme/mytheme if module provide its own theme/skin
Un modÚle de module a été crée par un contributeur Dolibarr, il est accessible ici : [1]
Erstellen von SQL-Tabellen und einer PHP-DAO-Klasse (optional)
Wann: Wenn Ihr Modul eigene Daten verwalten muss.
Erstellen der .sql Datei
Wenn Ihr Modul fĂŒr die Verwaltung von Daten ausgelegt ist, welche in der Standardversion von Dolibarr nicht verfĂŒgbar sind, mĂŒssen Sie SQL-Tabellen zum Speichern der Daten definieren.
Skripte zum Erstellen von Tabellen und zum Laden von Daten, durch Ihr Modul, werden in einem Unterverzeichnis Namens "/ meinModul / sql" gespeichert. Gegebenenfalls muss der Unterordner noch erstellt werden.
Danach öffnen Sie die Deskriptordatei und prĂŒfen in der Funktion init, das die folgende Zeile nicht kommentiert ist.
$this->_load_tables('/mymodule/sql/');
Befolgen Sie folgende Regeln:
- FĂŒgen Sie die Dateien zum Erstellen von Tabellenbefehlen nach dem Prinzip der Datei llx_mymodule_myobject.sql fĂŒr jede Tabelle separat hinzu. FĂŒgen Sie noch gegenenfalls eine Datei nach dem Muster der Datei llx_mymodule_myobject.key.sql hinzu. (Beispiele finden Sie in den vorhandenen Dateinen in htdocs / modulebuilder / template / sql / ).
- Die empfohlenen Typen und Namen von SQL-Feldern werden auf folgender Seite definiert: Language_and_development_rules#Table_and_fields_structures.
- Um Daten zu verwalten, mĂŒssen Sie eine Datei mit dem Namen data.sql im Verzeichnis / meinModul / sql / erstellen, die den SQL-Befehl zum HinzufĂŒgen / Bearbeiten und Löschen von Daten enthĂ€lt.
- Verwenden Sie doppelte AnfĂŒhrungszeichen nicht fĂŒr Zeichenfolgen (z.B. 'Text', nicht "Text"), da doppelte AnfĂŒhrungszeichen in PostGreQSL eine bestimmte Bedeutung haben.
Beispiel fĂŒr den Inhalt der Datei data.sql
delete from llx_const where name='MONMODULE_IT_WORKS' and entity='__ENTITY__';
insert into llx_const (name, value, type, note, visible, entity) values ('MONMODULE_IT_WORKS','1','chaine','A constant for my module',1,'__ENTITY__');
Dateien mĂŒssen fĂŒr eine MySQL-Datenbank konzipiert sein.
Hinweis: Die Dateien anderer Datenbanken werden nicht gewartet. Sie werden vom Treiber der anderen Datenbank im laufenden Betrieb gelesen und konvertiert.
Test Ihrer .sql-Dateien
Sobald Sie die Dateien erstellt haben, können Sie zu Dolibarr zurĂŒckkehren, um das Modul zu deaktivieren. Danach löschen Sie die Tabellen aus der Datenbank und aktivieren das Modul erneut. Die Tabellen sollten durch die Aktivierung des Moduls neu erstellt werden. Ist dies nicht der Fall, dann ĂŒberprĂŒfen Sie Ihrer Skripte oder ĂŒberprĂŒfen Sie die Dolibarr-Protokolle.
Générer la classe PHP DAO d'accÚs aux tables
Une fois votre ou vos tables créées en base, aller dans le répertoire dev/skeletons, copiez le fichier build_class_from_table.php dans le répertoire sql/ de votre module, et lancez le script
php build_class_from_table.php nomtable
Remarque: Si la commande ne fonctionne pas, essayer d'utiliser php-cli plutot que php.
Ceci génÚrera un fichier out.nomtable.class.php qui contient la classe de gestion de la table nomtable. Dans cette classe, se trouve des méthodes CRUD (Create/Read/Update/Delete) déjà opérationnelles pour faire un insert, un fetch (select), un update, un delete d'une ligne de la table. Supprimer juste le "out" du nom de fichier et placer votre fichier dans le sous-répertoire de htdocs propre à votre module (Dans htdocs/monmodule par exemple).
Un fichier out.nomtable_script.php a également été généré et contient un exemple de code pour utiliser la classe pour chacune des 4 méthodes CRUD.
Affichage des onglets (optionnel)
Ajouter ou supprimer des onglets sur les fiches objets
Quand : Pour ajouter votre propre onglet parmi les onglets standard d'une fiche entité (facture, commande, proposition commercial, adhérent...)
Pour cela, aller dans le fichier descripteur de module précédemment créé et modifier le tableau $this->tabs:
// Array to add new pages in new tabs or remove existing one
$this->tabs = array('objecttype:+tabname1:Title1:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab1.php?id=__ID__' // To add a new tab identified by code tabname1
'objecttype:+tabname2:Title2:mylangfile@monmodule:$user->rights->monmodule->read:/monmodule/mapagetab2.php?id=__ID__', // To add a new tab identified by code tabname2
'objecttype:-tabname'); // To remove an existing tab identified by code tabname
Le tableau doit contenir une liste de chaßne, chaque chaßne représentant un nouvel onglet. Le format de la chaßne étant composé de 6 parties séparées par ":"
- Partie 1: Le type d'élément (objecttype) dans lequel doit apparaßtre l'onglet qui est une valeur parmi celle-ci:
Template:TemplateModuleTabs-de
- Partie 2: Nom de code pour l'onglet Ă ajouter (commence par +) ou Ă enlever (commence par -)
- Partie 3: Le titre de l'onglet. Cela peut ĂȘtre un libellĂ© en dur ou mieux un code traduction prĂ©sent dans un fichier lang.
- Partie 4: Le nom du fichier .lang (sans l'extension .lang) qui contient la correspondance entre le code traduction et le libellé à afficher. Si ce com est suivi de @monmodule, Dolibarr cherche le fichier dans le répertoire lang propre au module, c'est à dire htdocs/monmodule/langs/code_CODE/monmodule.lang, sinon Dolibarr cherche le fichier traduction dans htdocs/langs/code_CODE/mylangfile.lang
- Partie 5: Une condition Ă tester pour savoir si l'onglet doit ĂȘtre visible ou pas. Mettre '1' pour qu'il soit toujours visible.
- Partie 6: L'url de la page à afficher quand on clique sur l'onglet. La chaine __ID__ sera remplacée automatiquement par l'Id de l'entité concernée.
Pour que la déclaration soit effective, il faut désactiver et réactiver le module.
Pour alimenter le contenu de l'onglet avec des données issues de la base, voir le chapitre suivant.
Ajouter les onglets standard d'un objet sur sa propre page
Quand : Pour afficher les onglets standard d'une fiche entité (produit, tiers, etc.) sur votre propre page onglet d'une entité.
Il faut appliquer la procédure suivante :
1. Inclure les fichiers définissant les fonctions utiles dans vos fichiers
Pour chaque fiche entité, il y a deux fichiers à inclure avec l'instruction
require_once($url_fichier) ;
Voici quelques examples de fichiers Ă inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :
- Entité tiers (thirdparty) :
- DOL_DOCUMENT_ROOT/societe/class/societe.class.php
- DOL_DOCUMENT_ROOT/core/lib/company.lib.php
- Entité produit (product) :
- DOL_DOCUMENT_ROOT/product/class/product.class.php
- DOL_DOCUMENT_ROOT/core/lib/product.lib.php
- Entité facture (invoice) :
- DOL_DOCUMENT_ROOT/compta/facture/facture.class.php
- DOL_DOCUMENT_ROOT/core/lib/invoice.lib.php
2. Créer et charger l'objet à afficher dans votre onglet
Créer l'objet de la classe voulue, et récupérer les données de l'objet à partir de la base de données. Pour cela il faut utiliser les fonctions fetch() de la classe correspondante, en passant en paramÚtre l'identifiant de l'objet que vous récupérez depuis l'url (ex : /mononglet.php?id=1).
Exemple :
$id=GETPOST('id','int');
$ref=GETPOST('ref','alpha');
$product = new Product($db) ;
$result = $product->fetch($id, $ref) ; //Tester $result pour vérifier que l'accÚs à la base s'est bien passée
3. Récupérer la liste des onglets correspondants à l'entité choisie
Utiliser la fonction XXX_prepare_head($obj), ou XXX est le nom de l'entité, permettant de créer un tableau contenant les définitions des onglets à afficher. Le paramÚtre à passer est l'objet pour lequel vous voulez afficher les onglets.
Le tableau retourné est composé de la façon suivante :
$head // Tableau des onglets
$head[$h] // ĂlĂ©ment dĂ©crivant un onglet. Il y aura autant de $h que d'onglets Ă afficher
$head[$h][0] // Url de la page affichée quand on clique sur l'onglet
$head[$h][1] // Titre de lâonglet
$head[$h][2] // Code de l'onglet, Ă utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
Exemple :
$head = product_prepare_head($product, $user) ; //le paramÚtre $user n'est pas présent sur certaines fonctions
4. Afficher les onglets sur votre page onglet
Utiliser la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().
dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
//$links // Tableau des onglets, appelé $head plus haut.
//$active // Onglet actif (mettre le nom de l'onglet défini dans votre fichier de module, ou un nom contenu dans $head[$h][2]). Cet onglet sera mis en surbrillance
//$title // ?
//$notab // Mettre ce paramĂštre Ă 1 permet de ne pas afficher de zone bleue en dessous des onglets.
//$picto // Nom de l'image à utiliser au début de la barre des onglet. Les choix suivant sont possibles :
// product
// service
// company
Cette fonction affiche les onglets voulus et ouvre un élément < div class="" > qui correspond à la zone bleue sous les onglets (si paramÚtre $notab = 0). Pour fermer la zone bleue, il suffit de fermer l'élément < /div > dans le code PHP.
Remarque: Pour plus de détail, se référer à la documentation Doxygen ou directement au code de Dolibarr.
Créer vos pages écran PHP (optionnel)
Quand: Si l'objet de votre module est d'ajouter des fonctionnalités qui nécessitent de nouveaux écrans.
Créer une page écran PHP brute
Vous pouvez ensuite créer vos pages PHP, qui se basent sur les données de vos tables, en utilisant les squelettes fournis comme exemple dans le répertoire dev/skeletons (Pour le développement d'un script en ligne de commande, voir Développement de scripts).
Pour créer une nouvelle page écran utilisateur, créer un sous-répertoire de htdocs (si non déjà fait) propre à votre module (Dans htdocs/monmodule par exemple) afin d'y placer les pages que vous aller créer.
Y recopier le fichier skeleton_page.php qui va servir de point de départ. Modifier le fichier afin que le main.inc.php soit trouvés
// Load Dolibarr environment
$res=0;
// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined)
if (! $res && ! empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) $res=@include($_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php");
// Try main.inc.php into web root detected using web root caluclated from SCRIPT_FILENAME
$tmp=empty($_SERVER['SCRIPT_FILENAME'])?'':$_SERVER['SCRIPT_FILENAME'];$tmp2=realpath(__FILE__); $i=strlen($tmp)-1; $j=strlen($tmp2)-1;
while($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i]==$tmp2[$j]) { $i--; $j--; }
if (! $res && $i > 0 && file_exists(substr($tmp, 0, ($i+1))."/main.inc.php")) $res=@include(substr($tmp, 0, ($i+1))."/main.inc.php");
if (! $res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php")) $res=@include(dirname(substr($tmp, 0, ($i+1)))."/main.inc.php");
// Try main.inc.php using relative path
if (! $res && file_exists("../main.inc.php")) $res=@include("../main.inc.php");
if (! $res && file_exists("../../main.inc.php")) $res=@include("../../main.inc.php");
if (! $res && file_exists("../../../main.inc.php")) $res=@include("../../../main.inc.php");
if (! $res) die("Include of main fails");
Notez qu'il est possible que vous deviez ajouter plus de "../" dans les chemin, en fonction de la profondeur de vos fichiers par rapport au répertoire de votre module.
Pour tous les modules dĂ©veloppĂ©s aprĂšs la version 3.2 de Dolibarr, il convient de pouvoir placer un rĂ©pertoire de module soit dans htdocs soit dans un sous rĂ©pertoire comme htdocs/custom sans avoir Ă modifier le code source du module, c'est pour cela que cette rĂšgle doit obligatoirement ĂȘtre appliquĂ©e.
C'est dans le main qu'est chargé l'environnement technique ainsi que les habilitations. Les variables objets suivantes sont alors positionnées:
- $user L'objet qui contient les caractéristiques de l'utilisateur + ses droits.
- $conf L'objet qui contient la configuration de Dolibarr.
- $db L'objet qui contient le handler de connexion ouvert à la base de données.
- $langs L'objet qui contient la langue de l'utilisateur.
- L'inclusion d'une classe ou librairie dĂ©diĂ©e au module, sans savoir d'oĂč le fichier sera appelĂ©, se fait en utilisant une fonction de Dolibarr (et non en utilisant directement le include_once)
Exemple :
dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse');
- L'appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:
Exemple :
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
La raison est que si le dol_include_once est pratique car il scanne chaque rĂ©pertoire de chemin alternatifs pour trouver le fichier, il est aussi moins performant car gĂ©nĂšre des accĂšs et recherches disque Ă chaque appel (en effet, PHP intĂšgre un cache des fichiers lus mais n'intĂšgre pas un cache des fichiers "non trouvĂ©s". Et comme un fichier donnĂ© n'est que dans une seule arborescence, il y a toujours une arborescence alternative oĂč il ne se trouve pas et qui gĂ©nĂšre des accĂšs superflus au disque dur, pĂ©nalisant en terme de performance. Comme pour les fichiers internes Ă Dolibarr, on connait toujours le chemin exacte, le require_once avec ce chemin direct doit ĂȘtre prĂ©fĂ©rĂ©).
AccĂšs Ă la base
Si vous avez besoin de réaliser des modifications en base dans votre propre table ajoutée, utilisez la classe générée plus haut qui contient les méthodes pour cela.
Si toutefois vous voulez faire des accÚs dans des tables sans objet PHP dédié, ceci reste possible (par exemple pour récupérer une liste d'enregistrement). Dans ce cas, pensez à suivre ces exemples:
Pour un insert, update ou delete:
$db->begin(); // Debut transaction
$db->query("Ma requete insert, update ou delete");
$db->commit(); // Valide
ou $db->rollback() // Annule
Pour une lecture:
$resql=$db->query("Ma requete select");
if ($resql)
{
$num = $db->num_rows($resql);
$i = 0;
if ($num)
{
while ($i < $num)
{
$obj = $db->fetch_object($resql);
if ($obj)
{
// You can use here results
print $obj->field1;
print $obj->field2;
}
$i++;
}
}
}
DĂ©finition du style
Pour que le look de la page soit aligné avec le thÚme Dolibarr, il est nécessaire d'utiliser les styles des CSS de Dolibarr.
Par exemple:
- class="liste_titre" sur les balises tr et td pour une ligne de titre de tableau.
- class="pair" ou class="impair" sur les balises tr et td des lignes de données de tableau.
- class="flat" sur tous les champs de saisie (input, select, textarea...).
- class="button" sur les objets de type input type="submit".
Utiliser le sélecteur de date de Dolibarr
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:
$form=new Form($db);
$form->select_date('','mykey',0,0,0,"myform");
La chaine mykey identifie la zone date. Il faut y mettre une valeur diffĂ©rente s'il y a plusieurs zones. La chaine myform est le nom de la zone FORM (dans form name="myform" de la page HTML). L'affichage d'un sĂ©lecteur de date doit donc ĂȘtre intĂ©grĂ©e dans une zone FORM Html.
Pour récupérer la valeur, à l'issu du POST, la commande est:
$mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
print strftime('%A %d %B %Y', $mydate);
DĂ©finir votre page de configuration (optionnel)
Quand: Si votre module offre plusieurs options paramétrables.
Créer votre page d'édition de configuration
Si votre module offre plusieurs options paramétrables, il est nécessaire de créer une page PHP pour éditer les options (qui sont stockées dans la table llx_const). Créer une page PHP nommée monmodule_setupapage.php qui affiche les options possibles et les met à jour. Il est nécessaire de prendre exemple sur une page dans /admin qui vous montre la méthode pour lire ou sauvegarder en base votre option. Placer cette page de configuration dans le répertoire /admin également. Ensuite dans le descripteur de module, modifier la variable pour indiquer le nom de cette page PHP (sans le chemin qui n'est pas nécessaire, la page étant forcément dans le rep admin).
$this->config_page_url = array("monmodule_setupapage.php");
Tester votre page
Allez sur la page Configuration->module, vous devez voir apparaĂźtre une icĂŽne qui permet d'accĂ©der Ă la page de configuration et vous devez ĂȘtre capable de modifier ces options et les voir conservĂ©es en base.
Quand: Si vous avez créé des pages PHP, il est nécessaire que ces écrans soient accessibles depuis le menu Dolibarr.
Pour cela, il vous faut définir dans le fichier descripteur de module, le tableau this->menu qui déclare les menus. Ce tableau contient toutes les entrées qui apparaßtront dans les menus une fois le module activé. Le fichier de descripteur de module exemple modMonModule.class.php possÚde un exemple de déclaration de menu haut ainsi que de ses entrées menu gauche associées.
Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:
// Main menu entries
$this->menu = array(); // List of menus to add
$r=0;
// Add here entries to declare new menus
// Example to declare the Top Menu entry:
$this->menu[$r]=array( 'fk_menu'=>0, // Put 0 if this is a top menu
'type'=>'top', // This is a Top menu entry
'titre'=>'MonModule top menu',
'mainmenu'=>'monmodule',
'leftmenu'=>'monmodule',
'url'=>'/monmodule/pagetop.php',
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
'position'=>100,
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
'perms'=>'1', // Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
'target'=>'',
'user'=>2); // 0=Menu for internal users, 1=external users, 2=both
$r++;
// Example to declare a Left Menu entry:
$this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=xxx', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode of parent menu
'type'=>'left', // This is a Left menu entry
'titre'=>'MonModule left menu 1',
'mainmenu'=>'xxx',
'leftmenu'=>'yyy',
'url'=>'/monmodule/pagelevel1.php',
'langs'=>'mylangfile', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory.
'position'=>100,
'enabled'=>'1', // Define condition to show or hide menu entry. Use '$conf->monmodule->enabled' if entry must be visible if module is enabled.
'perms'=>'1', // Use 'perms'=>'$user->rights->monmodule->level1->level2' if you want your menu with a permission rules
'target'=>'',
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
$r++;
Pour conditionner l'accÚs au menu selon des permission, modifier la propriété perms du tableau. Voir le chapitre sur les permissions un peu plus loin pour savoir comment ajouter des permissions.
Désactiver et réactiver votre module sous Dolibarr, les entrées menus doivent alors apparaßtre (si la condition dans 'enabled' est vraie).
DĂ©finir vos propres permissions (optionnel)
Quand: Si vous voulez ajouter de nouvelles permissions.
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la premiÚre étape. Modifier la ligne
$this->rights_class = 'monmodule'
pour y mettre la bonne valeur de monmodule.
Ensuite remplissez le tableau $this->rights avec autant d'entrées que de permissions différentes à gérer.
$this->rights[$r][0] = 10001;
$this->rights[$r][1] = 'Libelle par défaut de ma permission';
$this->rights[$r][3] = 1;
$this->rights[$r][4] = 'action';
$this->rights[$r][5] = 'sousaction';
$r++;
Dans $this->rights[$r][0], mettre un id de permission non déjà pris (Voir dans le menu Infos SystÚme sur une installation de Dolibarr opérationnelle pour connaitre les id déjà utilisés. Dans $this->rights[$r][3], mettre 1 si cette permission est attribué d'office par défaut quand un utilisateur est créé. Dans $this->rights[$r][1], mettre un libellé par défaut (il sera affiché si aucune traduction n'est trouvé pour votre permission dans le fichier admin.lang). Dans $this->rights[$r][4] et $this->rights[$r][5], mettre une chaßne action et sousaction sans espaces. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante:
if ($user->rights->monmodule->action->sousaction) ...
DĂ©finir vos propres box (optionnel)
Quand: Si votre module amĂšne avec lui une ou plusieurs Boxes.
DĂ©finissez vos box
Pour cela, modifiez les tableaux $this->boxes du fichier descripteur de module. Il suffit d'ajouter 2 lignes par fichier box que vous allez créer dans le répertoire htdocs/monmodule/core/boxes
Exemple:
$this->boxes[0]['file']='mabox0.php@monmodule'
$this->boxes[0]['note']='Ma box 0'
...
$this->boxes[n]['file']='maboxn.php@monmodule'
$this->boxes[n]['note']='Ma box n'
Ensuite créer les fichiers htdocs/monmodule/core/boxes/mabox0.php, htdocs/monmodule/core/boxes/mabox1.php... en prenant exemple sur des box existantes (exemple dans le répertoire htdocs/core/boxes)
Tester la présence de vos box dans Dolibarr
Désactiver et réactiver le module.
Aller dans le menu Accueil - Configuration - Boite.
Vos box doivent apparaßtre dans la liste des box activables. Activer les puis aller sur la page d'accueil et vérifier qu'elles s'affichent correctement.
DĂ©finir vos propres exports (optionnel)
Quand: Si votre module amÚne avec lui des exports prédéfini de données (pour ces propres tables ou des tables déjà existante d'un autre module de Dolibarr).
DĂ©finissez l'export
Pour cela, décommenter et modifier les tableaux $this->export_xxx du votre fichier descripteur de module.
Tester votre export
Aller dans le menu outils -> export de Dolibarr. Votre export doit apparaitre dans la liste des exports prédéfinis disponible (si votre module est bien activé). Le choisir, vous devez alors voir les champs possible définis dans le tableau à l'étape précédente. Choisir quelques champs et tenter une génération du fichier export.
DĂ©finir vos styles CSS (optionnel)
Quand: Si dans vos écrans PHP, vous utiliser des classes de styles qui ne sont pas celle des thÚmes de Dolibarr (non recommandé).
Cette fonctionnalité est décrite mais pas encore opérationnel en 2.4
Créer et déclarer votre feuille de style
CrĂ©er un fichier de style css nommĂ© monmodule.css ou monmodule.css.php et le placer dans le rĂ©pertoire monmodule dans htdocs. Il ne peut y avoir qu'un fichier css propre Ă chaque module. Rappelons qu'il vaut mieux utiliser les styles dĂ©jĂ existant de Dolibarr (le fichier css utilisĂ© par Dolibarr Ă©tant le fichier themes/nomtheme/nomtheme.css.php). Ne crĂ©er un fichier css propre Ă votre module que si vous devez absolument gĂ©rer des styles non dĂ©jĂ existants. Une fois votre feuille de style prĂȘte, dĂ©clarer la dans votre fichier descripteur de module en modifiant la propriĂ©tĂ© $this->module_parts. La valeur Ă renseigner ici doit ĂȘtre le chemin relatif de l'URL de votre fichier css. Par exemple
$this->module_parts = array('css' => array('/monmodule/css/monmodule.css.php'));
Tester votre feuille de style
Désactiver et réactiver votre module.
Appelez la page d'accueil de Dolibarr. Afficher la source de la page HTML.
Vous devriez voir dans l'entĂȘte HTML, une ligne dĂ©clarant votre feuille de style.
DĂ©finir vos fonctions Javascript (optionnel)
Quand: Si dans vos Ă©crans PHP, vous utiliser des fonctions javascript non dispo en standard (fichier lib_head.js)
Si dans vos Ă©crans PHP, vous utilisez des fonctions javascript, il est nĂ©cessaire de faire en sorte que vos fonctions dĂ©clarĂ©es dans un fichier javascript htdocs/monmodule/js/monmodule.js soit chargĂ©es dans l'entĂȘte head html. Pour demander Ă Dolibarr qui gĂšre la gĂ©nĂ©ration de la section header d'inclure un de vos fichiers javascript, il est nĂ©cessaire de fournir en paramĂštre de la fonction llxHeader() appelĂ©e au dĂ©but de votre page, d'inclure le paramĂštre qui contient l'URL vers le js Ă inclure.
Exemple pour la page /htdocs/monmodule/mapage.php :
require('../main.inc.php');
$morejs=array("/monmodule/js/monmodule.js");
llxHeader('','Titre','','','','',$morejs,'',0,0);
DĂ©clencher du code sur un Ă©vĂšnement Dolibarr (optionnel)
Quand: Si vous voulez que des actions particuliÚres s'exécutent suite au déclenchement d'actions standards de Dolibarr (exemple: je veux mettre à jour une table de mon module quand une facture se crée dans Dolibarr), il vous faut créer un fichier de triggers.
Voir aussi Interfaces de Dolibarr vers l'exterieur et Interfaces exterieures vers Dolibarr
Insérer votre code aux emplacement hooks de Dolibarr (optionnel)
Quand: Quand vous voulez modifier ou ajouter du code autrement que lors d'un événement métier (voir le chapitre précédent pour cela).
Voir la page SystĂšme de Hooks.
Ajouter un module de numérotation (optionnel)
Quand: Lorsque vous voulez ajouter une rÚgle de numérotation non couverte par les modules par défaut.
Voir la page Créer un module de numérotation.
Ajouter un nouveau modĂšle de document (optionnel)
Quand: Lorsque vous voulez ajouter un nouveau modĂšle de document.
La documentation au sujet de la génération de documents depuis des modÚles est disponible sur la page Créer un modÚle de document PDF ou Créer un modÚle de document ODT.
Ajouter un thĂšme (optionnel)
Quand: Lorsque vous voulez une interface aux couleurs personnalisées à votre cas.
Voir la page Themes.
Quelques rÚgles de codage et fonctions pour développeurs
Les rÚgles de codage à suivre sont définis dans la Documentation développeur, rubrique "Informations Générales - Langage et normes de développement".
De nombreuses fonctions prédéfinies pour les développeurs sont disponibles et décrites sur la page Documentation développeur sous la section "Les couches techniques de Dolibarr".
Créer un package pour livrer et installer votre module
Cette procĂ©dure doit ĂȘtre utilisĂ© pour fabriquer un package afin de le soumettre sur la place de marchĂ© http://www.dolistore.com. Mais vous pouvez aussi l'utiliser pour distribuer facillement votre module via votre propre rĂ©seau de distribution.
- Aller dans le rĂ©pertoire /build et recopier le fichier makepack-dolibarrmodules.conf en makepack-monmodule.conf. Attention, ce rĂ©pertoire peut ne pas ĂȘtre fourni dans les packages de versions stables. Si c'est le cas, il peut ĂȘtre rĂ©cupĂ©rĂ© dans le snapshot disponible en tĂ©lĂ©chargement sur le site web Dolibarr dans la rubrique Version de dĂ©veloppement (prendre dans ce cas tout le rĂ©pertoire build qui est un rĂ©pertoire autonome et indĂ©pendant de la version).
Saisissez dans ce fichier la liste des noms des nouveaux fichiers que vous avez créé pour votre module (descripteur de module, nouveaux fichiers sql de tables, page php, images, etc...)
- Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
perl makepack-dolibarrmodule.pl
Le script vous demande le nom de votre module, sa version majeure et mineure. Un fichier monmodule.zip va alors ĂȘtre fabriquĂ© contenant votre module prĂȘt pour ĂȘtre dĂ©ployĂ©.
- La personne qui reçoit votre module doit alors placer le fichier dans son répertoire racine d'installation de Dolibarr et réaliser la commande:
tar -xvf monmodule.zip
- Si vous désirez que votre module profite à tous, vous pouvez le soumettre (le fichier zip) sur la place de marché des modules complémentaires: DoliStore.com (vous devez avoir créer un compte auparavant et utiliser le lien "Soumettre un module/produit").
- Si votre module a été fabriqué correctement, le fichier sera validé rapidement.
- Si la qualitĂ© est suffisante, que la licence le permet et que la fonctionnalitĂ© du module s'avĂšre ĂȘtre d'un intĂ©rĂȘt gĂ©nĂ©ral, le code pourra ĂȘtre ajoutĂ© au code source de Dolibarr (sauf si vous ne le dĂ©sirez pas).