/** * 获取指定用户的所有菜单id记录 * * @param int $userId 用户id * @return array */ public static function getAllMenuIdArrByUserId($userId) { $data = static::find()->findByUserId($userId)->asArray()->all(); $menuIdArr = []; foreach ($data as $item) { $menu = DpAdminMenu::find()->findByMenuId($item['menu_id'])->asArray()->one(); if ($menu) { $menuIdArr[] = $item['menu_id']; } } return $menuIdArr; }
/** * 更新状态 * * @return array */ public function actionUpdateStatus() { $ids = Yii::$app->request->post('ids'); $status = intval(Yii::$app->request->post('status')); if ($status != 0) { $status = 1; } foreach (StringHelper::explode($ids, ',', true, true) as $id) { $obj = DpAdminMenu::find()->findByMenuId($id)->one(); if ($obj) { $obj->status = $status; $obj->save(); } } return $this->renderSuccess('状态更新成功'); }
/** * 更新排序 * * @return bool */ public function updateSort() { if ($this->validate()) { $srcMenuModels = DpAdminMenu::find()->andFilterWhere(['in', 'menu_id', $this->menu_ids])->orderBy([new Expression('field(menu_id, ' . join(',', $this->menu_ids) . ')')])->all(); $targetMenuModel = DpAdminMenu::find()->findByMenuId($this->target_menu_id)->one(); $menuModels = DpAdminMenu::find()->findByParentId($targetMenuModel->parent_id)->defaultOrder()->all(); $srcMenuIds = ArrayHelper::getColumn($srcMenuModels, 'menu_id'); if ($srcMenuModels && $targetMenuModel && $menuModels) { if (static::POSITION_BEFORE == $this->position) { $displayOrder = -1; $transaction = Yii::$app->db->beginTransaction(); foreach ($menuModels as $itemMenuModel) { if (in_array($itemMenuModel->menu_id, $srcMenuIds)) { continue; } $displayOrder++; if ($targetMenuModel->menu_id == $itemMenuModel->menu_id) { // before foreach ($srcMenuModels as $itemSrcMenuMode) { $itemSrcMenuMode->display_order = $displayOrder; $itemSrcMenuMode->parent_id = $targetMenuModel->parent_id; if (!$itemSrcMenuMode->save()) { $transaction->rollBack(); $this->addErrors($itemSrcMenuMode->errors); return false; } $displayOrder++; } // target $targetMenuModel->display_order = $displayOrder; if (!$targetMenuModel->save()) { $transaction->rollBack(); $this->addErrors($targetMenuModel->errors); return false; } continue; } $itemMenuModel->display_order = $displayOrder; if (!$itemMenuModel->save()) { $transaction->rollBack(); $this->addErrors($itemMenuModel->errors); return false; } } $transaction->commit(); return true; } elseif (static::POSITION_AFTER == $this->position) { $displayOrder = -1; $transaction = Yii::$app->db->beginTransaction(); foreach ($menuModels as $itemMenuModel) { if (in_array($itemMenuModel->menu_id, $srcMenuIds)) { continue; } $displayOrder++; if ($targetMenuModel->menu_id == $itemMenuModel->menu_id) { // target $targetMenuModel->display_order = $displayOrder; if (!$targetMenuModel->save()) { $transaction->rollBack(); $this->addErrors($targetMenuModel->errors); return false; } $displayOrder++; // after foreach ($srcMenuModels as $itemSrcMenuMode) { $itemSrcMenuMode->display_order = $displayOrder; $itemSrcMenuMode->parent_id = $targetMenuModel->parent_id; if (!$itemSrcMenuMode->save()) { $transaction->rollBack(); $this->addErrors($itemSrcMenuMode->errors); return false; } $displayOrder++; } continue; } $itemMenuModel->display_order = $displayOrder; if (!$itemMenuModel->save()) { $transaction->rollBack(); $this->addErrors($itemMenuModel->errors); return false; } } $transaction->commit(); return true; } elseif (static::POSITION_APPEND == $this->position) { $menuModels = DpAdminMenu::find()->findByParentId($targetMenuModel->menu_id)->defaultOrder()->all(); if ($menuModels) { // 将目标菜单设置成该目标元素下的最后一个元素 $targetParentMenuModels = DpAdminMenu::find()->findByParentId($targetMenuModel->menu_id)->defaultOrder()->all(); $targetMenuModel = array_pop($targetParentMenuModels); $displayOrder = -1; $transaction = Yii::$app->db->beginTransaction(); foreach ($menuModels as $itemMenuModel) { if (in_array($itemMenuModel->menu_id, $srcMenuIds)) { continue; } $displayOrder++; if ($targetMenuModel->menu_id == $itemMenuModel->menu_id) { // target $targetMenuModel->display_order = $displayOrder; if (!$targetMenuModel->save()) { $transaction->rollBack(); $this->addErrors($targetMenuModel->errors); return false; } $displayOrder++; // after foreach ($srcMenuModels as $itemSrcMenuMode) { $itemSrcMenuMode->display_order = $displayOrder; $itemSrcMenuMode->parent_id = $targetMenuModel->parent_id; if (!$itemSrcMenuMode->save()) { $transaction->rollBack(); $this->addErrors($itemSrcMenuMode->errors); return false; } $displayOrder++; } continue; } $itemMenuModel->display_order = $displayOrder; if (!$itemMenuModel->save()) { $transaction->rollBack(); $this->addErrors($itemMenuModel->errors); return false; } } } else { $displayOrder = 0; // 菜单没有节点时 $transaction = Yii::$app->db->beginTransaction(); foreach ($srcMenuModels as $itemSrcMenuMode) { $itemSrcMenuMode->display_order = $displayOrder; $itemSrcMenuMode->parent_id = $targetMenuModel->menu_id; if (!$itemSrcMenuMode->save()) { $transaction->rollBack(); $this->addErrors($itemSrcMenuMode->errors); return false; } $displayOrder++; } } $transaction->commit(); return true; } } } return false; }
/** * 拖拽排序 * * @return bool */ public function dragSort() { if ($this->validate()) { $menuModel = DpAdminMenu::find()->findByMenuId($this->target_menu_id)->one(); // 调整排序的菜单id $dropMenuIdArr = array_filter(StringHelper::explode($this->menu_ids, ',', true, true), function ($value) { return is_numeric($value) && DpAdminMenu::find()->findByMenuId($value)->exists(); }); // 调整排序菜单数量 $dropCount = count($dropMenuIdArr); if (static::POSITION_BEFORE == $this->position) { // 节点之前 $menuAllObj = DpAdminMenu::find()->findByParentId($menuModel->parent_id)->orderBy('display_order asc')->all(); // 将要插入的菜单前面的排序向前移动 // 插入的开始排序号 $startOrder = $menuModel->display_order - 1; $otherStartOrder = $startOrder - $dropCount; foreach ($menuAllObj as $menuObj) { if ($menuObj->menu_id == $menuModel->menu_id) { break; } $menuObj->display_order = $otherStartOrder--; $menuObj->save(); } $dropStartOrder = $menuModel->display_order - $dropCount; foreach ($dropMenuIdArr as $menuId) { $dropMenu = DpAdminMenu::find()->findByMenuId($menuId)->one(); if ($dropMenu) { $dropMenu->parent_id = $menuModel->parent_id; $dropMenu->display_order = $dropStartOrder++; $dropMenu->save(); } } return true; } elseif (static::POSITION_AFTER == $this->position) { // 节点之后 // 在菜单后插入 $menuAllObj = DpAdminMenu::find()->findByParentId($menuModel->parent_id)->andWhere('menu_id not in (' . join(',', $dropMenuIdArr) . ')')->all(); // 将要插入的菜单后面的排序向后移动 // 插入的开始排序号 $isStartOrder = false; $startOrder = $menuModel->display_order + 1; $otherStartOrder = $startOrder + $dropCount; foreach ($menuAllObj as $menuObj) { if ($menuObj->menu_id == $menuModel->menu_id) { $isStartOrder = true; continue; } if (!$isStartOrder) { continue; } $menuObj->display_order = $otherStartOrder++; $menuObj->save(); } foreach ($dropMenuIdArr as $menuId) { $dropMenu = DpAdminMenu::find()->findByMenuId($menuId)->one(); if ($dropMenu) { $dropMenu->parent_id = $menuModel->parent_id; $dropMenu->display_order = $startOrder++; $dropMenu->save(); } } return true; } elseif (static::POSITION_APPEND == $this->position) { // 节点内 // 添加为子节点 $maxDisplayOrder = DpAdminMenu::find()->findByParentId($menuModel->menu_id)->max('display_order'); foreach ($dropMenuIdArr as $menuId) { $dropMenu = DpAdminMenu::find()->findByMenuId($menuId)->one(); if ($dropMenu) { $dropMenu->parent_id = $menuModel->menu_id; $dropMenu->display_order = ++$maxDisplayOrder; $dropMenu->save(); } } return true; } } return false; }