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

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

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

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请求,递归显示所有分类):

方法 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>

另一种无限级分类:

/**
 * 无限极分类
 * @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递归(特殊):

这个函数相当于实现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实现无限分类的方法,希望对大家的学习有所帮助。

(0)

相关推荐

  • thinkPHP引入类的方法详解

    本文实例讲述了thinkPHP引入类的方法.分享给大家供大家参考,具体如下: 这里以发送邮件类phpmailer为例 1.将核心文件放入ORG目录下 2.在使用的地方,引入这个类文件 如何引入呢? import('@.ORG.phpmailer'); 这个表示引入当前项目中的ORG中的phpmailer.class.php文件 3.引入之后就可以使用文件中的类了 public function sendEmail() { import('@.ORG.phpmailer'); $mail = ne

  • ThinkPHP文件缓存类代码分享

    取自ThinkPHP的文件缓存类代码,这里就不多废话了,小伙伴们自己看注释吧. <?php /** * @desc 文件缓存 */ class Cache{ const C_FILE = '/Runtime/'; private $dir = ''; const EXT = '.tpl'; private $filename = ''; public function __construct($dir = ''){ $this->dir = $dir; } /** * @desc 设置文件缓存

  • ThinkPHP调用common/common.php函数提示错误function undefined的解决方法

    本文主要介绍了ThinkPHP调用common/common.php函数提示错误function undefined的解决方法.对于采用ThinkPHP进行项目开发的朋友来说,在进行ThinkPHP升级后经常会遇到这类问题.具体描述如下: 在对ThinkPHP升级后使用了最新的ThinkPHP3.2版本,将通用的函数放到了common/common.php中,但是在具体页面调用函数时出现了function undefined的错误提示. 在查看了官方文档后发现,原来ThinkPHP3.2版本co

  • ThinkPHP分组下自定义标签库实例

    本文实例讲述了ThinkPHP分组下自定义标签库的实现方法.分享给大家供大家参考.具体如下: 自定义标签库应该位于ThinkPHP\\Extend\\Driver\\TagLib目录下 1 新建标签类库文件名为TagLibBlog.class.php. 2 编辑刚才新建的类库文件,新建一个类,继承TagLib父类 复制代码 代码如下: import('TagLib'); class TagLibBlog extends TagLib { } 3 在类中声明一个protected成员变量$tags

  • ThinkPHP调用百度翻译类实现在线翻译

    要实现ThinkPHP在线翻译功能,需要先在百度开发者中心注册一个API key,具体实现代码如下: action代码部分: <?php class FanyiAction extends Action { public function _empty(){ header("HTTP/1.0 404 Not Found"); $this->display("Public:404"); } public function index() { $User =

  • ThinkPHP使用UTFWry地址库进行IP定位实例

    可以在官网的 http://www.thinkphp.cn/extend/223.html下载IP定位扩展类库,或者下载扩展包( http://www.thinkphp.cn/down/253.html)里面也已经包含该扩展类了.如果是单独下载的上传类库,把解压后的IpLocation.class.php 放入ThinkPHP/Extend/Library/ORG/Net/(如果没有请手动创建)目录下面. 一.获取IP地址 如果你仅仅需要获取用户访问的IP地址,那么直接使用系统内置的get_cl

  • 获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)

    THINKphp里面有调试运行状态的效果: Process:0.2463s (Load:0.0003s Init:0.0010s Exec:0.1095s Template:0.1355s )|DB:13 queries 0 writes| Cache:2 gets,0 writes|UseMem:415 kb|LoadFile:20|CallFun:63,1370 代表的含义: 运行信息: 整体执行时间0.2463s ( 加载:0.0003s 初始化:0.0010s 执行:0.1095s 模板

  • thinkPHP2.1自定义标签库的导入方法详解

    本文详细讲述了thinkPHP2.1自定义标签库的导入方法.分享给大家供大家参考,具体如下: TP的手册似乎跟不上节奏, 对自定义标签只是寥寥几句, 摸索了N久, 终于将自定义的标签进行了导入. 心得如下: 1. 情况:  新建自定义的标签库类: @.Mylib.Tag.TagLibTest - 懂TP的应该知道这代表的路径 使用Examples下的Tag演示文件 <?php // +--------------------------------------------------------

  • thinkPHP简单调用函数与类库的方法

    本文实例讲述了thinkPHP调用函数与类库的方法.分享给大家供大家参考,具体如下: 手册上说的很冗余,没看懂,下面简单的讲一下具体用法. 函数调用: lib公共函数库叫 common.php App/common/common.php 分组模块下的公共函数库叫 function.php App/Modules/Admin/common/function.php 类库调用: class IndexAction extends Action{ public function index(){ //

  • thinkPHP自定义类实现方法详解

    本文实例讲述了thinkPHP自定义类实现方法.分享给大家供大家参考,具体如下: 1.通过Model调用 <?php /** * 积分模型 api接口 */ class ApiModel{ private $url = 'http://js.yunlutong.com/Customer/Interface'; public function test() { $post_data['action'] = 'sadf'; $post_data['callback'] = '?'; $res = r

  • thinkphp跨库操作的简单代码实例

    实例一:配置config.php文件配置多个数据库配置 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp', 控制器中调用方法: $New = M('表名','前缀没前缀不填写','DB_CONFIG2'); 这里相当于从新连接了数据库远程跨库如果是在同一个服务器数据库可以直接切换: $User = M('数据库名.表名','前缀没有可不填'); 实例二:Model模型中的跨库以下代码填写到模型类中 protected $con

  • ThinkPHP进程计数类Process用法实例详解

    本文实例讲述了ThinkPHP进程计数类Process用法.分享给大家供大家参考.具体如下: 项目中有一个需求:由于某一后台任务比较占带宽,所以要限制进程数.花了点时间,写了类,目前版本功能比较简单. Process.class.php文件如下: <?php /** * Process * * @package * @version $id$ * @copyright 2005-2011 SUCOP.COM * @author Dijia Huang <huangdijia@gmail.com

  • Thinkphp调用Image类生成缩略图的方法

    本文实例讲述了Thinkphp调用Image类生成缩略图的方法.分享给大家供大家参考.具体分析如下: Thinkphp的Image类 在ThinkPHP/Extend/Library/ORG/Util/Image.class.php中. 调用方法如下: import("ORG.Util.Image"); $Img = new Image();//实例化图片类对象 $image_path = './图片路径'; //若当前php文件在Thinkphp的中APP_PATH路径中 //'./

随机推荐