文档章节

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

zhiqiangw
 zhiqiangw
发布于 2016/11/29 17:31
字数 683
阅读 135
收藏 1

数据库设计

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
博文 193
码字总数 142652
作品 0
郑州
程序员
ThinkPHP5无限循环输出无限分类【方案三】

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

zhiqiangw
2016/11/30
365
0
多分类设计有什么好想法没?

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

eechen的粉丝
2014/11/24
58
1
php中常用的几种无限分类查询技术

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

小麒麟的胡言乱语
2016/03/14
57
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
208
1
php利用多叉树(平衡树)的方式构建无限分类

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

酒逍遥
2013/07/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSX | SafariBookmarksSyncAgent意外退出解决方法

1. 启动系统, 按住⌘-R不松手2. 在实用工具(Utilities)下打开终端,输入csrutil disable, 然后回车; 你就看到提示系统完整性保护(SIP: System Integrity Protection)已禁用3. 输入reboot回车...

云迹
今天
4
0
面向对象类之间的关系

面向对象类之间的关系:is-a、has-a、use-a is-a关系也叫继承或泛化,比如大雁和鸟类之间的关系就是继承。 has-a关系称为关联关系,例如企鹅在气候寒冷的地方生活,“企鹅”和“气候”就是关...

gackey
今天
4
0
读书(附电子书)|小狗钱钱之白色的拉布拉多

关注公众号,在公众号中回复“小狗钱钱”可免费获得电子书。 一、背景 之前写了一篇文章 《小狗钱钱》 理财小白应该读的一本书,那时候我才看那本书,现在看了一大半了,发现这本书确实不错,...

tiankonguse
今天
4
0
Permissions 0777 for ‘***’ are too open

异常显示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ......

李玉长
今天
5
0
区块链10年了,还未落地,它失败了吗?

导读 几乎每个人,甚至是对通证持怀疑态度的人,都对区块链的技术有积极的看法,因为它有可能改变世界。然而,区块链技术问世已经10年了,我们仍然没有真正的用上区块链技术。 几乎每个人,甚...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部