Système de menus
Il y a dans Dolibarr 2 systèmes de menu. Celui du haut et celui de gauche qui peuvent être dépendant l'un de l'autre ou non (on peut donc facilement imaginer un gestionnaire de menu haut qui gèrerait tout avec des entrées de sous-menus par listes déroulantes et rien dans le menu gauche). Pour la suite, on appellera ces 2 systèmes: "menu gauche" et "menu haut".
Il est possible de développer votre propre gestionnaire de menu (gauche et/ou haut), qui remplacera complètement le menu par défaut. Vous décidez comment stocker votre menu (en base de données comme avec le gestionnaire de menu auguria, centralisé en dur dans un fichier comme avec le gestionnaire de menu eldy, dans un fichier xml, ...). Comme vous pouvez le voir, vous pouvez offrir un gestionnaire de menu avec le comportement dont vous avez besoin et la technologie que vous désirez..
Changer de système de menu est possible via la page Configuration - Interface. Prendre par exemple les gestionnaires de menu "eldybackoffice", fournis en standard (Activer le gestionnaire du menu gauche eldybackoffice en même temps que le gestionnaire du menu haut eldybackoffice, les 2 étant conçus pour fonctionner ensemble). Ces gestionnaires de menu (gauche et haut) sont complètement opérationnels et offrent diverses alternatives de menu.
Et si cela ne vous convient toujours pas, rien ne vous empêche de développer le vôtre. Voir paragraphe suivant...
Le but de cet article est de décrire comment créer un nouveau système de menu dans son intégralité (remplacement de l'intégralité des entrées menus, chamboulement complet du concept de navigation).
Cela ne concerne pas le simple ajout d'entrées de menus. Si tel et le cas et que vous désirez juste savoir comment ajouter des entrées menus au sein d'un gestionnaire de menu existant, dans le cadre du développement d'une extension ou d'un nouveau module par exemple, reporter vous plutôt à la page Developpement module.
Si vous voulez remplacer intégralement un systeme de menu par le votre, le plus simple est de prendre exemple sur le gestionnaire de menu "eldy_backoffice".
Il suffit de
- Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php
- Editer ensuite le fichier monmenu.php. La fonction showmenu() de la classe MenuTop est la fonction appelée par Dolibarr lorsqu'il génère une page pour afficher ce menu haut. On peut y mettre le code que l'on veut, cette fonction ne modifie aucune variable extérieur et doit juste afficher par des "print" le menu que l'on veut voir. On peut ainsi récupérer le menu à afficher depuis un fichier de configuration, une base de donnée et le personnaliser par rapport à l'environnement. L'environnement Dolibarr étant stocké dans les 3 objets global suivant: $user, $conf, $langs.
$user contient les informations propres à l'utilisateur. $conf contient les informations propres à la configuration (modules actifs, permissions actives, etc...) $langs contient les informations propres à la langue active.
Exemple de fonction showmenu() du fichier htdocs/core/menus/standard/monmenu.php
function showmenu()
{
global $user,$conf,$langs,$dolibarr_main_db_name;
print '<table class="tmenu"><tr class="tmenu">';
// Menu Home
print '<td class="tmenu"><a '.$class.' href="'.DOL_URL_ROOT.'/index.php?mainmenu=home&leftmenu="'.($this->atarget?" target=".$this->atarget:"").'>'.$langs->trans("Home").'</a></td>';
// Put here other entries
// ...
print '</tr></table>';
}
Le principe est aussi simple que le menu haut.
- Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php.
- Il faut ensuite modifier la fonction showmenu() de la classe MenuLeft afin de fabriquer son menu gauche. Si on veut afficher le menu standard ou juste le modifier légèrement sans recréer le sien complètement, il suffit de boucler sur le contenu du tableau $menu->liste. Si vous voulez afficher un menu complètement différent et totalement contrôlé par vous, il vous faut, dans la fonction showmenu(), créer un objet $newmenu=new Menu() et utiliser les méthodes $newmenu->add et $newmenu->add_submenu pour définir la liste des entrées menu gauche à faire apparaitre. Une fois cela fait, on affiche par des "print" le contenu du tableau $newmenu->liste (qui vient d'etre construit) au lieu de $menu->liste.
Exemple de fichier htdocs/core/menus/standard/monmenu.php
function showmenu()
{
global $user,$conf,$langs,$dolibarr_main_db_name;
$newmenu = new Menu();
// Put here left menu entries
// ***** START *****
$langs->load("admin"); // Load translation file admin.lang
$newmenu->add(DOL_URL_ROOT."/admin/index.php?leftmenu=setup", $langs->trans("Setup"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/company.php", $langs->trans("MenuCompanySetup"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/modules.php", $langs->trans("Modules"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/ihm.php", $langs->trans("GUISetup"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/boxes.php", $langs->trans("Boxes"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/delais.php",$langs->trans("Alerts"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/triggers.php", $langs->trans("Triggers"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/perms.php", $langs->trans("Security"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/dict.php", $langs->trans("DictionnarySetup"));
$newmenu->add_submenu(DOL_URL_ROOT."/admin/const.php", $langs->trans("OtherSetup"));
// ***** END *****
// do not change code after this
// override menu_array by value array in $newmenu
$this->menu_array=$newmenu->liste;
$alt=0;
for ($i = 0 ; $i < sizeof($this->menu_array) ; $i++)
{
$alt++;
if ($this->menu_array[$i]['level']==0) {
if (($alt%2==0))
{
print '<div class="blockvmenuimpair">'."\n";
}
else
{
print '<div class="blockvmenupair">'."\n";
}
}
if ($this->menu_array[$i]['level']==0) {
if ($this->menu_array[$i]['enabled'])
print '<a class="vmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
else
print '<font class="vmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
}
if ($this->menu_array[$i]['level']==1) {
if ($this->menu_array[$i]['enabled'])
print '<a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
else
print '<font class="vsmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
}
if ($this->menu_array[$i]['level']==2) {
if ($this->menu_array[$i]['enabled'])
print ' <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
else
print ' <font class="vsmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
}
if ($this->menu_array[$i]['level']==3) {
if ($this->menu_array[$i]['enabled'])
print ' <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
else
print ' <font class="vsmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
}
if ($i == (sizeof($this->menu_array)-1) || $this->menu_array[$i+1]['level']==0) {
print "</div>\n";
}
}
}
Vous pouvez aussi forcer l'utilisation de votre gestionnaire au dépend de tout autre en développant un module. Pour cela, il suffit d'ajouter les 4 constantes suivantes dans le tableau $this->const de votre descripteur de module (Voir la page Développement module).
* 1=>array('MAIN_MENU_STANDARD_FORCED','chaine','monmenu.php','Force menu handler to this value',1,'current',1),
* 2=>array('MAIN_MENUFRONT_STANDARD_FORCED','chaine','monmenu.php','Force menu handler to this value',1,'current',1),
* 3=>array('MAIN_MENU_SMARTPHONE_FORCED','chaine','monmenu.php','Force menu handler to this value',1,'current',1),
* 4=>array('MAIN_MENUFRONT_SMARTPHONE_FORCED','chaine','monmenu.php','Force menu handler to this value',1,'current',1),
Votre gestionnaire de menu sera utilisé, quelque soit la configuration, une fois que le module aura été activé.