分类表:
DROP TABLE IF EXISTS `shop_category`;
CREATE TABLE `shop_category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`cat_name` varchar(90) NOT NULL DEFAULT '' COMMENT '分类名称',
`cat_desc` varchar(255) NOT NULL DEFAULT '' COMMENT '分类描述',
`parent_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
`sort_order` int(4) unsigned NOT NULL DEFAULT '50' COMMENT '显示排序,数字越大越后',
`is_show` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否在前台显示 (0:显示 1:不显示)',
`icon_url` varchar(255) NOT NULL COMMENT '图标地址',
`show_in_nav` tinyint(1) DEFAULT '0' COMMENT '是否在导航栏显示(0:显示 1:不显示)',
PRIMARY KEY (`id`),
KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10008 DEFAULT CHARSET=utf8;
模型:
//如果return返回getTree()函数就直接在视图中遍历输出
//如果return返回list_level()函数在视图遍历分类输出格式为:
//<td><?php echo str_repeat('-- ',$value['level']);?><?php echo $value['cat_name']?></td>
public function sel_all()
{
$arr = self::find()->asArray()->all();
//return self::list_level($arr, $pid = 0, $level = 0 );
return self::getTree($arr, $pid = 0, $level = 0 );
}
public function list_level($arr, $pid = 0, $level = 0)
{
static $data = array();
foreach($arr as $k => $v){
if($v['parent_id'] == $pid){
$v['level'] = $level;
$data[] = $v;
$this->list_level($arr,$v['id'],$level+1);
}
}
return $data;
}
/**
* 获取所有的分类
*/
public function getCategories()
{
$data = self::find()->all();
$data = ArrayHelper::toArray($data);
return $data;
}
/**
*遍历出各个子类 获得树状结构的数组
*/
public static function getTree($data,$pid = 0,$lev = 1)
{
$tree = [];
foreach($data as $value){
if($value['parent_id'] == $pid){
$value['cat_name'] = str_repeat('---- ',$lev).$value['cat_name'];
$tree[] = $value;
$tree = array_merge($tree,self::getTree($data,$value['id'],$lev+1));
}
}
return $tree;
}
/**
* 得到相应 id 对应的 分类名 数组
*/
public function getOptions()
{
$data = $this->getCategories();
$tree = $this->getTree($data);
$list = ['添加顶级分类'];
foreach($tree as $value){
$list[$value['id']] = $value['cat_name'];
}
return $list;
}
控制器:
/**
* Lists all Category models.
* @return mixed
*/
public function actionIndex () {
$model = new Category();
$data = $model->sel_all();
return $this->render('index', [
'data' => $data,
]);
}
视图:
<?php foreach($data as $value){ ?>
<tr data-key="9">
<td><?php echo $value['id']?></td>
<!-- <td>--><?php //echo str_repeat('-- ',$value['level']);?><!----><?php //echo $value['cat_name']?><!--</td>-->
<td><?php echo $value['cat_name']?></td>
<td><?php echo $value['cat_desc']?></td>
<td><?php echo $value['parent_id']?></td>
<td><?php echo $value['sort_order']?></td>
<td><?php if($value['is_show'] == 0){echo '显示';}else{echo '不显示';}?></td>
<!-- <td>--><?php //echo $value['icon_url']?><!--</td>-->
<td><?php if($value['show_in_nav'] == 0){echo '显示';}else{echo '不显示';}?></td>
<td>
<a href="/category/view?id=<?php echo $value['id']?>" title="查看" aria-label="查看" data-pjax="0">
<span class="glyphicon glyphicon-eye-open"></span>
</a>
<a href="/category/update?id=<?php echo $value['id']?>" title="更新" aria-label="更新" data-pjax="0">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<a href="/category/delete?id=<?php echo $value['id']?>" title="删除" aria-label="删除" data-pjax="0" data-confirm="您确定要删除此项吗?" data-method="post">
<span class="glyphicon glyphicon-trash"></span>
</a>
</td>
</tr>
<?php }?>
效果图:
无限极分类yii2 - treegrid插件:https://blog.csdn.net/weixin_41120504/article/details/85060263