本文实例讲述了tp5框架前台无限极导航菜单类实现方法。分享给大家供大家参考,具体如下:
适用于 id name pid sort 类似结构的表结构
使用方法:(tp5)
1、将最下面的代码保存到“前台”控制器目录下(名为 FrontNav.php),比如(路径): application/index/controll(应用/模块/控制器)
2、在控制器中使用:(application/index/controll/index)(应用/模块/控制器/方法)
也可以放到基础类的初始化方法中,如:Base.php 的 _initialize() 方法(不用多解释,这个是 tp5 的初始化方法 貌似 init() 也行?可以自己试试)
使用:
1)、第一步:先实例化本类, 5 个参数。
参数说明:
- param 1:必填 字符串类型 数据表名称(也是模型名称),不用其实字母大写也行。例如: category
- param 2:选填 字符串类型 模型所在的路径(默认是:admin模块下的model目录)。如果你不叫 admin,那么书写格式如下:houtai/model
- param 3:必填 字符串类型 父级栏目字段名称,例如:pid(parent id)
- param 4:选填 数组类型 默认是按 id 正序排序的,如果有排序字段 sortField 的值为 字段名称 如 sort 或者 listorder 等…,sortOrder 的值为 asc(正序) 或 desc (倒序),建议按这个排序,要不然会显示有点乱,因为权重的关系需要手动排序显示的位置。
- param 5:必填 二维数组 替换关键词,该参数的第一个数组为顶部导航所需要替换的关键词(必填),linkUrl(url 链接)是固定模式,必须这么写,它的值是:模块/控制器/方法,其他的键为要替换的关键词值为字段名称。第二个数组(选填)为二级菜单,第三个数组(选填)为N级菜单,此三个数组个数要对应 $this->createNavHtml() 方法中模版参数的个数,详见 createNavHtml() 方法解释。
$frontNav = new FrontNav('category', '', 'pid', array( 'sortField' => 'sort', 'sortOrder' => 'asc' ), array( array( 'linkUrl' => 'index/artlist/index', 'catName' => 'name', 'catDesc' => 'desc' ), array( 'linkUrl' => 'index/artlist/index', 'catName' => 'name', 'catDesc' => 'desc' ) ));
2)、第二步:生成 导航的 html 结构,4个参数
- param 1:选填 字符串类型 首页的 html 模版,例如 ‘<li><a class=”navi_home” href=”/”>首页</a></li>'
- param 2:必填 数组类型 顶部导航的 html 模版,注意下面实例的格式写法
- param 3:选填 数组类型 二级菜单的 html 模版,同上
- param 4:选填 数组类型 N级菜单的 html 模版,同上
$navHtml = $frontNav->createNavHtml('<li><a class="navi_home" href="/" rel="external nofollow" rel="external nofollow" >首页</a></li>', array( '<ul id="jsddm" class="topNav">', '<li><a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName</a>', '</li>', '</ul>' ), array( '<ul class="twoLevel">', '<li><a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName</a>', '</li>', '</ul>' ), '');
3)、第三步:向模版输出
$this->assign(array( 'navHtml' => $navHtml ));
4)、第四步:模版调用(多余??)
<div id="navi"> {$navHtml} </div>
提示:
1、替换关键词参数个数与模版(除了首页外)参数个数一定要对应,打字解释的可能有点不明白,详细的对照 实例化 和 创键方法 的代码看几遍就明白了,实在不行可以看源程序,都有较详细的注释。
2、本类默认模型优先,如果没有模型就会查表返回数据库实例。
3、还有一点要注意就是你的替换关键词尽量要跟模版里的字符串不要重复,比如说,你的替换关键词叫 ‘id' => catename,而模版里 <li id=”xixixi”><a href=”###”>哎呀?</a></li>,要是这样就坏了…
求高手改成php原生的,可联系qq发给我吗?嘿嘿…
具体哪有不清楚的可以联系我QQ
效果图:(好像也支持无限极菜单)
<"navi_home" href="/" rel="external nofollow" rel="external nofollow" >首页</a></li> * @param array $levelOneTemplate 必填 顶部导航的html样式,如: array( * '<ul id="jsddm" class="topNav">', 最外层 ul * '<li><a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName</a>', li标签 * '</li>', li 结束 * '</ul>' ul 结束 * ) * @param array $levelTwoTemplate 选填 二级菜单的html样式,如: array( * '<ul class="twoLevel">', 二级菜单的 ul * '<li><a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName</a>', li标签 * '</li>',li 结束 * '</ul>'ul 结束 * ) * @param array $levelNTemplate 选填 多级菜单的html样式,如: array( * '<ul class="nLevel">', N级菜单的 ul * '<li><a href="linkUrl" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" title="catDesc">catName</a>', li标签 * '</li>',li 结束 * '</ul>'ul 结束 * @return string */ public function createNavHtml($homePageHml, $levelOneTemplate, $levelTwoTemplate, $levelNTemplate) { // 第一层导航不能为空且必须是数组 if (empty($levelOneTemplate) || !is_array($levelOneTemplate)) { throw new \think\Exception('参数错误 $levelOneTemplate(一级导航模版),该参数必须是数组类型且不能为空!'); } $this->levelOne = $levelOneTemplate; // 二级导航 if (!empty($levelTwoTemplate) && !is_array($levelTwoTemplate)) { throw new \think\Exception('参数错误 $levelTwoTemplate(二级导航模版),该参数可以为空 \'\' 或 array(),否则必须是数组类型!'); } $this->levelTwo = $levelTwoTemplate; // N级导航 if (!empty($levelNTemplate) && !is_array($levelNTemplate)) { throw new \think\Exception('参数错误 $levelNTemplate(N级导航模版),该参数可以为空 \'\' 或 array(),否则必须是数组类型!'); } $this->levelN = $levelNTemplate; $treeData = $this->getTreeData($this->getAllData(), 0); //print_r($treeData); $this->createHtml($treeData); return $this->levelOne[0] . (!empty($homePageHml) "\n"; } /** * 获取所有数据 * @return array */ private function getAllData() { if (empty($this->sort) || empty($this->sort['sortField']) || empty($this->sort['sortOrder'])) { return collection($this->db->where(1) ->select())->toArray(); } else { return collection($this->db->where(1) ->order($this->sort['sortField'] . ' ' . $this->sort['sortOrder']) ->select())->toArray(); } } /** * 将所有数据攒成树状结构的数组 * 增加 levels (层级) children (子数组) * @param $allData 传递过来的所有非树状结构的数组 * @param $parentId 初始化时的父栏目id * @return array 树状结构的数组 */ private function getTreeData($allData, $parentId) { $tree = array(); // 层级计数 static $number = 1; foreach ($allData as $v) { if ($v[$this->pidName] == $parentId) { if ($v[$this->pidName] == 0) { $v['levels'] = 0; } else { $v['levels'] = $number; ++$number; } $v['children'] = $this->getTreeData($allData, $v['id']); $tree[] = $v; } else { $number = 1; } } return $tree; } /** * 递归生成树状结构的html * @param $allData array 由 createNavHtml() 方法传递过来的 树形结构 数据(数组) * @return string 返回(最外层ul内部的html)树状结构的html */ private function createHtml($allData) { foreach ($allData as $v) { // 顶部导航 if ($v['levels'] == 0) { $tempStr0 = $this->levelOne[1]; foreach ($this->replaceKeywords[0] as $k1 => $v1) { if ($k1 == 'linkUrl') { $tempStr0 = str_replace($k1, Url::build($v1, 'id=' . $v['id']), "\n" . $tempStr0); } else { $tempStr0 = str_replace($k1, $v[$v1], $tempStr0); } } $this->navHtml .= $tempStr0; if (empty($v['children'])) { $this->navHtml .= $this->levelOne[2] . "\n"; } else if (!empty($v['children']) && !empty($this->levelTwo)) { $this->navHtml .= "\n" . $this->levelTwo[0] . "\n"; $this->createHtml($v['children']); $this->navHtml .= $this->levelTwo[3] . $this->levelOne[2]; } } // 二级菜单 if ($v['levels'] == 1) { $tempStr2 = $this->levelTwo[1]; foreach ($this->replaceKeywords[1] as $k1 => $v1) { if ($k1 == 'linkUrl') { $tempStr2 = str_replace($k1, Url::build($v1, 'id=' . $v['id']), $tempStr2); } else { $tempStr2 = str_replace($k1, $v[$v1], $tempStr2); } } $this->navHtml .= $tempStr2; if (empty($v['children'])) { $this->navHtml .= $this->levelTwo[2] . "\n"; } else if (!empty($v['children']) && !empty($this->levelN)) { // 是否多级导航,有 children ,还必须有3级 html 模版 $this->navHtml .= "\n" . $this->levelN[0] . "\n"; $this->createHtml($v['children']); $this->navHtml .= $this->levelN[3] . $this->levelTwo[2] . "\n"; } } // 多级菜单 if (!empty($this->levelN) && $v['levels'] > 1) { $tempStrN = $this->levelN[1]; foreach ($this->replaceKeywords[2] as $k1 => $v1) { if ($k1 == 'linkUrl') { $tempStrN = str_replace($k1, Url::build($v1, 'id=' . $v['id']), $tempStrN); } else { $tempStrN = str_replace($k1, $v[$v1], $tempStrN); } } $this->navHtml .= $tempStrN; if (empty($v['children'])) { $this->navHtml .= $this->levelN[2] . "\n"; } else { $this->navHtml .= $this->levelN[0]; $this->createHtml($v['children']); $this->navHtml .= $this->levelN[3] . $this->levelN[2]; } } } return $this->navHtml; } }
更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《codeigniter入门教程》、《CI(CodeIgniter)框架进阶教程》、《Zend FrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]