/**
  * 获取指定用户的所有菜单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('状态更新成功');
 }
Esempio n. 3
0
 /**
  * 更新排序
  *
  * @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;
 }