菜单项 * * @param string $slot_name 槽位ID * @param array $menu_item 菜单项 */ function xn_nav_menu_item_add($slot_name, $menu_item) { //因为不同开发者的水平参差不齐,所以得用这么多if来规范化 if (empty($slot_name) || empty($menu_item) || !is_array($menu_item)) { // 需要填写槽位ID和菜单项,菜单项必须是数组 return false; } global $xn_nav_menus; if (!isset($xn_nav_menus)) { $xn_nav_menus = setting_get('abs_nav_menus'); } $xn_current_menu = array(); if (isset($xn_nav_menus[$slot_name])) { //如果槽位不存在,则结束 $xn_current_menu = $xn_nav_menus[$slot_name]; } else { return false; } $maxid = count($xn_current_menu); if ($maxid === 0) { //如果总数为0,则最大ID为1 $maxid = 1; } if (isset($menu_item[0]) && is_array($menu_item[0])) { //如果$menu_item是数组的话 foreach ($menu_item as $value) { if (isset($value['name']) || isset($value['href'])) { //如果菜单项存在,则保存 $new_menu_item = array( 'lid' => $maxid, 'icon' => $value['icon'], 'name' => $value['name'], 'title' => $value['title'], 'desc' => $value['desc'], 'href' => $value['href'], 'order' => $value['order'], 'class' => $value['class'], 'attr' => $value['attr'], ); $xn_current_menu[] = $new_menu_item; $maxid++; } else { //否则结束 continue; } } } else { if (isset($menu_item['name']) || isset($menu_item['href'])) { //如果菜单项存在,则保存 $new_menu_item = array( 'lid' => $maxid, 'icon' => $menu_item['icon'], 'name' => $menu_item['name'], 'title' => $menu_item['title'], 'desc' => $menu_item['desc'], 'href' => $menu_item['href'], 'order' => $menu_item['order'], 'class' => $menu_item['class'], 'attr' => $menu_item['attr'], ); $xn_current_menu[] = $new_menu_item; //本来是想 $xn_nav_menus[$slot_name][] = $menu_item 的,但我不知道你会往这里写什么,所以我必须规范化 } else { //否则结束 return false; } } $xn_nav_menus[$slot_name] = $xn_current_menu; setting_set('abs_nav_menus', $xn_nav_menus); return true; } /** * 向指定菜单槽位更新菜单项 * * @param string $slot_name 槽位ID * @param array $menu_item 菜单项 * @param bool $override 覆写菜单项?true: 旧菜单项将完全消失,并被新的菜单项代替;false:正常流程 */ function xn_nav_menu_item_set($slot_name, $menu_item, $override = false) { if (empty($slot_name) || empty($menu_item)) { return false; } global $xn_nav_menus; if (!isset($xn_nav_menus)) { $xn_nav_menus = setting_get('abs_nav_menus'); } $xn_current_menu = array(); if (isset($xn_nav_menus[$slot_name])) { //如果槽位不存在,则结束 $xn_current_menu = $xn_nav_menus[$slot_name]; } else { return false; } $s_lid_arr = array_column($xn_current_menu, 'lid'); // 如果传入的是字符串,则检查是否为序列化的 if (is_string($menu_item) && isSerialized(base64_decode($menu_item))) { // 反序列化,希望传入的是正确的 try { $menu_item = unserialize(base64_decode($menu_item)); } catch (\Throwable $th) { die; } // 安全考量,强制检查是否为数组,如果是其他类型,直接结束 if (!is_array($menu_item)) { //message(-1,''); return false; } } // 继续... if (is_array($menu_item)) { if (!$override) { // 正常流程 if (isset($menu_item[0]) && is_array($menu_item[0])) { //如果$menu_item是数组的话 foreach ($menu_item as $value) { $k = array_search($value['lid'], $s_lid_arr); if ($k !== false) { $new_menu_item = array(); $new_menu_item['lid'] = isset($value['lid']) ? $value['lid'] : (isset($xn_current_menu[$k]['lid']) ? $xn_current_menu[$k]['lid'] : ''); $new_menu_item['icon'] = isset($value['icon']) ? $value['icon'] : (isset($xn_current_menu[$k]['icon']) ? $xn_current_menu[$k]['icon'] : ''); $new_menu_item['name'] = isset($value['name']) ? $value['name'] : (isset($xn_current_menu[$k]['name']) ? $xn_current_menu[$k]['name'] : ''); $new_menu_item['title'] = isset($value['title']) ? $value['title'] : (isset($xn_current_menu[$k]['title']) ? $xn_current_menu[$k]['title'] : ''); $new_menu_item['desc'] = isset($value['desc']) ? $value['desc'] : (isset($xn_current_menu[$k]['desc']) ? $xn_current_menu[$k]['desc'] : ''); $new_menu_item['href'] = isset($value['href']) ? $value['href'] : (isset($xn_current_menu[$k]['href']) ? $xn_current_menu[$k]['href'] : ''); $new_menu_item['order'] = isset($value['order']) ? $value['order'] : (isset($xn_current_menu[$k]['order']) ? $xn_current_menu[$k]['order'] : ''); $new_menu_item['class'] = isset($value['class']) ? $value['class'] : (isset($xn_current_menu[$k]['class']) ? $xn_current_menu[$k]['class'] : ''); $new_menu_item['attr'] = isset($value['attr']) ? $value['attr'] : (isset($xn_current_menu[$k]['attr']) ? $xn_current_menu[$k]['attr'] : ''); //如果有新值,就用新值;如果没有新值,就用旧值;如果没有旧值,就用空字符串 $xn_current_menu[$k] = $new_menu_item; } else { continue; } } } else { if (isset($menu_item['lid'])) { $k = array_search($menu_item['lid'], $s_lid_arr); if ($k !== false) { $new_menu_item = array(); $new_menu_item['lid'] = isset($menu_item['lid']) ? $menu_item['lid'] : (isset($xn_current_menu[$k]['lid']) ? $xn_current_menu[$k]['lid'] : 0); $new_menu_item['icon'] = isset($menu_item['icon']) ? $menu_item['icon'] : (isset($xn_current_menu[$k]['icon']) ? $xn_current_menu[$k]['icon'] : ''); $new_menu_item['name'] = isset($menu_item['name']) ? $menu_item['name'] : (isset($xn_current_menu[$k]['name']) ? $xn_current_menu[$k]['name'] : ''); $new_menu_item['title'] = isset($menu_item['title']) ? $menu_item['title'] : (isset($xn_current_menu[$k]['title']) ? $xn_current_menu[$k]['title'] : ''); $new_menu_item['desc'] = isset($menu_item['desc']) ? $menu_item['desc'] : (isset($xn_current_menu[$k]['desc']) ? $xn_current_menu[$k]['desc'] : ''); $new_menu_item['href'] = isset($menu_item['href']) ? $menu_item['href'] : (isset($xn_current_menu[$k]['href']) ? $xn_current_menu[$k]['href'] : ''); $new_menu_item['order'] = isset($menu_item['order']) ? $menu_item['order'] : (isset($xn_current_menu[$k]['order']) ? $xn_current_menu[$k]['order'] : 0); $new_menu_item['class'] = isset($menu_item['class']) ? $menu_item['class'] : (isset($xn_current_menu[$k]['class']) ? $xn_current_menu[$k]['class'] : ''); $new_menu_item['attr'] = isset($menu_item['attr']) ? $menu_item['attr'] : (isset($xn_current_menu[$k]['attr']) ? $xn_current_menu[$k]['attr'] : ''); //如果有新值,就用新值;如果没有新值,就用旧值;如果没有旧值,就用空字符串 $xn_current_menu[$k] = $new_menu_item; } } else { return false; } } $xn_nav_menus[$slot_name] = $xn_current_menu; } else { // 强制使用新的菜单项 $new_menu = array(); foreach ($menu_item as $k => $v) { $new_menu_item = array(); $new_menu_item['lid'] = isset($v['lid']) ? $v['lid'] : 0; $new_menu_item['icon'] = isset($v['icon']) ? $v['icon'] : ''; $new_menu_item['name'] = isset($v['name']) ? $v['name'] : ''; $new_menu_item['title'] = isset($v['title']) ? $v['title'] : ''; $new_menu_item['desc'] = isset($v['desc']) ? $v['desc'] : ''; $new_menu_item['href'] = isset($v['href']) ? $v['href'] : ''; $new_menu_item['order'] = isset($v['order']) ? $v['order'] : 0; $new_menu_item['class'] = isset($v['class']) ? $v['class'] : ''; $new_menu_item['attr'] = isset($v['attr']) ? $v['attr'] : ''; $new_menu_item['submenu'] = isset($v['submenu']) && in_array($v['submenu'], array_keys(xn_nav_menu_get_available_slots())) ? $v['submenu'] : ''; //如果有新值,就用新值;如果没有新值,就用空字符串 $new_menu[$k] = $new_menu_item; } $xn_nav_menus[$slot_name] = $new_menu; } //var_dump($xn_nav_menus[$slot_name]); setting_set('abs_nav_menus', $xn_nav_menus); return true; } } /** * 删除指定菜单槽位的指定菜单项 * * @param string $slot_name 槽位ID * @param string|array $menu_item 菜单项ID */ function xn_nav_menu_item_del($slot_name, $menu_item) { if (empty($slot_name) || empty($menu_item)) { return false; } global $xn_nav_menus; if (!isset($xn_nav_menus)) { $xn_nav_menus = setting_get('abs_nav_menus'); } $xn_current_menu = array(); if (isset($xn_nav_menus[$slot_name])) { //如果槽位不存在,则结束 $xn_current_menu = $xn_nav_menus[$slot_name]; } else { return false; } $s_lid_arr = array_column($xn_current_menu, 'lid'); if (isset($menu_item[0]) && is_array($menu_item[0])) { //如果$menu_item是数组的话 foreach ($menu_item as $value) { $k = array_search($value, $s_lid_arr); if ($k !== false) { unset($xn_current_menu[$k]); } else { continue; } } } else { if ($menu_item != 0) { $k = array_search($menu_item, $s_lid_arr); if ($k !== false) { unset($xn_current_menu[$k]); } } else { return false; } } $xn_nav_menus[$slot_name] = $xn_current_menu; setting_set('abs_nav_menus', $xn_nav_menus); return true; } //========== 【CURD功能结束】 ==========// //========== 【杂项功能开始】 ==========// /** * 获取可用菜单槽位;请尽量使用$abs_nav_menus_slots全局变量,除非无法直接获取$abs_nav_menus_slots,才用该函数 * @return array */ function xn_nav_menu_get_available_slots() { global $abs_nav_menus_slots; return $abs_nav_menus_slots; } /** * 获取可用魔法菜单项;请尽量使用$abs_nav_menus_magic_href,除非无法直接获取$abs_nav_menus_magic_href,才用该函数 * @return array */ function xn_nav_menu_get_available_magic_href() { global $abs_nav_menus_magic_href; return $abs_nav_menus_magic_href; } /** * 将菜单栏位里的内容转换成字符串,用于备份 * * @param string $slot 槽位 * @return string 序列化的数组 */ function xn_nav_menu_slot_items_to_string($slot_name) { $r = xn_nav_menu_get($slot_name); return base64_encode(serialize($r)); } if (!function_exists('isSerialized')) { /** * 是否为序列化的字符串 * * @param string $str * @return bool */ function isSerialized($str) { try { $r = ($str == serialize(false) || @unserialize($str) !== false); } catch (\Throwable $th) { return false; } return $r; } } //========== 【杂项功能结束】 ==========//