1. 程式人生 > >php自定義選單模組的開啟與關閉

php自定義選單模組的開啟與關閉

最近專案中要用到選單的開啟與關閉,自己研究了一下,專案使用的框架分別是ThinkPHP5 和 H-ui.admin,因為一開始做了許可權,使用的是ThinkPHP5定義過的Auth.php,在tb_auth_group.sql資料表中新增module欄位,儲存方式:一級選單鍵值加“-”連結二級選單鍵值。如下:

這裡隨便例舉,不是完整的哈,在common.php中選單函式封裝如下:

/*
 * 選單陣列
 * module 
 * 後臺角色組選單分配
 */
function menuRoleAdmin()
{
    $array = array(
        array(
            'id' => 'menu-system',
            'icon' => 'xe61d',
            'name' => '平臺資訊',
            'info' => array(
                array('urls' => 'Index/systemSettings','data' => '','names' => '平臺資訊設定'),
            ),
        ),
        array(
            'id' => 'menu-user',
            'icon' => 'xe62b',
            'name' => '使用者管理',
            'info' => array(
                array('urls' => 'Role/usersList','data' => '','names' => '使用者列表'),
                array('urls' => 'Agent/agentList','data' => '','names' => '代理商名單'),
                array('urls' => 'Agent/offlineList','data' => '','names' => '線下人員名單'),
                array('urls' => 'Role/roleList','data' => '','names' => '角色列表'),
                array('urls' => 'Role/permList','data' => '','names' => '許可權列表'),
            ),
        ),            
        array(
            'id' => 'menu-personal',
            'icon' => 'xe62d',
            'name' => '個人詳情',
            'info' => array(
                array('urls' => 'Agent/editAgent','data' => ['uid' => 2,'type' => 2],'names' => '個人詳情'),
            ), 
        ),
        array(
            'id' => 'menu-log',
            'icon' => 'xe623',
            'name' => '操作日誌',
            'info' => array(
                array('urls' => 'Log/logList','data' => '','names' => '操作日誌'),
            ),
        )
    );    
        
    return $array;
}

在模板頁輸出的時候類似於下圖:

以下是在後臺首頁輸出的html

<aside class="Hui-aside">
    <div class="menu_dropdown bk_2">
        
        {volist name="menuInfo" id="v1"}
        <dl id="{$v1.id}">
            <dt><i class="Hui-iconfont">&#{$v1.icon};</i> {$v1.name}<i class="Hui-iconfont menu_dropdown-arrow">&#xe6d5;</i></dt>
            <dd>
                <ul>
                    {volist name="v1.info" id="v2"}
                    {if condition="($v2['data'] neq '')"}
                    <li><a data-href="{:url($v2['urls'],$v2['data'])}" data-title="{$v2.names}" href="javascript:;">{$v2.names}</a></li>
                    {else /}
                    <li><a data-href="{:url($v2['urls'])}" data-title="{$v2.names}" href="javascript:;">{$v2.names}</a></li>
                    {/if}
                    {/volist}                  
                </ul>
            </dd>
            
        </dl>   
        {/volist}      

    </div>
</aside>

灰色部分就是一級選單,白色部分就是二級選單,在頁面可以進行勾選,複選框的value我定義成的(一級選單鍵值-二級選單鍵值),提交後的資料使用英文逗號連線 implode('module/a')組成陣列:

//$arr = ['0-0','1-0','1-1','1-2','1-3','2-0','3-0']; //陣列本來模樣
$arr = ['1-0','1-1','1-3','3-0']; //移除部分選單後選單,1-0是鍵值
foreach($arr as $k => $v){ //封裝一級選單
    $strs = explode('-',$v); 
    $arrs[$k] = $strs[0];
}
$arrs = array_unique($arrs); //一級選單去重
foreach($arrs as $k1 => $v1){
    foreach($arr as $k2 => $v2){
        $str = explode('-',$v2);
        if($v1 == $str[0]){
            $array[$v1][] = $str[1]; //按照一級選單鍵值,封裝整個選單組     
        }                
    }
}   
//var_dump($array);
//列印後格式如下,這裡需要注意,陣列的第一個[1] 為一級選單的鍵值,而二級選單的鍵值實際應該是[0] => 0,對應的這個0,是值,不是鍵值了
Array
(
    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 3 //這裡可以看出區別
        )

    [3] => Array
        (
            [0] => 0
        )

)

//資料在資料表中的格式 1-0,1-1,1-3,3-0 ,怎樣根據這個格式來刪除禁用的選單呢
//需要用到一些函式在下一篇部落格中會強調
$menuInfo = menuRoleAdmin(); //呼叫選單函式,獲取選單
$arrKey1 = array_keys($menuInfo); //獲取選單父級鍵值
$arrKey2 = array_keys($arr); //獲取模組父級鍵值
$arrKey3 = array_diff($arrKey1,$arrKey2); //按照值刪除陣列
$menuInfo = array_diff_key($menuInfo,$arrKey3); //去除非選中的父級選單
foreach($arr as $kk1 => $vv1){
    $arrKey4 = array_keys($menuInfo[$kk1]['info']); //獲取選單子級鍵值
    $arrKey5 = array_values($arr[$kk1]); //獲取選單子級(鍵值 => 值)
    $arrKey6 = array_diff($arrKey4,$arrKey5); //按照值刪除陣列 
    //去除非選中的子級選單
    $menuInfo[$kk1]['info'] = array_diff_key($menuInfo[$kk1]['info'],$arrKey6);
}

//var_dump($menuInfo) 

Array
(
    [1] => Array
        (
            [id] => menu-user
            [icon] => xe62b
            [name] => 使用者管理
            [info] => Array
                (
                    [0] => Array
                        (
                            [urls] => Role/usersList
                            [data] => 
                            [names] => 使用者列表
                        )

                    [1] => Array
                        (
                            [urls] => Agent/agentList
                            [data] => 
                            [names] => 代理商名單
                        )

                    [3] => Array
                        (
                            [urls] => Role/roleList
                            [data] => 
                            [names] => 角色列表
                        )

                )

        )

    [3] => Array
        (
            [id] => menu-log
            [icon] => xe623
            [name] => 操作日誌
            [info] => Array
                (
                    [0] => Array
                        (
                            [urls] => Log/logList
                            [data] => 
                            [names] => 操作日誌
                        )

                )

        )

)