文档章节

ThinkPHP5无限循环输出无限分类【方案二】

zhiqiangw
 zhiqiangw
发布于 2016/11/29 17:31
字数 683
阅读 130
收藏 1
点赞 0
评论 0

数据库设计

DROP TABLE IF EXISTS `think_category`;
CREATE TABLE `think_category` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '分类ID',
  `pid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上级分类ID',
  `name` varchar(50) NOT NULL COMMENT '分类名称',
  `type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '分类类型  1  列表  2 单页',
  `sort` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '排序',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='分类表';

模型

public function getLevelList() {
   $category_level = $this->order(['sort' => 'DESC', 'id' => 'ASC'])->select();
    return array2level($category_level);
}

分类的添加

protected $category_model;
protected $article_model;

protected function _initialize() {
  parent::_initialize();
  $this->category_model = new CategoryModel();
  $category_level_list  = $this->category_model->getLevelList();

  $this->assign('category_level_list', $category_level_list);
}

public function save() {
   $data = $this->request->post();
   if ($this->category_model->allowField(true)->save($data)) {
     $this->success('保存成功');
   }else {
     $this->error('保存失败');
   }
}

/**
 * 编辑栏目
 * @param $id
 * @return mixed
 */
public function edit($id) {
    $category = $this->category_model->find($id);

    return $this->fetch('edit', ['category' => $category]);
}

html代码栏目选择部分,其他都是<input>标签

<div class="layui-form-item">
    <label class="layui-form-label">上级栏目</label>
    <div class="layui-input-block">
        <select name="pid" lay-verify="required">
            <option value="0">一级栏目</option>
            {foreach name="category_level_list" item="vo"}
            <option value="{$vo.id}" {if condition="$pid==$vo.id"} selected="selected"{/if}>
              {neq name="vo.level" value="1"}
               |{php}
                 for($i=1;$i<$vo['level'];$i++)
                   {echo ' ----';}
               {/php}
             {/neq} {$vo.name}</option>
            {/foreach}
        </select>
    </div>
</div>

用到的函数common.php

<?php

/**
 * 数组层级缩进转换
 * @param array $array
 * @param int   $pid
 * @param int   $level
 * @return array
 */
function array2level($array, $pid = 0, $level = 1) {
    static $list = [];
    foreach ($array as $v) {
        if ($v['pid'] == $pid) {
            $v['level'] = $level;
            $list[]     = $v;
            array2level($array, $v['id'], $level + 1);
        }
    }

    return $list;
}

/**
 * 构建层级(树状)数组
 * @param array  $array 要进行处理的一维数组,经过该函数处理后,该数组自动转为树状数组
 * @param string $pid 父级ID的字段名
 * @param string $child_key_name 子元素键名
 * @return array|bool
 */
function array2tree(&$array, $pid = 'pid', $child_key_name = 'children') {
    $counter = array_children_count($array, $pid);
    if ($counter[0] == 0)
        return false;
    $tree = [];
    while (isset($counter[0]) && $counter[0] > 0) {
        $temp = array_shift($array);
        if (isset($counter[$temp['id']]) && $counter[$temp['id']] > 0) {
            array_push($array, $temp);
        } else {
            if ($temp[$pid] == 0) {
                $tree[] = $temp;
            } else {
                $array = array_child_append($array, $temp[$pid], $temp, $child_key_name);
            }
        }
        $counter = array_children_count($array, $pid);
    }

    return $tree;
}

/**
 * 子元素计数器
 * @param $array
 * @param $pid
 * @return array
 */
function array_children_count($array, $pid) {
    $counter = [];
    foreach ($array as $item) {
        $count = isset($counter[$item[$pid]]) ? $counter[$item[$pid]] : 0;
        $count++;
        $counter[$item[$pid]] = $count;
    }

    return $counter;
}

/**
 * 把元素插入到对应的父元素$child_key_name字段
 * @param        $parent
 * @param        $pid
 * @param        $child
 * @param string $child_key_name 子元素键名
 * @return mixed
 */
function array_child_append($parent, $pid, $child, $child_key_name) {
    foreach ($parent as &$item) {
        if ($item['id'] == $pid) {
            if (!isset($item[$child_key_name]))
                $item[$child_key_name] = [];
            $item[$child_key_name][] = $child;
        }
    }

    return $parent;
}

/**
 * 循环删除目录和文件
 * @param string $dir_name
 * @return bool
 */
