Dolibarr菜单系统

Dolibarr 有两个菜单系统。菜单系统定义要显示的菜单项、条件和位置(顶部菜单、左部菜单)。

要更改菜单系统,首先要进入 主页 - 设置 - 菜单 页面。然后选择 菜单编辑器。以菜单管理器“Auguria”为例,其作为标准提供,而“Eldy”不是。这些菜单管理器(左侧和顶部)完全可操作,提供相同的视图,但使用不同的存储技术。

要自定义这些默认菜单,您可以添加自己的菜单项,也可以开发自己的菜单管理器,该管理器将完全覆盖默认菜单管理器。然后,您可以决定如何存储菜单(在数据库中,如Auguria菜单管理器;集中在硬文件中,如菜单管理器Eldy,在XML文件中)。请参阅以下章节...

添加您的菜单项

假设您想添加一个菜单项。前往 主页 - 设置 - 菜单。选择 菜单编辑器。添加条目。

例如,要添加一个菜单项以进入仅列出已设置过滤器的商机的页面,请添加一个如下所示的条目:

 

开发自己的菜单系统

本文的目的是描述如何创建一个完整的新菜单系统(替换所有菜单项,完全改变导航概念)。

这不仅仅是添加菜单项。如果是这种情况,并且您只想知道如何在现有菜单管理器中添加菜单项,例如,在开发扩展或新模块时,请参阅 模块开发 页面。

如果您想用自己的菜单系统完全替换现有菜单系统,最简单的方法是使用菜单管理器“eldy_backoffice”作为示例。

开发您的顶部菜单

只需要

  1. 复制 htdocs/core/menus/standard/eldy_backoffice.phphtdocs/core/menus/standard/mymenu.php
  2. 编辑文件 mymenu.php 。类 MenuTop 的 showmenu() 函数是Dolibarr在生成页面以显示此顶部菜单时调用的函数。您可以将您想要的代码放入其中,此函数不修改任何外部变量,只需“打印”您想要看到的菜单即可。因此,您可以从配置文件、数据库中检索要显示的菜单,并根据环境对其进行自定义。Dolibarr环境存储在以下三个全局对象中:$user, $conf, $db, $langs, $mysoc, $hookmanager, $extrafields。
$user contains information about current user.
$conf contains information about setup (activated modules, permissions, options, etc...)
$langs contains information about active language.

htdocs/core/menus/standard/mymenu.php 中的 showmenu() 函数示例:

    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>';
    }

开发您的左侧菜单

原理和顶部菜单一样简单。

  1. 复制 htdocs/core/menus/standard/eldy_backoffice.phphtdocs/core/menus/standard/mymenu.php
  2. 修改类 MenuLeft 的 showmenu() 函数以创建其左菜单。如果您想显示标准菜单或只是稍微修改它而不完全重新创建自己的菜单,只需循环 $menu->liste 数组的内容即可。如果要显示完全不同且完全由您控制的菜单,请在 showmenu() 函数中创建一个 $newmenu=new Menu() 对象,并使用$newmenu->add和$newmenu->add_submenu方法设置要显示的左侧菜单项列表。完成后,“打印”数组 $newmenu->liste(刚刚构建)的内容,而不是$menu->liste。

htdocs/core/menus/standard/mymenu.php 中的 showmenu() 函数示例

    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";
            }
        }

    }

强制使用菜单管理器

您还可以通过开发一个模块来强制使用您自己的管理器,而不依赖于任何其他管理器。

为此,只需在模块描述符文件的 $this->const 数组中添加以下4个常量(请参阅 模块开发 页面)。

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

一旦模块被激活,无论配置如何,都将使用菜单管理器。