实现根据父节点显示子节点的无极限分类的完整操作
Posted 鲜花满月楼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现根据父节点显示子节点的无极限分类的完整操作相关的知识,希望对你有一定的参考价值。
数据表是设计 包含 id name pid 三者 就可以了
第一步: controller:
public function actionFunctionPoint() { $items = FunctionPoint::getFunctionPoint(); return $this->render(\'function-point\', [ \'items\' => $items, ]); }
第二部 model操作数据库
/** * 获得所有系统功能 * @return array */ public static function getFunctionPoint() { $data = []; self::_getFunctionPointList($data,0,1); return $data; } /**根据父类元素 查询所有子类原生 * @param $parentId pid * @return array */ public static function _getFunctionPointList(&$data,$parentId,$level) { $sql = \'SELECT * FROM t_boss_function_point WHERE is_deleted =0 AND parent_id =:parentId\'; $cmd = \\Yii::$app->db->createCommand($sql); $cmd->bindValue(\':parentId\', $parentId); $results = $cmd->queryAll(); foreach ($results as $result) { $result[\'level\'] = $level; array_push($data,$result); self::_getFunctionPointList($data,$result[\'id\'],$level+1); } }
第三步 :view视图的展示
<table class="table table-bordered table-hover"> <thead> <tr> <th>功能点名称</th> <th>功能点所对应的controller</th> <th>功能点所对应的action</th> <th>操作</th> </tr> </thead> <tbody> <tr> <td style="text-align: left">系统功能点</td> <td></td> <td></td> <td> <a class="btn btn-link" href="javascript:onOperateData(\'add\')">添加子菜单</a> </td> </tr> <?php foreach ($items as $item): ?> <tr> <td style="text-align: left;padding-left: <?= $item[\'level\']*25 ?>px"><?= $item[\'name\'] ?></td> <td> <?= $item[\'controller\'] ?> </td> <td><?= $item[\'action\'] ?></td> <td> <a class="btn btn-link" href="javascript:onOperateData(\'add\',\'<?= $item[\'id\'] ?>\')">添加下级功能点</a> <a class="btn btn-link" href="javascript:onOperateData(\'edit\',\'<?= $item[\'id\'] ?>\')">编辑</a> <a class="btn btn-link" href="javascript:deleteFunctionPonit(\'<?= $item[\'id\'] ?>\')">删除</a> </td> </tr> <?php endforeach; ?> </tbody> </table>
功能点二 递归删除父节点下面的所有子节点
控制器
public function actionFunctionPointDeleteHandler() { $request = Yii::$app->request; $id = $request->post(\'id\'); $ids = FunctionPoint::getAllChildIds($id); $ids = $id.$ids; $result= FunctionPoint::deleteFunctionPoint($ids); return $this->renderJson(null, $result ? 0 : 1, $result ? \'操作成功\' : \'操作失败\'); }
/ * 删除系统功能点 * @param $ids * @return bool */ public static function deleteFunctionPoint($ids) { // $cmd = \\Yii::$app->db->createCommand(\'UPDATE t_boss_function_point SET is_deleted = 1 WHERE FIND_IN_SET(id,:ids);\'); $cmd = \\Yii::$app->db->createCommand(\'CALL p_boss_function_point_delete(:ids);\'); $cmd->bindValue(\':ids\', $ids); $result = $cmd->execute(); return $result > 0; } /** * 获得所有的子节点 的id值 * @param $parentId * @return string 返回id字符串 */ public static function getAllChildIds($parentId) { $ids =\'\'; $sql = \'SELECT `id` FROM t_boss_function_point WHERE is_deleted =0 AND parent_id =:parentId\'; $cmd = \\Yii::$app->db->createCommand($sql); $cmd->bindValue(\':parentId\', $parentId); $results = $cmd->queryAll(); foreach($results as $v){ $ids .=",".$v[\'id\']; $ids .= self::getAllChildIds($v[\'id\']); } return $ids; } }
以上是关于实现根据父节点显示子节点的无极限分类的完整操作的主要内容,如果未能解决你的问题,请参考以下文章