用递归方法实现多级分类,适合分级不太多的分类,如三到四级。

数据库结构:

Model中(Category.php)

    /**
* 获取全部分类信息
*/
public function getAllcategory()
{
$sql = 'select * from '.$this->tableName().' order by id asc';
$category = ZDBTool::QueryAll($sql); return $category;
}

Controller中(CategoryController.php)

    public function actionIndex()
{
global $category;
$category = array(); $category = Category::model()->getAllCategory();
//print_r($category); //……其它内容省略 $param = array(
'model' => $model,
'cat_arr' => $cat_arr,
);
$this->render('index', $param);
} //无限分类递归数组
public function get_cat_array($pid = 0)
{
//echo 'fid:'.$fid.' ';
global $category;
$arr = array();
foreach($category as $index => $row){
//对每个分类进行循环。
if($category[$index]['pid'] == $pid){ //如果有子类
$row['child'] = $this->get_cat_array($category[$index]['id']); //调用函数,传入参数,继续查询下级
$arr[] = $row; //组合数组
}
}
return $arr;
}

View中(category/index.tpl)(本文只演示到三级分类,此处使用了Yii的smarty-view-renderer扩展

    <div class="main">
<div class="category">
<form action="/category/create" method="post">
<table class="table table-hover">
<thead>
<tr>
<th style="width:10px;"></th>
<th>分类名称</th>
<th style="width:80px;">操作</th>
</tr>
</thead>
<tbody>
<tr>
<td></td>
<td colspan="4" class="border_btm" style="padding-top:15px;">
<a href="{$this->createUrl('category/create')}"><i class="icon-plus-sign-alt">+</i> 添加新分类</a>
</td>
</tr>
{foreach from=$cat_arr key=k item=v}
<tr>
<td>{if !empty($v.child)}<a href="javascript:;"><i class="icon-chevron-down"></i></a>{/if}</td>
<td>
<div class="type-parent">{$v.title}&nbsp;&nbsp;
{if empty($row['pid'])}<a href="{$this->createUrl('category/create', ['pid'=>$v.id])}"><i class="icon-plus-sign-alt">+</i> 添加子分类</a>{/if}
</div>
</td>
<td>
<a href="{$this->createUrl('category/update', ['id'=>$v.id])}">编辑</a>&nbsp;&nbsp;
<a href="{$this->createUrl('category/delete', ['id'=>$v.id])}"
onclick="return confirm('确认删除此分类吗?');return false;">删除</a>
</td>
</tr>
{foreach from=$v.child key=k1 item=v1}
<tr>
<td>{if !empty($v1.child)}<a href="javascript:;"><i class="icon-chevron-down"></i></a>{/if}</td>
<td>
<div class="type-child">{$v1.title}&nbsp;&nbsp;{if $v1.pid!=0}
<a href="{$this->createUrl('category/create', ['pid'=>$v1.id])}">
<i class="icon-plus-sign-alt">+</i> 添加子分类</a>{/if}</div>
</td>
<td>
<a href="{$this->createUrl('category/update', ['id'=>$v1.id])}">编辑</a>&nbsp;&nbsp;
<a href="{$this->createUrl('category/delete', ['id'=>$v1.id])}"
onclick="return confirm('确认删除此分类吗?');return false;">删除</a>
</td>
</tr>
{foreach from=$v1.child key=k2 item=v2}
<tr>
<td></td>
<td>
<div class="type-child-child">{$v2.title}&nbsp;&nbsp;{if $v2.pid!=0}
<a href="{$this->createUrl('category/create', ['pid'=>$v2.id])}">
<i class="icon-plus-sign-alt">+</i> 添加子分类</a>{/if}</div>
</td>
<td>
<a href="{$this->createUrl('category/update', ['id'=>$v2.id])}">编辑</a>&nbsp;&nbsp;
<a href="{$this->createUrl('category/delete', ['id'=>$v2.id])}"
onclick="return confirm('确认删除此分类吗?');return false;">删除</a>
</td>
</tr>
{/foreach}
{/foreach}
{/foreach}
<tr>
<td></td>
<td colspan="4">
<input name="submit" type="submit" class="btn button green" value="提交">
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>

CSS样式


/*Category*/
.category{padding:15px;}
.category .table td{/*font-size:16px;*/ vertical-align:middle;}
.category .table td input{margin-bottom:;}
.category .table .type-child{padding-left:55px;background:url('../../images/bg_repno.gif') no-repeat -248px -550px;}
.category .table .type-child-child{padding-left:105px;background:url('../../images/bg_repno.gif') no-repeat -248px -550px;}

附:bg_repno.gif

$cat_arr 数组结构如图:

最终效果图:

Yii中用递归方法实现无限级分类的更多相关文章

  1. (实用篇)PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  2. PHP无限级分类-递归(不推荐)

    [http://www.helloweba.com/view-blog-204.html] 在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢? ...

  3. php无限级分类

    使用递归方法,遍历子类,对数据进行重新排序,使用level进行无限级分类 /** * 功能:无限级分类 * 参数:$data 类别查询结果集 * 返回值:$arr 排序后的数组 */ public f ...

  4. PHP递归实现无限级分类

    在一些复杂的系统中,要求对信息栏目进行无限级的分类,以增强系统的灵活性.那么PHP是如何实现无限级分类的呢?我们在本文中使用递归算法并结合mysql数据表实现无限级分类. 在一些复杂的系统中,要求对信 ...

  5. FreeSql 使用 ToTreeList/AsTreeCte 查询无限级分类表

    关于无限级分类 第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fi ...

  6. mysql无限级分类

    第一种方案: 使用递归算法,也是使用频率最多的,大部分开源程序也是这么处理,不过一般都只用到四级分类. 这种算法的数据库结构设计最为简单.category表中一个字段id,一个字段fid(父id).这 ...

  7. PHP无限级分类的实现(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构.文章分类.无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式: 查找分类A下面所有分类包含的文章. 1.实现原理 在 ...

  8. 一道无限级分类题的 PHP 实现

    今天有网友出了道题: 给出如下的父子结构(你可以用你所用语言的类似结构来描述,第一列是父,第二列是子),将其梳理成类似如图的层次父子结构. origin = [('A112', 'A1122'), ( ...

  9. php利用递归函数实现无限级分类

    相信很多学php的很多小伙伴都会尝试做一个网上商城作为提升自己技术的一种途径.各种对商品分类,商品名之类的操作应该是得心应手,那么就可以尝试下无限级分类列表的制作了. 什么是无限级分类? 无限级分类是 ...

随机推荐

  1. (四)跟我一起玩Linux网络服务:DHCP服务配置之中继代理

    继第三部分的DHCP服务器的设置成功,我们来做一个中继代理服务器的配置吧. 我们的虚拟机结构如图: 具体参考: (一)跟我一起玩Linux网络服务:DNS服务——BIND(/etc/named.con ...

  2. SSH框架jar神包

    SSH JAR包链接(https://zhidao.baidu.com/share/ac8b1389bac84023d7442cad88f3933c.html)

  3. spring拦截器

    一:拦截器配置 <!-- 拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path=&qu ...

  4. 进程显示,删除,调度 ps, top kill

    ps:查看进程的情况,显示的是某一时间进程的运行状态.ps --help top:也是查看进程的情况,动态显示进程信息! kill:杀死进程的情况, sudo kill --help 查看相关参数 c ...

  5. GDI画验证码

    Random r = new Random(); string str = ""; for (int i = 0; i < 5; i++) { int a= r.Next(0 ...

  6. mui h5 动态实现数据的移除和数据操作完后的重新获取

    HTML 代码 <ul class="mui-table-view" id="OA_task_1"> <li class="mui- ...

  7. PHP学习心得(五)——类型

    简介 PHP 支持8种基本的数据类型. 四种标量类型: boolean (布尔型) integer (整型) float (浮点型, 也称作 double) string (字符串) 两种复合类型: ...

  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    关于网页中第一行<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  9. load-store/register-memory/register-plus-memory比较

    在理解ARM的load-store架构时,我在百度上搜索了很长时间,但是始终找不到一篇像样的中文文章.最后,在用谷歌搜索的英文网站上终于找到了一些蛛丝马迹.让我们先看一下一篇英文资料. Process ...

  10. 【技术贴】Eclipse 右键打开当前文件所在文件夹

    1.使用插件,百度:OpenExplorer_1.5.0.v201108051513.jar 2.默认情况下使用eclipse打开当前文件所在文件夹很麻烦,需要右键点击 Package Explore ...