31,003
edits
m (ajout d'un lien vers la page du fichier de conf pour mettre en avant la variable $dolibarr_allow_download_external_modules) |
mNo edit summary Tag: 2017 source edit |
||
| Line 108: | Line 108: | ||
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 | ||
< | <syntaxhighlight ce lang="php">$this->_load_tables('/mymodule/sql/');</syntaxhighlight> | ||
n'est pas commentée. | n'est pas commentée. | ||
| Line 120: | Line 120: | ||
Exemple de contenu de fichier data.sql | Exemple de contenu de fichier data.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__'); | ||
</ | </syntaxhighlight> | ||
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'''. | ||
| Line 148: | Line 148: | ||
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: | ||
< | <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 | ||
</ | </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 179: | Line 179: | ||
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 | ||
< | <syntaxhighlight lang="PHP">require_once($url_fichier) ;</syntaxhighlight> | ||
Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) : | Voici quelques exemples de fichiers à inclure (DOL_DOCUMENT_ROOT correspond au dossier dolibarr/htdocs/) : | ||
| Line 198: | Line 198: | ||
''Exemple :'' | ''Exemple :'' | ||
< | <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 | ||
</ | </syntaxhighlight> | ||
'''3. Récupérer la liste des onglets correspondant à l'entité choisie''' | '''3. Récupérer la liste des onglets correspondant à l'entité choisie''' | ||
| Line 210: | Line 210: | ||
Le tableau retourné est composé de la façon suivante : | Le tableau retourné est composé de la façon suivante : | ||
< | <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 216: | Line 216: | ||
$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) | ||
</ | </syntaxhighlight> | ||
''Exemple :'' | ''Exemple :'' | ||
< | <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 | ||
</ | </syntaxhighlight> | ||
'''4. Afficher les onglets sur votre page onglet''' | '''4. Afficher les onglets sur votre page onglet''' | ||
| Line 227: | Line 227: | ||
Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head(). | Utilisez la fonction dol_fiche_head() qui affiche les onglets contenus dans le tableau $head retourné par XX_prepare_head(). | ||
< | <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 237: | Line 237: | ||
// service | // service | ||
// company | // company | ||
</ | </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 254: | Line 254: | ||
Y recopier le fichier '''myobject_page.php''' qui va servir de point de départ. | Y recopier le fichier '''myobject_page.php''' qui va servir de point de départ. | ||
Modifiez le fichier afin que le main.inc.php soit trouvé | Modifiez le fichier afin que le main.inc.php soit trouvé | ||
< | <syntaxhighlight lang="PHP"> | ||
// Load Dolibarr environment | // Load Dolibarr environment | ||
$res=0; | $res=0; | ||
| Line 269: | Line 269: | ||
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"); | ||
</ | </syntaxhighlight> | ||
Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire "custom". Mais vous pouvez avoir à gérer plus de situations. L'exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations. | Comme vous pouvez le constater, plusieurs tentatives de chargement du fichier main.inc.php (ou master.inc.php) ont été tentées. Le but est de réussir dans le plus grand nombre de cas possibles. Le minimum est de 2 lignes: une pour essayer de charger le fichier master / main.inc.php dans le répertoire racine de dolibarr et une autre pour essayer de charger le fichier afin de prendre en charge le cas où le module est déployé dans le répertoire "custom". Mais vous pouvez avoir à gérer plus de situations. L'exemple fourni devrait pouvoir charger le fichier main / master.inc.php dans presque toutes les situations / configurations. | ||
| Line 284: | Line 284: | ||
''Exemple :'' | ''Exemple :'' | ||
< | <syntaxhighlight lang="PHP"> | ||
dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse'); | dol_include_once('/monmodule/class/maclasse.class.php', 'MaClasse'); | ||
</ | </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 :'' | ||
< | <syntaxhighlight lang="PHP"> | ||
require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php'; | require_once DOL_DOCUMENT_ROOT.'/core/class/doli.class.php'; | ||
</ | </syntaxhighlight> | ||
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é). | ||
| Line 303: | Line 303: | ||
Pour un insert, update ou delete : | Pour un insert, update ou delete : | ||
< | <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 | ||
</ | </syntaxhighlight> | ||
Pour une lecture : | Pour une lecture : | ||
< | <syntaxhighlight lang="PHP"> | ||
$resql=$db->query("Ma requete select"); | $resql=$db->query("Ma requete select"); | ||
if ($resql) | if ($resql) | ||
| Line 333: | Line 333: | ||
} | } | ||
} | } | ||
</ | </syntaxhighlight> | ||
===Définition du style=== | ===Définition du style=== | ||
| Line 348: | Line 348: | ||
===Utilisez le sélecteur de date de Dolibarr=== | ===Utilisez 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: | ||
< | <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"); | ||
</ | </syntaxhighlight> | ||
La chaîne mykey identifie la zone date. Il faut y mettre une valeur différente s'il y a plusieurs zones. | La chaîne 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 357: | Line 357: | ||
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: | ||
< | <syntaxhighlight lang="PHP"> | ||
$mydate = dol_mktime(12, 0 , 0, GETPOST('mykeymonth', 'int'), GETPOST('mykeyday', 'int'), GETPOST('mykeyyear', 'int')); | $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); | ||
</ | </syntaxhighlight> | ||
==Définir votre page de configuration (optionnel)== | ==Définir votre page de configuration (optionnel)== | ||
| Line 371: | Line 371: | ||
Placez cette page de configuration dans le répertoire '''/admin''' également. | Placez cette page de configuration dans le répertoire '''/admin''' également. | ||
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). | ||
< | <syntaxhighlight lang="PHP"> | ||
$this->config_page_url = array("setup.php@mymodule"); | $this->config_page_url = array("setup.php@mymodule"); | ||
</ | </syntaxhighlight> | ||
===Testez votre page=== | ===Testez votre page=== | ||
| Line 387: | Line 387: | ||
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: | ||
< | <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 422: | Line 422: | ||
'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++; | ||
</ | </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 434: | Line 434: | ||
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 | ||
< | <syntaxhighlight lang="PHP"> | ||
$this->rights_class = 'monmodule' | $this->rights_class = 'monmodule' | ||
</ | </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. | ||
< | <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 448: | Line 448: | ||
$this->rights[$r][5] = 'sousaction'; | $this->rights[$r][5] = 'sousaction'; | ||
$r++; | $r++; | ||
</ | </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 connaître 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 connaître les id déjà utilisés. | ||
| Line 455: | Line 455: | ||
Dans $this->rights[$r][4] et $this->rights[$r][5], mettre une chaîne action et sous action sans espace. 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 sous action sans espace. Vous pourrez alors tester dans le code PHP si un utilisateurs a bien les droits par la séquence suivante : | ||
< | <syntaxhighlight lang="PHP"> | ||
if ($user->rights->monmodule->action->sousaction) ... | if ($user->rights->monmodule->action->sousaction) ... | ||
</ | </syntaxhighlight> | ||
==Définir vos propres box/widgets (optionnel)== | ==Définir vos propres box/widgets (optionnel)== | ||
| Line 467: | Line 467: | ||
''Exemple :'' | ''Exemple :'' | ||
< | <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 473: | Line 473: | ||
$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' | ||
</ | </syntaxhighlight> | ||
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''') | 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''') | ||
| Line 506: | Line 506: | ||
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 | ||
< | <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')); | ||
</ | </sosyntaxhighlightrce> | ||
===Testez votre feuille de style=== | ===Testez votre feuille de style=== | ||
| Line 524: | Line 524: | ||
Exemple pour la page /htdocs/monmodule/mapage.php : | Exemple pour la page /htdocs/monmodule/mapage.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); | ||
</ | </syntaxhighlight> | ||
==Déclencher du code sur un évènement Dolibarr (optionnel)== | ==Déclencher du code sur un évènement Dolibarr (optionnel)== | ||
| Line 576: | Line 576: | ||
*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 +): | ||
< | <syntaxhighlight lang="bash"> | ||
perl makepack-dolibarrmodule.pl | perl makepack-dolibarrmodule.pl | ||
</ | </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 584: | Line 584: | ||
*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 : | ||
< | <syntaxhighlight lang="bash"> | ||
tar -xvf monmodule.zip | tar -xvf monmodule.zip | ||
</ | </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éé 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éé un compte auparavant et utiliser le lien "Soumettre un module/produit"). | ||