thinkphp实现无限分类(使用递归)


Posted in Javascript onDecember 19, 2015

本文实例为大家分享了thinkphp实现无限分类的详细代码,希望对大家学习无限分类有所启发。

数据库:test
数据表:(tp_category):

thinkphp实现无限分类(使用递归)

Common/conf/config.php

'DB_CONFIG2' => array(
 'db_type' => 'mysql',
 'db_user' => 'root',
 'db_pwd' => '',
 'db_host' => 'localhost',
 'db_port' => '3306',
 'db_name' => 'test',
 'DB_PREFIX' => 'tp_', // 数据库表前缀
 'DB_CHARSET'=> 'utf8', // 字符集
 'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志 3.2.3新增
),

Common/function.php 遍历函数loop

/*
 * 递归遍历
 * @param $data array
 * @param $id int
 * return array
 * */
function recursion($data, $id=0) {
 $list = array();
 foreach($data as $v) {
 if($v['pid'] == $id) {
 $v['son'] = recursion($data, $v['id']);
 if(empty($v['son'])) {
 unset($v['son']);
 }
 array_push($list, $v);
 }
 }
 return $list;
}

Controller/IndexController.class.php

public function test() {
 $category = M('category', '', C('DB_CONFIG2'))->select();
 $result = loop($category);
 var_dump($result);
 $this->assign('list', $result);
 $this->display();
}

在模板(View/Index/test.html)中输出(仅支持2级分类,如果想全部显示,建议先把数组转换成JSON格式,然后通过AJAX请求,JS生成)

<ul>
 <volist name="list" id="vo">
 <li>
 {$vo.category}
 <notempty name="vo['children']">
 <ul>
  <volist name="vo['children']" id="cate">
  <li>{$cate.category}</li>
  </volist>
 </ul>
 </notempty>
 </li>
 </volist>
</ul>

后续(ajax请求,递归显示所有分类):

thinkphp实现无限分类(使用递归)

方法 Controller/IndexController.class.php 

public function test() {
 $this->display();
}

public function resultCategory() {
 $category = M('category', '', C('DB_CONFIG2'))->select();
 $result = loop($category);
 $this->ajaxReturn(array('data'=>$result,'status'=>'1','info'=>'获取列表成功'));
}

模板View/Index/test.html

<!DOCTYPE html>
<html>
<head lang="en">
 <meta charset="UTF-8">
 <title>分类测试</title>
 <script src="__PUBLIC__/js/jquery.min.js"></script>
</head>
<body>
<ul id="menu"></ul>

<script>
 $(function() {

 // 递归列表函数
 function recursion(selector,data)
 {
 if(!data) return false;

 for(var i=0;i<data.length;i++)
 {
 var li=$('<li>'+data[i]['category']+'</li>');

 if(data[i]['children'] && data[i]['children'].length>0)
 {
  var ul=$('<ul></ul>');
  recursion(ul,data[i]['children']);
  li.append(ul);
 }

 selector.append(li);
 }
 }

 // ajax请求 用$.post() 会更方便
 $.ajax({
 url: "{:U('resultCategory')}",
 type: 'post',
 dataType: 'json',
 error: function(res) {
 console.log(res);
 },
 success: function(res) {
 recursion($('#menu'),res['data']);

 console.log(res['data']);
 }
 });
 });
</script>

</body>
</html>

另一种无限级分类:

thinkphp实现无限分类(使用递归)

/**
 * 无限极分类
 * @param [type] $cate [description]
 * @param integer $pid [description]
 * @param integer $level [description]
 * @param string $html [description]
 * @return [type] [description]
 */
function sortOut($cate,$pid=0,$level=0,$html='--'){
 $tree = array();
 foreach($cate as $v){
 if($v['pid'] == $pid){
 $v['level'] = $level + 1;
 $v['html'] = str_repeat($html, $level);
 $tree[] = $v;
 $tree = array_merge($tree, sortOut($cate,$v['id'],$level+1,$html));
 }
 }
 return $tree;
}

JS递归(特殊):

thinkphp实现无限分类(使用递归)

这个函数相当于实现php的str_repeat函数

/* 字符串重复函数 */
if(!String.str_out_times) {
 String.prototype.str_out_times = function(l) {
 return new Array(l+1).join(this);
 }
}
// 定位到当前选择
function recursion(selector, data, j, pid) {
 var space = ' ┠ ';
 if(!data) return false;
 $.each(data, function(i, item) {
 var opt = $('<option value="'+item.id+'">'+space.str_out_times(j)+item.name+'</option>');selector.append(opt);
 if(item.son && (item.son).length>0) {
 recursion(selector, item.son, ++j);
 j=0; 
 }
 });

 // 当前是哪个分类
 selector.find('option').each(function() {
 if($(this).val() == pid) {
 $(this).attr('selected', 'selected');
 }
 });
}

为什么j=0呢。因为执行顺序感觉与php不同,这里是从上到下加载。。

ajax请求数据:

$('.btn-edit').click(function() {
 var id = $(this).data('id');
 $.post("{:U('Article/editArticle')}", {id: id}, function(res) {

 // 分类
 $('[name="pid"]').html('');
 recursion($('[name="pid"]'), res.sort, 0, res.pid);

 $('[name="id"]').val(res.id);
 $('[name="title"]').val(res.title);
 $('[name="summary"]').val(res.summary);
 $('#thumbnailImg').attr('src', "__UPLOAD__"+'/thumbnail/'+res.thumbnail);
 ue.setContent(res.content);

 $('#modal-edit').modal('show');
 });
});

以上就是thinkphp实现无限分类的方法,希望对大家的学习有所帮助。

Javascript 相关文章推荐
JQuery 入门实例1
Jun 25 Javascript
javascript 动态table添加colspan\rowspan 参数的方法
Jul 25 Javascript
js 表格隔行颜色
Dec 02 Javascript
javascript进行数组追加方法小结
Jun 16 Javascript
jQuery常用操作方法及常用函数总结
Jun 19 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
解决js函数闭包内存泄露问题的办法
Jan 25 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
Jqprint实现页面打印
Jan 06 Javascript
react-router实现按需加载
May 09 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
详解一个小实例理解js原型和继承
Apr 24 Javascript
15个常用的jquery代码片段
Dec 19 #Javascript
js实现滚动条滚动到页面底部继续加载
Dec 19 #Javascript
jQuery对html元素的取值与赋值实例详解
Dec 18 #Javascript
jQuery打字效果实现方法(附demo源码下载)
Dec 18 #Javascript
jQuery中trigger()与bind()用法分析
Dec 18 #Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 #Javascript
js获取url传值的方法
Dec 18 #Javascript
You might like
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
PHP目录函数实现创建、读取目录教程实例
2011/01/13 PHP
深入php处理整数函数的详解
2013/06/09 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
关于JAVASCRIPT urldecode URL解码的问题
2012/01/08 Javascript
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
2013/11/28 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jQuery动态效果显示人物结构关系图的方法
2015/05/07 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
vue 函数调用加括号与不加括号的区别
2020/10/29 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
统计每一学生的平均成绩
2014/06/06 面试题
毕业研究生的自我鉴定
2013/11/30 职场文书
学校招生宣传广告词
2014/03/19 职场文书
艺术设计专业个人求职信
2014/04/10 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
夫妻婚内购房协议书
2014/10/05 职场文书
观看建国大业观后感
2015/06/01 职场文书
观看焦裕禄观后感
2015/06/09 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
党组织结对共建协议书
2016/03/23 职场文书
五年级作文之成长
2019/09/16 职场文书
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL