ホームページ >バックエンド開発 >PHPチュートリアル >thinkphp のメニュートラバーサルの問題について
thinkphp では、データベースからデータをトラバースしてテンプレートに表示します、
データベース
CREATE TABLE `cn_menu` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '系统菜单id', `pid` int(10) unsigned DEFAULT NULL COMMENT '父级id', `name` varchar(200) DEFAULT NULL COMMENT '菜单名称', `url` varchar(200) DEFAULT NULL COMMENT '菜单URL', `params` varchar(200) DEFAULT NULL COMMENT 'URL参数', `sort` tinyint(4) DEFAULT '1' COMMENT '排序', `status` tinyint(1) DEFAULT '1' COMMENT '菜单状态(1=显示,2=隐藏,0=删除)', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='系统菜单表';
<div class="sidebar"> <input type="hidden" value="{:U('SystemFunc/index')}" id="urlAjax"> <ul class="nav" id="nav" > <li class="nav-li"> <a href="###" id="aaa">系统菜单 <span class="caret"></span></a> <ul class="menu"> <li class="menu-li"><a target="main" href="{:U('SystemFunc/listMenu')}">菜单列表</a></li> <!--<li class="menu-li active"><a target="main" href="{:U('SystemFunc/listMenu')}">菜单列表</a></li>--> <li class="menu-li "><a target="main" href="{:U('SystemFunc/addMenu')}">添加菜单</a></li> </ul> </li> <li class="nav-li"> <a href="###">系统角色 <span class="caret"></span></a> <ul class="menu"> <li class="menu-li"><a target="main" href="{:U('SystemFunc/listOral')}">系统角色</a></li> <li class="menu-li"><a target="main" href="{:U('SystemFunc/addOral')}">添加角色</a></li> </ul> </li> <li class="nav-li"> <a href="###">系统管理 <span class="caret"></span></a> <ul class="menu"> <li class="menu-li"><a target="main" href="##">管理员</a></li> <li class="menu-li"><a target="main" href="{:U('SystemFunc/addAdmin')}">添加管理员</a></li> </ul> </li> </ul> </div>
pid に従ってデータベースから値を取得します。マウスのクリックでその配下を非表示にすることについては、これはフロントエンド、js、またはに属します。 jquery の実装
pid に従って、マウスのクリックでその配下を非表示にすることについては、これはフロントエンド、js、または jquery に属しますが、どのようにコードを実装するのでしょうか。データを走査し、2 つの for ループを使用してネストします。最初の A for ループには pid=080d05a437f105744f705ba6f06f48cb1 が表示されます。システム メニュー f092556db850dedfd562431d5552770054bdf357c58b8a65c66d7c19c8e4d1145db79b134e9f6b82c0b36e0489ee08ed 2 番目の for ループでは pid=1,2,3,...803745ba1045765bf0a527d90b41d02d が表示されます。 2f8a736b9e029a3be05f18b9daba14fdメニュー リスト5db79b134e9f6b82c0b36e0489ee08edbed06894275b65c1ab86501b08a632eb 追記: アイデアがあれば、文句を言わないでください。何か間違っている!
まずバックグラウンドで pid==0 を持つノードを見つけて配列 arr_node を形成し、次に配列を foreach し、pid==id を持つサブ配列を見つけて前の配列に格納し、キーをson_node として記録します。つまり、arrnode['son_node ']=array(...) です。次に、フォアグラウンドで出力をスキャンします。
039ebd9ad89b4d750a28520993c09ce4 .id}">{$vo.name}function getTree($data,$pid){ if (!is_array($data) || empty($data) ) return false; $tree = array(); foreach ($data as $k => $v) { if ($v['pid'] == $pid) { //当相等时,说明此数组为上个数组的子目录 $v['pid'] = getTree($data,$v['id']);//将子数组的内容遍历后赋给上级数组的pid键,html页面上循环时用到此内容 $tree[] = $v; unset($data[$k]); //删除遍历过的数组数据 } } return $tree;}
コントローラーでメソッドを作成し、データを呼び出して、それを に渡します。関数
public function showMenu(){ $m = M('cn_menu')->field(true)->select(); $d = getTree($m,0); $this->assign('menu',$d);}
HTML ページ表示コンテンツ、
<div class="sidebar"> <input type="hidden" value="{:U('SystemFunc/index')}" id="urlAjax"> <ul class="nav" id="nav" > <volist name ="menu" id="vo"> <li class="nav-li"> <a href="###" id="aaa">{$vo.name} <span class="caret"></span></a> <ul class="menu"> <volist name="vo['pid']" name="vi"> <li class="menu-li"><a target="main" href="{:U('SystemFunc/listMenu')}">{$vi.name}</a></li> </volist> </ul> </li> </volist> </ul> </div>