Difference between revisions of "Système de menus"

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search
Tag: 2017 source edit
 
(46 intermediate revisions by 7 users not shown)
Line 1: Line 1:
 +
<!-- BEGIN interlang links -->
 +
<!-- Do NOT edit this section
 +
    Links below are automatically managed by PolyglotBot
 +
    You can edit links on the English source page : Menus_system -->
 +
[[en:Menus_system]]
 +
[[es:Sistema_de_menús]]
 +
[[de:Menü_System]]
 +
[[zh:菜单]]
 +
<!-- END interlang links -->
  
== Le système de menu Dolibarr ==
+
[[Category:Noyau]]
 +
{{TemplateDocDev}}
  
Il y a dans Dolibarr 2 systèmes de menu. Celui du haut et celui de gauche qui peuvent etre dépendant l'un de l'autre ou non. On les appelera "menu gauche" et "menu haut".
+
=Le système de menu Dolibarr=
Par défaut, les gestionnaires de ces deux systèmes de menu apportent une approche d'un menu contextuel. Le menu gauche par exemple dépend des éléments métiers que l'on manipule. Cette approche diffère de celle, plus traditionnelle, des applis Windows où le menu déroulant dépend du chemin pris pour atteindre la fonctionnalité. Une sorte d'arbre dans laquelle on se saute pas d'une branche en changeant de fonction, mais en remontant à la racine de l'arbre (exemple menu "Fichier") pour choisir ensuite la sous branche (exemple "Ouvrir"). Afin de contenter les 2 mondes (questions de choix, de gout ou d'habitudes), Dolibarr offre un système de menu modulaire. Il est en effet possible de développer son propre système de menu, à sa sauce, qui prend complètement l'ascendant sur le menu par défaut. L'autre avantage, pour le développeur, est que toute la logique du menu peut également être centralisée dans un seul est même fichier. Ceci permet d'offrir des systèmes de menu aux comportements complètement différents.
 
  
== Changer le système de menu ==
+
Il y a 2 systèmes de menu. Un système de menu définit les entrées de menu à afficher, conditions et localisation.
  
Changer de système de menu est possible via la page Configuration - Interface. Prendre par exemple les gestionnaires de menu "Eldy", fourni en standard (Activer le gestionnaire du menu gauche Eldy en même temps que le gestionnaire du menu haut Eldy, les 2 étant conçus pour fonctionner ensemble). Ces gestionnaires de menu (gauche et haut) sont complètement opérationnels et offre une alternative au menu par défaut.
+
Changer de système de menu est possible via la page '''Configuration - Menus'''. Choisir ensuite '''Editeur de menus'''. Prendre par exemple les gestionnaires de menu "auguria", fournis en standard au lieu de "eldy". Ces gestionnaires de menu (gauche et haut) sont complètement opérationnels et offre la même vision mais en utilisant une technologie de stockage différente.
  
== Développer son propre système de menu ==
+
Pour personnaliser ces menus par défaut, vous pouvez, soit ajouter votre propre entrée menu, soit développer votre propre gestionnaire de menu qui remplacera complètement le gestionnaire par défaut. Vous décidez alors 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, ...). Voir les chapitres suivant pour cela....
  
Le plus simple est de prendre exemple sur les gestionnaires de menu "Eldy".
+
=Ajouter votre entrée menu=
* Pour développer son système de menu haut, il suffit de copier le fichier htdocs/includes/menus/barre_top/eldy.php sous un autre nom comme htdocs/includes/menus/barre_top/monmenu.php
+
Imaginez que vous vouliez ajouter une entrée menu. Allez dans '''Accueil - Configuration - Menus'''. Choisir '''Editeur de menu'''. Ajouter l'entrée.  
Editer ensuite le fichier monmenu.php. La fonction showmenu() 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 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.
 
* Pour développer son système de menu gauche, le principe est aussi simple. Copier le fichier htdocs/includes/menus/barre_left/eldy.php sous un autre nom comme htdocs/includes/menus/barre_left/monmenu.php.
 
