php自定義選單模組的開啟與關閉
阿新 • • 發佈:2018-11-29
最近專案中要用到選單的開啟與關閉,自己研究了一下,專案使用的框架分別是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"></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] => 操作日誌 ) ) ) )