适用于 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="/">首页</a></li>', array(
'<ul id="jsddm" class="topNav">',
'<li><a href="linkUrl" title="catDesc">catName</a>',
'</li>',
'</ul>'
), array(
'<ul class="twoLevel">',
'<li><a href="linkUrl" 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
效果图:(好像也支持无限极菜单)
<?php
/**
* Created by PhpStorm.
* User: Chao Chao
* Date: 2017/9/23
* Time: 10:18
* versions: 1.0.0
* url: null
* email: 2776332953@qq.com
* phone: ***
*/
namespace app\index\controller;
use think\Db; // 引用 Db (数据库链接) 类
use think\Url; // 引用 Url ( 创建 url) 类
use think\Loader; // 引用 Loader ( 加载 ) 类
class FrontNav {
// 数据库实例
protected $db;
// 无限极字段名称
protected $pidName = '';
// 排序设置
protected $sort = array();
// 一级导航html模版
protected $levelOne = array();
// 二级导航html模版
protected $levelTwo = array();
// n级导航html模版
protected $levelN = array();
// nav html
protected $navHtml = '';
// 替换关键词
protected $replaceKeywords = array();
/**
* FrontNav constructor. 构造方法用于生成数据实例与配置参数
* @param string $name 数据表名称或模型名称
* @param string $modelPath 模型所在路径,默认为 admin/model (admin模块下的model目录)
* @param string $pidName 无限极分类的字段(如:pid 或 parentid 等)
* @param string $sort 要排序的字段名称
* @param array $replaceKeywords 定义的替换关键词
*/
public function __construct($name, $modelPath, $pidName, $sort, $replaceKeywords) {
// $name 为必填参数
if (empty($name) || !is_string(