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); //保存用户提交的数据,由于用户没有提交节点和层级,所以不会导致数据被破坏 }
/** * 保存分类的修改。 * 如果父级分类没有变化,使用nestedSets一定会返回false * 所以我们要区别对待,修改父级分类和不修改进行判断。 * @return boolean */ public function save() { /** * 此处不要使用find查询原来的数据,原因是,find会对当前对象的data属性进行修改,修改为数据库中的内容 * 从而导致$this->create()收集到的数据被污染 */ $parent_id = $this->getFieldById($this->data['id'], 'parent_id'); if ($parent_id != $this->data['parent_id']) { //>>1.执行sql的对象 $db_mysql_model = new \Admin\Model\DbMysqlModel(); //>>2.完成业务运算的对象 $nested_sets = new \Admin\Service\NestedSets($db_mysql_model, 'goods_category', 'lft', 'rght', 'parent_id', 'id', 'level'); $result = $nested_sets->moveUnder($this->data['id'], $this->data['parent_id'], 'bottom'); if ($result === false) { $this->error = '移动失败!不能够移动到自己的子节点下!'; return false; } } //>>4.更新其他表单字段中的数据 return parent::save(); }