Line 7:
Line 7:
[[es:Desarrollo_de_un_módulo]]
[[es:Desarrollo_de_un_módulo]]
[[zh:模块开发]]
[[zh:模块开发]]
+
[[ja:モジュール_開発]]
<!-- END interlang links -->
<!-- END interlang links -->
Line 14:
Line 15:
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:
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:
−
*Hinzufügen neuer Basistabellen
+
*Neue Tabellen in die Datenbank einfügen.
−
*Einfügen eigener Menüeinträge
+
*Einfügen Ihre eigenen Menüeinträge
*Hinzufügen eigener Bildschirmmasken für die Eingabe/Ausgabe von neuen Tabellen
*Hinzufügen eigener Bildschirmmasken für die Eingabe/Ausgabe von neuen Tabellen
−
*Einfügen eines Karteireiter in Objektansichten bzw. Seiten (Rechnung, Produkte, Bestellung, Termine, ...)
+
*Registerkarten auf den Seiten für die Objektansicht und Bearbeitung (Rechnung, Produkt, Bestellung, Termine, ...)
*Einfügen eines Datenexport vordefiniert für die Exportfunktion
*Einfügen eines Datenexport vordefiniert für die Exportfunktion
−
*Ergänzen von neuen Boxen für die Startseite
+
*Neue Boxen/Widgets für die Startseite hinzufügen.
*Substitutionsvariablen hinzufügen
*Substitutionsvariablen hinzufügen
−
*Definieren von neuen Berechtigungen
+
*Neue Berechtigungen festlegen
−
*Triggercode für eine automatisierte Dolibarr-Aktion
+
*Triggercode bei einer bestimmten Dolibarr-Aktion auslösen
*Eigenen Code an den Dolibarr-Hooks einhängen
*Eigenen Code an den Dolibarr-Hooks einhängen
*Einfügen von eigenen Nummerierungsmodulen
*Einfügen von eigenen Nummerierungsmodulen
*Hinzufügen einer Dokumentvorlage
*Hinzufügen einer Dokumentvorlage
−
*Hinzufügen eigener Themen
+
*Hinzufügen eigenes Designs/Themevorlage
etc...
etc...
+
In den folgenden Kapiteln erfahren Sie, wie Sie all dies auf einfache Weise manuell umsetzen können.
+
***
−
In den folgenden Kapiteln erfahren Sie, wie Sie dies, auf eine einfache Weise, selbst erledigen können.
+
=[[File:Art.png]] 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".
+
+
[[File:Mod_builder_2.png|400px]]
+
+
*Dann klicken Sie auf das "Bug"-Symbol, das in der Menüleiste oben rechts erschienen ist.
+
+
[[File:Mod_builder_3.png|400px]]
+
+
=[[File:Art.png]] Beispiel für eine Vorlage für ein externes Modul=
+
Eine gute modèle/squelette für ein Dolibarr-Plugin gibt es hier: [https://github.com/Dolibarr/dolibarr/tree/develop/htdocs/modulebuilder/template GitHub Dolibarr Module Modèle]
+
+
=[[File:Art.png]] 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.
+
+
[[File:Mod_builder_3.png|400px]]
+
+
*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.
+
+
[[File:Mod_builder_4.png|400px]]
+
+
*Ein Modul mit seinen ersten Dateien wurde initialisiert. Sie können nun die Einstellungen des Moduldeskriptors ändern:
+
+
[[File:Mod_builder_5.png|400px]]
+
+
===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 mod'''MyModule'''.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 '<nowiki/>'''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: [[List of modules id|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.
+
+
***
=[[File:Art.png]] Beispielvorlage für ein Modul/Pluginodule=
=[[File:Art.png]] Beispielvorlage für ein Modul/Pluginodule=
Line 83:
Line 135:
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.
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.
−
Ensuite, vérifiez dans votre fichier descripteur de module, dans la fonction '''init''' que la ligne
+
Danach öffnen Sie die Deskriptordatei und prüfen in der Funktion '''init''', das die folgende Zeile '''nicht''' kommentiert ist.
−
<source lang="php">$this->_load_tables('/mymodule/sql/');</source>
+
<syntaxhighlight lang="php">$this->_load_tables('/mymodule/sql/');</syntaxhighlight>
−
n'est pas commentée.
+
''Befolgen Sie folgende Regeln:''
−
''Règles à respecter:''
+
*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.
−
*Ajouter les fichiers d'ordre de création de vos tables sur le principe d'un fichier '''llx_matable.sql''' par table accompagné éventuellement du fichier '''llx_matable.key.sql''' (voir les fichiers existants dans '''install/mysql/tables''' pour exemple).
+
Beispiel für den Inhalt der Datei '''data.sql'''
−
*The recommended type and name for SQL fields are defined into page [[Language_and_development_rules#Table_and_fields_structures]].
+
<syntaxhighlight lang="sql">
−
*Pour ce qui est des commandes pour ajouter/manipuler des données, elles doivent toutes se trouver dans un fichier nommé '''data.sql''' situé dans le même répertoire '''/monmodule/sql/'''.
−
−
Exemple de contenu de fichier data.sql
−
<source lang="sql">
delete from llx_const where name='MONMODULE_IT_WORKS' and entity='__ENTITY__';
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__');
insert into llx_const (name, value, type, note, visible, entity) values ('MONMODULE_IT_WORKS','1','chaine','A constant for my module',1,'__ENTITY__');
−
</source>
+
</syntaxhighlight>
−
Les ordres SQL des fichiers doivent être opérationnels pour la base de données '''mysql'''.
+
Dateien müssen für eine MySQL-Datenbank konzipiert sein.
−
Rem: Les fichiers des autres bases ne sont pas à maintenir. Ils sont lus et convertit à la volée par le driver de la base de données.
−
===Tester vos fichier .sql===
+
Hinweis: Die Dateien anderer Datenbanken werden nicht gewartet. Sie werden vom Treiber der anderen Datenbank im laufenden Betrieb gelesen und konvertiert.
−
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.
+
===Test Ihrer .sql-Dateien===
−
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.
+
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===
===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
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
−
<source lang="bash">php build_class_from_table.php nomtable</source>
+
<syntaxhighlight lang="bash">php build_class_from_table.php nomtable</syntaxhighlight>
Remarque: Si la commande ne fonctionne pas, essayer d'utiliser php-cli plutot que php.
Remarque: Si la commande ne fonctionne pas, essayer d'utiliser php-cli plutot que php.
Line 128:
Line 178:
Pour cela, aller dans le fichier descripteur de module précédemment créé et modifier le tableau $this->tabs:
Pour cela, aller dans le fichier descripteur de module précédemment créé et modifier le tableau $this->tabs:
−
<source lang="php">
+
<syntaxhighlight lang="php">
// Array to add new pages in new tabs or remove existing one
// 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
$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:+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
'objecttype:-tabname'); // To remove an existing tab identified by code tabname
−
</source>
+
</syntaxhighlight>
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.
Le tableau doit contenir une liste de chaîne, chaque chaîne représentant un nouvel onglet.
Line 159:
Line 209:
Pour chaque fiche entité, il y a deux fichiers à inclure avec l'instruction
Pour chaque fiche entité, il y a deux fichiers à inclure avec l'instruction
−
<source lang="php">require_once($url_fichier) ;</source>
+
<syntaxhighlight lang="php">require_once($url_fichier) ;</syntaxhighlight>
Voici quelques examples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :
Voici quelques examples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) :
Line 178:
Line 228:
''Exemple :''
''Exemple :''
−
<source lang="php">
+
<syntaxhighlight lang="php">
$id=GETPOST('id','int');
$id=GETPOST('id','int');
$ref=GETPOST('ref','alpha');
$ref=GETPOST('ref','alpha');
$product = new Product($db) ;
$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
$result = $product->fetch($id, $ref) ; //Tester $result pour vérifier que l'accès à la base s'est bien passée
−
</source>
+
</syntaxhighlight>
'''3. Récupérer la liste des onglets correspondants à l'entité choisie'''
'''3. Récupérer la liste des onglets correspondants à l'entité choisie'''
Line 190:
Line 240:
Le tableau retourné est composé de la façon suivante :
Le tableau retourné est composé de la façon suivante :
−
<source lang="php">
+
<syntaxhighlight lang="php">
$head // Tableau des onglets
$head // Tableau des onglets
$head[$h] // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
$head[$h] // Élément décrivant un onglet. Il y aura autant de $h que d'onglets à afficher
Line 196:
Line 246:
$head[$h][1] // Titre de 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)
$head[$h][2] // Code de l'onglet, à utiliser pour choisir quel onglet sera 'actif' (voir paragraphe suivant)
−
</source>
+
</syntaxhighlight>
''Exemple :''
''Exemple :''
−
<source lang="php">
+
<syntaxhighlight lang="php">
$head = product_prepare_head($product, $user) ; //le paramètre $user n'est pas présent sur certaines fonctions
$head = product_prepare_head($product, $user) ; //le paramètre $user n'est pas présent sur certaines fonctions
−
</source>
+
</syntaxhighlight>
'''4. Afficher les onglets sur votre page onglet'''
'''4. Afficher les onglets sur votre page onglet'''
Line 207:
Line 257:
Utiliser la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().
Utiliser la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head().
−
<source lang="php">
+
<syntaxhighlight lang="php">
dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
dol_fiche_head($links, $active='0', $title='', $notab=0, $picto='')
//$links // Tableau des onglets, appelé $head plus haut.
//$links // Tableau des onglets, appelé $head plus haut.
Line 217:
Line 267:
// service
// service
// company
// company
−
</source>
+
</syntaxhighlight>
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.
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.
Line 234:
Line 284:
Y recopier le fichier '''skeleton_page.php''' qui va servir de point de départ.
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
Modifier le fichier afin que le main.inc.php soit trouvés
−
<source lang="php">
+
<syntaxhighlight lang="php">
// Load Dolibarr environment
// Load Dolibarr environment
$res=0;
$res=0;
Line 249:
Line 299:
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");
if (! $res) die("Include of main fails");
−
</source>
+
</syntaxhighlight>
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.
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.
Line 264:
Line 314:
''Exemple :''
''Exemple :''
−
<source lang="php">
+
<syntaxhighlight lang="php">
dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse');
dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse');
−
</source>
+
</syntaxhighlight>
*L'appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:
*L'appel des classes fournies en standard avec Dolibarr se fera par contre par le require_once directe avec la syntaxe suivante:
''Exemple :''
''Exemple :''
−
<source lang="php">
+
<syntaxhighlight lang="php">
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php';
−
</source>
+
</syntaxhighlight>
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é).
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é).
−
−
===Remplacer les parties d'écrans templatés (version 3.3+)===
−
Certaines portion d'écran de Dolibarr sont isolés 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 288:
Line 333:
Pour un insert, update ou delete:
Pour un insert, update ou delete:
−
<source lang="php">
+
<syntaxhighlight lang="php">
$db->begin(); // Debut transaction
$db->begin(); // Debut transaction
$db->query("Ma requete insert, update ou delete");
$db->query("Ma requete insert, update ou delete");
$db->commit(); // Valide
$db->commit(); // Valide
ou $db->rollback() // Annule
ou $db->rollback() // Annule
−
</source>
+
</syntaxhighlight>
Pour une lecture:
Pour une lecture:
−
<source lang="php">
+
<syntaxhighlight lang="php">
$resql=$db->query("Ma requete select");
$resql=$db->query("Ma requete select");
if ($resql)
if ($resql)
Line 318:
Line 363:
}
}
}
}
−
</source>
+
</syntaxhighlight>
===Définition du style===
===Définition du style===
Line 333:
Line 378:
===Utiliser le sélecteur de date de Dolibarr===
===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:
Si vous le désirez, vous pouvez profiter du sélecteur de date dans des écrans Dolibarr. Pour cela, utilisez la ligne suivante:
−
<source lang="php">
+
<syntaxhighlight lang="php">
$form=new Form($db);
$form=new Form($db);
$form->select_date('','mykey',0,0,0,"myform");
$form->select_date('','mykey',0,0,0,"myform");
−
</source>
+
</syntaxhighlight>
La chaine mykey identifie la zone date. Il faut y mettre une valeur différente s'il y a plusieurs zones.
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).
La chaine myform est le nom de la zone FORM (dans form name="myform" de la page HTML).
Line 342:
Line 387:
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">
+
<syntaxhighlight lang="php">
$mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
$mydate = dol_mktime(12, 0 , 0, $_POST['mykeymonth'], $_POST['mykeyday'], $_POST['mykeyyear']);
print strftime('%A %d %B %Y', $mydate);
print strftime('%A %d %B %Y', $mydate);
−
</source>
+
</syntaxhighlight>
==Définir votre page de configuration (optionnel)==
==Définir votre page de configuration (optionnel)==
Line 356:
Line 401:
Placer cette page de configuration dans le répertoire '''/admin''' également.
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).
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).
−
<source lang="php">
+
<syntaxhighlight lang="php">
$this->config_page_url = array("monmodule_setupapage.php");
$this->config_page_url = array("monmodule_setupapage.php");
−
</source>
+
</syntaxhighlight>
===Tester votre page===
===Tester votre page===
Line 372:
Line 417:
Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:
Voici un exemple de déclaration d'entrées de menu dans le fichier descripteur:
−
<source lang="php">
+
<syntaxhighlight lang="php">
// Main menu entries
// Main menu entries
$this->menu = array(); // List of menus to add
$this->menu = array(); // List of menus to add
Line 407:
Line 452:
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
'user'=>2); // 0=Menu for internal users,1=external users, 2=both
$r++;
$r++;
−
</source>
+
</syntaxhighlight>
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.
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.
Line 419:
Line 464:
La définition des permissions que gérera votre module se fait dans le fichier descripteur créé dans la première étape.
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
Modifier la ligne
−
<source lang="php">
+
<syntaxhighlight lang="php">
$this->rights_class = 'monmodule'
$this->rights_class = 'monmodule'
−
</source>
+
</syntaxhighlight>
pour y mettre la bonne valeur de 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.
Ensuite remplissez le tableau $this->rights avec autant d'entrées que de permissions différentes à gérer.
−
<source lang="php">
+
<syntaxhighlight lang="php">
$this->rights[$r][0] = 10001;
$this->rights[$r][0] = 10001;
$this->rights[$r][1] = 'Libelle par défaut de ma permission';
$this->rights[$r][1] = 'Libelle par défaut de ma permission';
Line 433:
Line 478:
$this->rights[$r][5] = 'sousaction';
$this->rights[$r][5] = 'sousaction';
$r++;
$r++;
−
</source>
+
</syntaxhighlight>
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][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.
Line 440:
Line 485:
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:
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:
−
<source lang="php">
+
<syntaxhighlight lang="php">
if ($user->rights->monmodule->action->sousaction) ...
if ($user->rights->monmodule->action->sousaction) ...
−
</source>
+
</syntaxhighlight>
==Définir vos propres box (optionnel)==
==Définir vos propres box (optionnel)==
Line 452:
Line 497:
''Exemple:''
''Exemple:''
−
<source lang="php">
+
<syntaxhighlight lang="php">
$this->boxes[0]['file']='mabox0.php@monmodule'
$this->boxes[0]['file']='mabox0.php@monmodule'
$this->boxes[0]['note']='Ma box 0'
$this->boxes[0]['note']='Ma box 0'
Line 458:
Line 503:
$this->boxes[n]['file']='maboxn.php@monmodule'
$this->boxes[n]['file']='maboxn.php@monmodule'
$this->boxes[n]['note']='Ma box n'
$this->boxes[n]['note']='Ma box n'
−
</source>
+
</syntaxhighlight>
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''')
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''')
Line 491:
Line 536:
La valeur à renseigner ici doit être le chemin relatif de l'URL de votre fichier css.
La valeur à renseigner ici doit être le chemin relatif de l'URL de votre fichier css.
Par exemple
Par exemple
−
<source lang="php">
+
<syntaxhighlight lang="php">
$this->module_parts = array('css' => array('/monmodule/css/monmodule.css.php'));
$this->module_parts = array('css' => array('/monmodule/css/monmodule.css.php'));
−
</source>
+
</syntaxhighlight>
===Tester votre feuille de style===
===Tester votre feuille de style===
Line 509:
Line 554:
Exemple pour la page /htdocs/monmodule/mapage.php :
Exemple pour la page /htdocs/monmodule/mapage.php :
−
<source lang="php">
+
<syntaxhighlight lang="php">
require('../main.inc.php');
require('../main.inc.php');
$morejs=array("/monmodule/js/monmodule.js");
$morejs=array("/monmodule/js/monmodule.js");
llxHeader('','Titre','','','','',$morejs,'',0,0);
llxHeader('','Titre','','','','',$morejs,'',0,0);
−
</source>
+
</syntaxhighlight>
==Déclencher du code sur un évènement Dolibarr (optionnel)==
==Déclencher du code sur un évènement Dolibarr (optionnel)==
Line 556:
Line 601:
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
*Lancer le script via Perl (besoin de la version Perl 5.0 ou +):
−
<source lang="bash">
+
<syntaxhighlight lang="bash">
perl makepack-dolibarrmodule.pl
perl makepack-dolibarrmodule.pl
−
</source>
+
</syntaxhighlight>
Le script vous demande le nom de votre module, sa version majeure et mineure.
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é.
Un fichier '''monmodule.zip''' va alors être fabriqué contenant votre module prêt pour être déployé.
Line 564:
Line 609:
*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:
*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:
−
<source lang="bash">
+
<syntaxhighlight lang="bash">
tar -xvf monmodule.zip
tar -xvf monmodule.zip
−
</source>
+
</syntaxhighlight>
*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: {{LinkToPluginDownload}} (vous devez avoir créer un compte auparavant et utiliser le lien "Soumettre un module/produit").
*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: {{LinkToPluginDownload}} (vous devez avoir créer un compte auparavant et utiliser le lien "Soumettre un module/produit").