public function updateMenu() { //编辑的时候先判断是否改变了父级菜单,如果改变了,才使用nestedsets $parent_id = $this->getFieldById($this->data['id'], 'parent_id'); if ($parent_id != $this->data['parent_id']) { $db = D('DbMysql'); $nested_sets = new \Admin\Service\NestedSets($db, 'menu', 'lft', 'rght', 'parent_id', 'id', 'level'); $id = $nested_sets->moveUnder($this->data['id'], $this->data['parent_id'], 'bottom'); if ($id === false) { $this->error = '菜单更新失败'; return false; } } $request_data = $this->data; $this->save(); //保存菜单和权限的映射关系 $permissions = I('post.permission_ids'); //先删除当前菜单对应的权限记录 if (M('MenuPermission')->where(array('menu_id' => $request_data['id']))->delete() === false) { $this->error = '菜单权限关系重置失败'; return false; } if ($this->permissionHandler($request_data['id'], $permissions) === false) { $this->error = '菜单权限关联失败'; return false; } return true; }
/** * 修改权限,如果不修改父级分类,不执行nestedSets的操作 */ public function savePermission() { //先获取到使用create处理过的数据,使用传值赋值 $data = $this->data; //获取数据表中的数据 $row = $this->find($this->data['id']); //如果当前父级分类和修改后的父级分类不一致,才需要计算左右节点 if ($data['parent_id'] != $row['parent_id']) { $db = D('DbMysql'); $nested_sets = new \Admin\Service\NestedSets($db, 'permission', 'lft', 'rght', 'parent_id', 'id', 'level'); $nested_sets->moveUnder($this->data['id'], $data['parent_id'], 'bottom'); } if (isset($data['status']) && $data['status'] == 0) { $data['name'] .= '_del'; } $this->save($data); //保存用户提交的数据,由于用户没有提交节点和层级,所以不会导致数据被破坏 }
/** * 物理删除,会重拍左右节点及层级。 * @param type $id */ public function delete($id) { $db_mysql_model = D('DbMysql'); $nested_sets = new \Admin\Service\NestedSets($db_mysql_model, 'goods_category', 'lft', 'rght', 'parent_id', 'id', 'level'); $nested_sets->delete($id); }