/** * check old entries - delete if obsolete (changed type) and add new entry to the appropriate cms_nav_item_(page/module/redirect). * * @param $navItemId * @param $navItemType * @param $navItemTypeId * @param $title * @param $alias * * @return array|bool */ public function actionUpdatePageItem($navItemId, $navItemType, $navItemTypeId) { $model = NavItem::find()->where(['id' => $navItemId])->one(); if (!$model) { throw new Exception('Unable to find item id ' . $navItemId); } $model->setParentFromModel(); // save old id $oldNavItemType = $model->nav_item_type; $oldNavItemTypeId = $model->nav_item_type_id; $oldTitle = $model->title; $oldAlias = $model->alias; $model->nav_item_type = $navItemType; $model->title = Yii::$app->request->post('title', false); $model->alias = Yii::$app->request->post('alias', false); $model->description = Yii::$app->request->post('description', null); if (!$model->validate() || !$model->save()) { return $this->sendModelError($model); } $itemModel = null; if ($oldNavItemType == $model->nav_item_type) { switch ($navItemType) { case 1: $itemModel = NavItemPage::find()->where(['id' => $navItemTypeId])->one(); break; case 2: $itemModel = NavItemModule::find()->where(['id' => $navItemTypeId])->one(); break; case 3: $itemModel = NavItemRedirect::find()->where(['id' => $navItemTypeId])->one(); break; } } else { switch ($navItemType) { case 1: $itemModel = new NavItemPage(); break; case 2: $itemModel = new NavItemModule(); break; case 3: $itemModel = new NavItemRedirect(); break; } } switch ($navItemType) { case 1: $this->setPostAttribute($itemModel, 'layout_id'); break; case 2: $this->setPostAttribute($itemModel, 'module_name'); break; case 3: $this->setPostAttribute($itemModel, 'type'); $this->setPostAttribute($itemModel, 'value'); break; } if (!$itemModel->validate() || !$itemModel->save()) { // error: reverse changes in nav item $model->nav_item_type = $oldNavItemType; $model->nav_item_type_id = $oldNavItemTypeId; $model->alias = $oldAlias; $model->title = $oldTitle; $model->update(false); return $this->sendModelError($itemModel); } if ($oldNavItemType != $model->nav_item_type) { $this->deleteItem($oldNavItemType, $oldNavItemTypeId); } // save new type id $model->nav_item_type_id = $itemModel->id; $model->update(false); return true; }
public function actionDelete($navId) { $model = \cmsadmin\models\Nav::find()->where(['id' => $navId])->one(); if ($model) { Yii::$app->menu->flushCache(); // check for internal redirects $redirectResult = false; $redirects = NavItemRedirect::find()->where(['value' => $navId])->asArray()->all(); foreach ($redirects as $redirect) { $navItem = NavItem::find()->where(['nav_item_type' => 3, 'nav_item_type_id' => $redirect['id']])->one(); $redirectResult = empty(Nav::find()->where(['id' => $navItem->nav_id, 'is_deleted' => 0])->one()) ? $redirectResult : true; } if ($redirectResult) { Yii::$app->response->statusCode = 417; return; } $model->is_deleted = 1; foreach (NavItem::find()->where(['nav_id' => $navId])->all() as $navItem) { $navItem->setAttribute('alias', date('Y-m-d-H-i') . '-' . $navItem->alias); $navItem->update(false); } return $model->update(false); } }