function delete_dir_file($dir_name) {
    $result = false;
    if(is_dir($dir_name)){
        if ($handle = opendir($dir_name)) {
            while (false !== ($item = readdir($handle))) {
                if ($item != '.' && $item != '..') {
                    if (is_dir($dir_name . DS . $item)) {
                        delete_dir_file($dir_name . DS . $item);
                    } else {
                        unlink($dir_name . DS . $item);
                    }
                }
            }
            closedir($handle);
            if (rmdir($dir_name)) {
                $result = true;
            }
        }
    }

    return $result;
}

/**
 * 判断是否为手机访问
 * @return  boolean
 */
function is_mobile() {
    static $is_mobile;

    if (isset($is_mobile)) {
        return $is_mobile;
    }

    if (empty($_SERVER['HTTP_USER_AGENT'])) {
        $is_mobile = false;
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
              || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false
    ) {
        $is_mobile = true;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}

 

© 著作权归作者所有

共有 人打赏支持
zhiqiangw
粉丝 12
博文 191
码字总数 142634
作品 0
郑州
程序员
ThinkPHP5无限循环输出无限分类【方案三】

首先创建数据库: model 首先通过category_query方法获取到所有分类, 然后通过category_tree方法将得到的数据转化为无限分类数组 最后再通过category_html方法将上面得到的无限分类数组输出...

zhiqiangw ⋅ 2016/11/30 ⋅ 0

多分类设计有什么好想法没?

文章可以有多个分类。 分类层次可以无限。 以前是做单无限分类,使用迭代循环读出。 感觉思想好烂。

eechen的粉丝 ⋅ 2014/11/24 ⋅ 1

php中常用的几种无限分类查询技术

数据库的设计无限分类之一 全路径无限分类 全路径无限分类的优点在于 不需要递归关键SQL语句是: $sql = 'select id,name,path,concat(path,"-",id) as fulpath from goods order by fulpath...

小麒麟的胡言乱语 ⋅ 2016/03/14 ⋅ 0

php利用多叉树(平衡树)的方式构建无限分类

说起无限分类..大多数的结构都是 id name parent_id 这种模式.整个结构比较简单清晰.要构建和更新整个分类也比较容易.但是查询起来就会非常的麻烦.经常会用到递归的算法.例如 获取某个节点的...

酒逍遥 ⋅ 2013/07/26 ⋅ 0

PHP 自定义函数无线循环返回值的问题

public function getFollow($var, $str){$map['pid'] = array('IN', "$var");$partner = $this->where($map)->getField('id', true);if(!$str) $str = $var;if(check_array($partner)){$part......

mako ⋅ 2016/10/11 ⋅ 1

ThinkPHP V5.1.3 版本发布:改进路由及调整函数加载顺序

V5.1.3版本主要改进了路由及调整函数加载顺序,推荐更新,主要更新如下: 增加助手函数; 增加助手函数; 增加视图路由方法; 增加路由重定向方法; 路由默认区分最后的目录斜杆(支持设置不区...

流年 ⋅ 01/12 ⋅ 0

for循环中的参数能不省略

for循环语法: for(赋初值;判断条件;赋值加减){ //自己的逻辑 } 1.省略第一个参数 2.省略第二个参数 3.省略第三个参数 结论: 1.第一个参数必须要定义,不然编译失败 2.第二个参数可以不写,...

书中迷梦 ⋅ 2016/07/29 ⋅ 0

初学递归,接触无限分类,小小的尝试

今日学习的是无限循环,这与递归有关。其实我自己还不是完全熟悉和上手,还需要琢磨琢磨。 初步学习递归,算是无限分类的一个小练习。表:cateid int auto 自动递增pid int 0为最大的分类cat...

林伟盛 ⋅ 2014/10/29 ⋅ 0

webserver中webpush技术的最简单cgi示例

嵌入式中一般是使用开源的Goahead webserver服务器,CGI也都是用C语言进行编写开发的。项目中想要在web上实现图片流的视频播放效果,考虑到两种方法,一种是浏览器端来进行图片的主动获取,一...

水海云 ⋅ 2013/03/30 ⋅ 2

V9 无限极分类的使用方法

有时候一个主页要有很多级,都需要二级分类,三级分类,甚至更多级别的分类。那PHPCMS v9如何调用多级分类: PHPCMS V9取出一级分类 {pc:content action="category" catid="0" order="listo...

皇冠小丑 ⋅ 2016/04/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 50分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 52分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部