Line 85:
Line 85:
Danach öffnen Sie die Deskriptordatei und prüfen in der Funktion '''init''', das die folgende Zeile '''nicht''' kommentiert ist.
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>
''Befolgen Sie folgende Regeln:''
''Befolgen Sie folgende Regeln:''
Line 95:
Line 95:
Beispiel für den Inhalt der Datei '''data.sql'''
Beispiel für den Inhalt der Datei '''data.sql'''
−
<source lang="sql">
+
<syntaxhighlight 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>
Dateien müssen für eine MySQL-Datenbank konzipiert sein.
Dateien müssen für eine MySQL-Datenbank konzipiert sein.
Line 111:
Line 111:
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 126:
Line 126:
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 157:
Line 157:
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 176:
Line 176:
''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 188:
Line 188:
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 194:
Line 194:
$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 205:
Line 205:
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 215:
Line 215:
// 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 232:
Line 232:
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 247:
Line 247:
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 262:
Line 262:
''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é).
Line 286:
Line 286:
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 316:
Line 316:
}
}
}
}
−
</source>
+
</syntaxhighlight>
===Définition du style===
===Définition du style===
Line 331:
Line 331:
===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 340:
Line 340:
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 354:
Line 354:
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 370:
Line 370:
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 405:
Line 405:
'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 417:
Line 417:
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 431:
Line 431:
$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 438:
Line 438:
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 450:
Line 450:
''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 456:
Line 456:
$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 489:
Line 489:
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 507:
Line 507:
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 554:
Line 554:
*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 562:
Line 562:
*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").