Sistema de menús

El sistema de menús Dolibarr

Existen en Dolibarr 2 sistemas de menú. El superior y el izquierdo, que pueden ser dependientes el uno del otro o no. (así pués uno puede imaginarse fácilmente un gestor de menús superior que gestionará el menú con todos las entradas de los submenús mediante menús desplegables y nada en el menú de la izquierda). Por lo que llamaremos a estos dos sistemas: "menú izquierdo" y "menú superior".

Es posible desarrollar su propio gestor de menús (izquierdo y/o superior), que reemplazaría completamente el menú por defecto. Usted decide como guardar su menú (en la base de datos, tal y como lo hace el gestor de menús auguria, centralizado en un fichero, como el gestor de menús eldy, ...). Como puede ver, puede ofrecer un gestor de menús con el comportamiento que usted necesite y la tecnología que desee...

Cambiar el sistema de menús es posible a través de la página Configuración - Interface. Tomemos, por ejemplo, los gestores de menú "auguria", suministrado como estándar. Estos gestores de menú (izquierdo y superior) son totalmente operativos y ofrecen diversas alternativas de menú.

Y si no le convence, nada le impide que realice su propio desarrollo. Consulte el siguiente apartado...

Desarrollar su propio sistema de menús

El propósito de este artículo es describir cómo crear un nuevo sistema de menús en su totalidad (remplazando la totalidad de las entradas de menús, desbarajustando completamente el concepto de navegación).

No se trata sólo de añadir entradas de menús. Si ese no es el caso y sólo quiere saber cómo añadir entradas de menú en un gestor de menús existente para, por ejemplo, el desarrollo de una extensión o un nuevo módulo, mejor vea la página Desarrollo de un módulo.

Si desea remplazar en su totalidad un sistema de menús con el suyo, lo más simple es tomar como ejemplo el gestor de menú "eldy_backoffice".

Para desarrollar su sistema de menú superior

Debe

  1. Copiar el archivo htdocs/core/menus/standard/eldy_backoffice.php bajo otro nombre, como por ejemplo: htdocs/core/menus/standard/mimenu.php
  2. Editar seguidamente el fichero mimenu.php. La función showmenu() de la clase MenuTop es la función llamada por Dolibarr para generar una página para mostrar este menú superior. Podemos crear el código que queramos, esta función no modifica ninguna variable exterior, teniendo únicamente la funcialidad de mostrar por "impresión" el menú que queramos ver. Podemos también recuperar el menú a mostrar desde un fichero de configuración o una base de datos, y personalizarlo en relación al entorno. El entorno Dolibarr se guarda en objetos globales: $user, $conf, $db, $langs, $mysoc, $hookmanager, $extrafields
$user contiene las información relacionada con el usuario usuario.
$conf contiene la información relacionada con la configuración (módulos activos, permisos activos, etc...)
$langs contie la información relacionada con el idioma activo.

Ejemplo de función showmenu() del fichero htdocs/core/menus/standard/mimenu.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>';
    }

Para desarrollar su sistema de menú izquierdo

El principio es igualmente simple.

  1. Seguidamente modificar la función showmenu() de MenuLeft para construtir su menú izquierdo. Si desea visualizar el menú o simplemente modificarlo ligeramente sin llegar a recrearlo completamente, simplemente recorra el contenido de la colección $menu->liste. Si desea mostrar un menú completamente diferente y controlado totalmente por usted, deberá crear un objeto $newmenu=new Menu() en la función showmenu() y utilizar los métodos $newmenu->add y $newmenu->add_submenu para definir el listado de entradaas del menú izquierdo a mostrar. Al final del código, mostraremos por impresión el contenido de la colección $newmenu->liste (que acaba de ser construida) en lugar de $menu->liste.

Ejemplo de fichero htdocs/core/menus/standard/mimenu.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";
            }
        }

    }

Forzar el uso de su gestor de menú

También puede forzar el uso de su gestor de menú en la creación de un módulo. Para ello, simplemente hay que añadir las siguientes 4 constantes en la tabla $this->const de su descriptor del módulo (Ver la página Desarrollo de un módulo).

* 1=>array('MAIN_MENU_STANDARD_FORCED','chaine','mimenu.php','Force menu handler to this value',1,'current',1),
* 2=>array('MAIN_MENUFRONT_STANDARD_FORCED','chaine','mimenu.php','Force menu handler to this value',1,'current',1),
* 3=>array('MAIN_MENU_SMARTPHONE_FORCED','chaine','mimenu.php','Force menu handler to this value',1,'current',1),
* 4=>array('MAIN_MENUFRONT_SMARTPHONE_FORCED','chaine','mimenu.php','Force menu handler to this value',1,'current',1),

Cuando se active el módulo, se utilizará su gestor de menú, cualquiera que sea la configuración.