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 相关文章推荐
js+css实现有立体感的按钮式文字竖排菜单效果
Sep 01 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
JavaScript实现页面无操作倒计时退出
Oct 22 Javascript
详解JS去重及字符串奇数位小写转大写
Dec 29 Javascript
微信小程序 页面之间传参实例详解
Jan 13 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
JS与HTML结合实现流程进度展示条思路详解
Sep 03 Javascript
微信小程序异步处理详解
Nov 10 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
May 16 Javascript
Javascript 对象(object)合并操作实例分析
Jul 30 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
PHP缓存技术的使用说明
2011/08/06 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP防止跨域提交表单
2013/11/01 PHP
yii操作cookie实例简介
2014/07/09 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
php中使用url传递数组的方法
2015/02/11 PHP
PHP中预定义的6种接口介绍
2015/05/12 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
jQuery替换字符串(实例代码)
2013/11/13 Javascript
提交按钮的name='submit'引起的js失效问题及原因
2015/02/25 Javascript
jQuery实现两款有动画功能的导航菜单代码
2015/09/16 Javascript
JavaScript测试工具之Karma-Jasmine的安装和使用详解
2015/12/03 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
vue实现图片裁剪后上传
2020/12/16 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
python实现统计代码行数的小工具
2019/09/19 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
Python识别处理照片中的条形码
2020/11/16 Python
办公室文员工作自我评价
2013/12/01 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
企业理念标语
2014/06/09 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
2015年业务工作总结范文
2015/04/10 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android