特别声明:下面采用的是3.1.3版本的如果3.2.3版本只需改Action名称和类的引用,希望对大家有帮助;谢谢!!
第一,把下面的类放入一个文件夹中,需要引入它
<?php
class Category{
static publicfunction Recursion($cate, $html='--', $pid=0, $lever=0){
$arr=array();
foreach ($cate as $v) {
if ($v['pid']==$pid) {
$v['lever']=$lever+1;
$v['html']=str_repeat($html, $lever);
$arr[]=$v;
$arr=array_merge($arr,self::Recursion($cate, $html, $v['id'], $lever+1)
);
}
}
return $arr;
}
//组合多维数组
static publicfunction Recursion_two($cate, $name="child", $pid=0){
$arr=array();
foreach ($cate as $v) {
if ($v['pid']==$pid) {
$v[$name]=self::Recursion_two($cate, $name, $v['id']);
$arr[]=$v;
}
}
return $arr;
}
//传递一个子分类ID返回的父级分类
static publicfunction Recursion_three($cate, $id){
$arr=array();
foreach ($cate as $v) {
if ($v['id']==$id) {
$arr[]=$v;
$arr=array_merge(self::Recursion_three($cate, $v['pid']),$arr);
}
}
return $arr;
}
//传递一个父分类ID返回的子级分类ID
static publicfunction Recursion_four($cate,$pid){
$arr=array();
foreach ($cate as $v) {
if ($v['pid']==$pid) {
$arr[]=$v['id'];
$arr=array_merge($arr, self::Recursion_four($cate, $v['id']));
}
}
return $arr;
}
static publicfunction Recursion_five($cate, $pid){
$arr=array();
foreach ($cate as $v) {
if ($v['pid']==$pid) {
$arr[]=$v;
$v[$name]=array_merge($arr, self::Recursion_five($cate, $v['id']));
}
}
return $arr;
}
}
第二步在控制器中建立控制器
代码如下
<?php /* * * 无限极菜单分类 * * */ class CategoryAction extends CommonAction { public function index(){ import('Data.Category',APP_PATH); $cate=M('cate')->order('sort ASC')->select(); $cate=Category::Recursion($cate); $this->cate=$cate; $this->display(); } public function addCate(){ //$this->pid=I('pid',0); $this->pid=isset($_GET['pid']) ? $_GET['pid'] : 0; $this->display(); } public function runAddCate(){ if(M('cate')->add($_POST)){ $this->success('添加成功',U(GROUP_NAME.'/Category/index')); }else{ $this->error('添加失败'); } } //菜单排序 public function sortCate(){ $db=M('cate'); foreach ($_POST as $id => $sort) { $db->where(array('id'=>$id))->setField('sort',$sort); } $this->redirect(GROUP_NAME.'/Category/index'); } public function upd(){ $pid=(int)$_GET['pid']; $cate=M('cate'); $info=$cate->find($pid); $this->assign('info',$info); if(!empty($_POST)){ $upd=$cate->save($_POST); if($upd){ $this->success('修改成功',U(GROUP_NAME.'/Category/index')); } }else{ $this->display(); } } public function del(){ $pid=$_GET['pid']; if($pid){ $User = M("cate"); $User->delete($pid); $this->success('删除成功',U(GROUP_NAME.'/Category/index')); } } }
第三步,
需要在Tpl文件下建立三个文件
1、Index.html主要代码如下
<form action="{:U(GROUP_NAME.'/Category/sortCate')}" method="post"> <table class="table" border="1"> <thead> <tr> <td>ID</td> <td>名称</td> <td>级别</td> <td>排序</td> <td>操作</td> </tr> <foreach name='cate' item='v'> <tr> <td>{$v.id}</td> <td>{$v.html}{$v.name}</td> <td>{$v.lever}</td> <td> <input type="text" name="{$v.id}" value='{$v.sort}'> </td> <td> [<a href="{:U(GROUP_NAME.'/Category/addCate',array('pid'=>$v['id']))}">添加子分类</a>] [<a href="{:U(GROUP_NAME.'/Category/upd',array('pid'=>$v['id']))}">修改</a>] [<a href="{:U(GROUP_NAME.'/Category/del',array('pid'=>$v['id']))}">删除</a>] </td> </tr> </foreach> <tr> <td colspan="5" align="center"> <input type="submit" value="排序"> </td> </tr> </thead> </table> </form>
2、建立文件addCate.html主要代码如下:
<div class="xs"> <h3>添加分类</h3> <div class="well1 white"> <form action="{:U(GROUP_NAME.'/Category/runAddCate')}" method="post" class="form-floating ng-pristine ng-invalid ng-invalid-required ng-valid-email ng-valid-url ng-valid-pattern" novalidate="novalidate" ng-submit="submit()"> <fieldset> <div class="form-group"> <label class="control-label">分类栏目名称:</label> <input type="text"name="name" class="form-control1 ng-invalid ng-invalid-required ng-touched" ng-model="model.name" required=""> </div> <div class="form-group"> <label class="control-label">排序:</label> <input type="text" name="sort" class="form-control1 ng-invalid ng-invalid-required ng-touched" ng-model="model.name" required=""> </div> <div class="form-group"> <input type="hidden" name="pid" value='{$pid}' /> <button type="submit" class="btn btn-primary">保存添加</button> </div> </fieldset> </form> </div>
3、upd.html主要代码如下
<form action="{:U(GROUP_NAME.'/Category/upd')}" method="post" class="form-floating ng-pristine ng-invalid ng-invalid-required ng-valid-email ng-valid-url ng-valid-pattern" novalidate="novalidate" ng-submit="submit()"> <fieldset> <div class="form-group"> <label class="control-label">ID:</label> <input type="text" value="{$info.id}" name="id" class="form-control1 ng-invalid ng-invalid-required ng-touched" ng-model="model.name" required=""> </div> <div class="form-group"> <label class="control-label">分类栏目名称:</label> <input type="text" value="{$info.name}" name="name" class="form-control1 ng-invalid ng-invalid-required ng-touched" ng-model="model.name" required=""> </div> <div class="form-group"> <label class="control-label">排序:</label> <input type="text" value="{$info.sort}" name="sort" class="form-control1 ng-invalid ng-invalid-required ng-touched" ng-model="model.name" required=""> </div> <div class="form-group"> <input type="hidden" name="pid" value='{$info.pid}' /> <button type="submit" class="btn btn-primary">保存修改</button> </div> </fieldset> </form>
第四步、剩下就是建立数据表了
代码如下
CREATE TABLE `cate` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT ,
`name` char(15) CHARACTER SET utf8 COLLATEutf8_general_ci NOT NULL ,
`pid` int(10) UNSIGNED NOT NULL ,
`sort` smallint(6) NOT NULL ,
PRIMARY KEY (`id`),
INDEX `pid` (`pid`) USINGBTREE ,
INDEX `id` (`id`, `name`,`pid`, `sort`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8COLLATE=utf8_general_ci
AUTO_INCREMENT=30
ROW_FORMAT=COMPACT
;