本文实例讲述了tp5框架前台无限极导航菜单类实现方法。分享给大家供大家参考,具体如下:
适用于idnamepidsort类似结构的表结构
使用方法:(tp5)
1、将最下面的代码保存到“前台”控制器目录下(名为FrontNav.php),比如(路径):application/index/controll(应用/模块/控制器)
2、在控制器中使用:(application/index/controll/index)(应用/模块/控制器/方法)
也可以放到基础类的初始化方法中,如:Base.php的_initialize()方法(不用多解释,这个是tp5的初始化方法貌似init()也行?可以自己试试)
使用:
1)、第一步:先实例化本类,5个参数。
参数说明:
- param1:必填字符串类型数据表名称(也是模型名称),不用其实字母大写也行。例如:category
- param2:选填字符串类型模型所在的路径(默认是:admin模块下的model目录)。如果你不叫admin,那么书写格式如下:houtai/model
- param3:必填字符串类型父级栏目字段名称,例如:pid(parentid)
- param4:选填数组类型默认是按id正序排序的,如果有排序字段sortField的值为字段名称如sort或者listorder等…,sortOrder的值为asc(正序)或desc(倒序),建议按这个排序,要不然会显示有点乱,因为权重的关系需要手动排序显示的位置。
- param5:必填二维数组替换关键词,该参数的第一个数组为顶部导航所需要替换的关键词(必填),linkUrl(url链接)是固定模式,必须这么写,它的值是:模块/控制器/方法,其他的键为要替换的关键词值为字段名称。第二个数组(选填)为二级菜单,第三个数组(选填)为N级菜单,此三个数组个数要对应$this->createNavHtml()方法中模版参数的个数,详见createNavHtml()方法解释。
$frontNav=newFrontNav('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个参数
- param1:选填字符串类型首页的html模版,例如‘
- 首页
'
- param2:必填数组类型顶部导航的html模版,注意下面实例的格式写法
- param3:选填数组类型二级菜单的html模版,同上
- param4:选填数组类型N级菜单的html模版,同上
$navHtml=$frontNav->createNavHtml('
首页',array(
'',
'catName',
'',
''
),array(
'',
'catName',
'',
''
),'');
3)、第三步:向模版输出
$this->assign(array(
'navHtml'=>$navHtml
));
4)、第四步:模版调用(多余??)
{$navHtml}
提示:
1、替换关键词参数个数与模版(除了首页外)参数个数一定要对应,打字解释的可能有点不明白,详细的对照实例化和创键方法的代码看几遍就明白了,实在不行可以看源程序,都有较详细的注释。
2、本类默认模型优先,如果没有模型就会查表返回数据库实例。
3、还有一点要注意就是你的替换关键词尽量要跟模版里的字符串不要重复,比如说,你的替换关键词叫‘id'=>catename,而模版里哎呀?,要是这样就坏了…
求高手改成php原生的,可联系qq发给我吗?嘿嘿…
具体哪有不清楚的可以联系我QQ
效果图:(好像也支持无限极菜单)
db=Loader::model($fileName,'model',false,'admin');
}else{
//不确定在linux下数据库名称是否区分大小写,所以都转换成小写。
$this->db=Db::name(strtolower($fileName));
}
//无限极父类字段不能为空
if(!empty($pidName)){
$this->pidName=$pidName;
}else{
thrownew\think\Exception('参数错误$pidName(父栏目id),实例化时字段名称不能为空!');
}
//替换关键词
if(empty($replaceKeywords)||!is_array($replaceKeywords)){
thrownew\think\Exception('参数错误$replaceKeywords(替换关键词),实例化时该参数必须是而为数组类型且不能为空!');;
}else{
$this->replaceKeywords=$replaceKeywords;
}
$this->sort=$sort;
}
/**
*控制器调用,生成导航菜单。顶层导航的样式(参数2$levelOneTemplate)为必填项,也就是说最基本的是一层导航,二级和多级是选填项(参数3:$levelTwoTemplate与参数4$levelNTemplate非必填项)
*@paramstring$homePageHml首页标签的html样式,如:
首页
*@paramarray$levelOneTemplate必填顶部导航的html样式,如:array(
*'
',最外层ul
*'catName',li标签
*'',li结束
*''ul结束
*)
*@paramarray$levelTwoTemplate选填二级菜单的html样式,如:array(
*'',二级菜单的ul
*'catName',li标签
*'',li结束
*''ul结束
*)
*@paramarray$levelNTemplate选填多级菜单的html样式,如:array(
*'',N级菜单的ul
*'catName',li标签
*'',li结束
*''ul结束
*@returnstring
*/
publicfunctioncreateNavHtml($homePageHml,$levelOneTemplate,$levelTwoTemplate,$levelNTemplate){
//第一层导航不能为空且必须是数组
if(empty($levelOneTemplate)||!is_array($levelOneTemplate)){
thrownew\think\Exception('参数错误$levelOneTemplate(一级导航模版),该参数必须是数组类型且不能为空!');
}
$this->levelOne=$levelOneTemplate;
//二级导航
if(!empty($levelTwoTemplate)&&!is_array($levelTwoTemplate)){
thrownew\think\Exception('参数错误$levelTwoTemplate(二级导航模版),该参数可以为空\'\'或array(),否则必须是数组类型!');
}
$this->levelTwo=$levelTwoTemplate;
//N级导航
if(!empty($levelNTemplate)&&!is_array($levelNTemplate)){
thrownew\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)?$homePageHml:'').$this->navHtml.
$this->levelOne[3]."\n";
}
/**
*获取所有数据
*@returnarray
*/
privatefunctiongetAllData(){
if(empty($this->sort)||empty($this->sort['sortField'])||empty($this->sort['sortOrder'])){
returncollection($this->db->where(1)
->select())->toArray();
}else{
returncollection($this->db->where(1)
->order($this->sort['sortField'].''.$this->sort['sortOrder'])
->select())->toArray();
}
}
/**
*将所有数据攒成树状结构的数组
*增加levels(层级)children(子数组)
*@param$allData传递过来的所有非树状结构的数组
*@param$parentId初始化时的父栏目id
*@returnarray树状结构的数组
*/
privatefunctiongetTreeData($allData,$parentId){
$tree=array();
//层级计数
static$number=1;
foreach($allDataas$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$allDataarray由createNavHtml()方法传递过来的树形结构数据(数组)
*@returnstring返回(最外层ul内部的html)树状结构的html
*/
privatefunctioncreateHtml($allData){
foreach($allDataas$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";
}elseif(!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";
}elseif(!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)框架进阶教程》、《ZendFrameWork框架入门教程》及《PHP模板技术总结》。
希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。