Il faut ensuite modifier la fonction showmenu() 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, initialisé par Dolibarr "par défaut" grace au fichier pre.inc.php stocké dans le même répertoire que la page appelée. Si vous voulez afficher un menu complètement différent et totalement controlé par vous (et donc ignorer les fichiers pre.inc.php), 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. En fin de code, on affiche par des print le contenu du tableau $newmenu->liste (qui vient d'etre construit) au lieu de $menu->liste.
 
  
Grâce à ce mécanisme, si le système de menu "Par défaut" de Dolibarr ne vous convient pas, vous pouvez essayer les gestionnaires "Eldy". Et si cela ne vous conviens toujours pas, rien ne vous empeche de développer le votre...
+
Par exemple, pour ajouter une entrée de menu afin d'arriver sur la page qui liste uniquement les opportunités avec les filtres déjà positionnées, vous ajouterez une entrée qui ressemblera à ceci:
 +
 
 +
<div class="divforimgcentpercent">
 +
[[File:Menu editor.png]]
 +
</div>
 +
 
 +
=Développer son propre système de menu=
 +
 
 +
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".
 +
 
 +
==Pour développer son '''système de menu haut'''==
 +
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ées 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
 +
<source lang="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>';
 +
    }
 +
</source>
 +
 
 +
==Pour développer son '''système de menu gauche'''==
 +
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’être construit) au lieu de $menu->liste.
 +
 
 +
Exemple de fichier htdocs/core/menus/standard/monmenu.php
 +
<source lang="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 '&nbsp; &nbsp; <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
 +
                else
 +
                    print '&nbsp; &nbsp; <font class="vsmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
 +
            }
 +
            if ($this->menu_array[$i]['level']==3) {
 +
                if ($this->menu_array[$i]['enabled'])
 +
                    print '&nbsp; &nbsp; &nbsp; &nbsp; <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
 +
                else
 +
                    print '&nbsp; &nbsp; &nbsp; &nbsp; <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";
 +
            }
 +
        }
 +
 
 +
    }
 +
</source>
 +
 
 +
=Forcer l'utilisation de votre gestionnaire de menu=
 +
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]]).
 +
<source lang="php">
 +
* 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),
 +
</source>
 +
Votre gestionnaire de menu sera utilisé, quelque soit la configuration, une fois que le module aura été activé.

Latest revision as of 16:23, 20 February 2020

Le système de menu Dolibarr

Il y a 2 systèmes de menu. Un système de menu définit les entrées de menu à afficher, conditions et localisation.

Changer de système de menu est possible via la page Configuration - Menus. Choisir ensuite Editeur de menus. Prendre par exemple les gestionnaires de menu "auguria", fournis en standard au lieu de "eldy". Ces gestionnaires de menu (gauche et haut) sont complètement opérationnels et offre la même vision mais en utilisant une technologie de stockage différente.

Pour personnaliser ces menus par défaut, vous pouvez, soit ajouter votre propre entrée menu, soit développer votre propre gestionnaire de menu qui remplacera complètement le gestionnaire par défaut. Vous décidez alors 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, ...). Voir les chapitres suivant pour cela....

Ajouter votre entrée menu

Imaginez que vous vouliez ajouter une entrée menu. Allez dans Accueil - Configuration - Menus. Choisir Editeur de menu. Ajouter l'entrée.

Par exemple, pour ajouter une entrée de menu afin d'arriver sur la page qui liste uniquement les opportunités avec les filtres déjà positionnées, vous ajouterez une entrée qui ressemblera à ceci:

Menu editor.png

Développer son propre système de menu

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 Développement 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".

Pour développer son système de menu haut

Il suffit de

  1. Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php
  2. 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ées 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>';
    }

Pour développer son système de menu gauche

Le principe est aussi simple que le menu haut.

  1. Copier le fichier htdocs/core/menus/standard/eldy_backoffice.php sous un autre nom comme htdocs/core/menus/standard/monmenu.php.
  2. 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’être 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 '&nbsp; &nbsp; <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
                else 
                    print '&nbsp; &nbsp; <font class="vsmenudisabled">'.$this->menu_array[$i]['titre'].'</font><br>';
            }
            if ($this->menu_array[$i]['level']==3) {
                if ($this->menu_array[$i]['enabled'])
                    print '&nbsp; &nbsp; &nbsp; &nbsp; <a class="vsmenu" href="'.$this->menu_array[$i]['url'].'">'.$this->menu_array[$i]['titre'].'</a><br>';
                else 
                    print '&nbsp; &nbsp; &nbsp; &nbsp; <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";
            }
        }

    }

Forcer l'utilisation de votre gestionnaire de menu

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é.