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),

一旦模塊被激活,無論配置如何,都將使用菜單管理器。