i18ModelName)) $this->i18ModelName = $this->modelName . 'I18n'; } public function run($crudAction = 'admin') { $this->init(); switch ($crudAction) { case 'admin': $this->actionAdmin(); break; case 'create': $this->actionCreate(); break; case 'update': $this->actionUpdate($_GET['id']); break; case 'delete': $this->actionDelete($_GET['id']); break; case 'order': $this->actionOrder(); break; } } public function actionCreate() { /** @var $model INodeCrudModel|CActiveRecord */ $model = new $this->modelName; $model->setNode($this->node); $i18nModels = array(); foreach (Yii::app()->params['languages'] as $lang) { $i18nModel = new $this->i18ModelName; $i18nModel->lang = $lang; $i18nModels[$lang] = $i18nModel; } if (isset($_POST[$this->modelName]) || isset($_POST[$this->i18ModelName])) { if (isset($_POST[$this->modelName])) $model->attributes = $_POST[$this->modelName]; $i18nValidation = true; if (isset($_POST[$this->i18ModelName])) { foreach ($_POST[$this->i18ModelName] as $lang => $post) { $i18nModels[$lang]->attributes = $post; $i18nValidation = $i18nValidation && $i18nModels[$lang]->validate(); } } if ($model->validate() && $i18nValidation) { $model->i18ns = $i18nModels; $model->save(false); foreach ($i18nModels as $i18nModel) { $i18nModel->id = $model->id; $i18nModel->save(); } $params =array('crudAction' => 'admin') + $_GET; unset($params['id']); $this->controller->redirect($this->controller->createUrl('', $params)); } } $this->controller->render($this->resolveView('create'), array( 'model' => $model, 'i18nModels' => $i18nModels, )); } public function actionUpdate($id) { $model = $this->loadModel($id); $i18nModels = array(); foreach (Yii::app()->params['languages'] as $lang) { if (!isset($model->i18ns[$lang])) { $i18nModel = new $this->i18ModelName; $i18nModel->id = $model->id; $i18nModel->lang = $lang; $i18nModels[$lang] = $i18nModel; } else { $i18nModels[$lang] = $model->i18ns[$lang]; } } if (isset($_POST[$this->modelName]) || isset($_POST[$this->i18ModelName])) { if (isset($_POST[$this->modelName])) $model->attributes = $_POST[$this->modelName]; $i18nValidation = true; if (isset($_POST[$this->i18ModelName])) { foreach ($_POST[$this->i18ModelName] as $lang => $post) { $i18nModels[$lang]->attributes = $post; $i18nValidation = $i18nValidation && $i18nModels[$lang]->validate(); } } if ($model->validate() && $i18nValidation) { $model->i18ns = $i18nModels; $model->save(false); foreach ($i18nModels as $i18nModel) { $i18nModel->save(); } $params =array('crudAction' => 'admin') + $_GET; unset($params['id']); $this->controller->redirect($this->controller->createUrl('', $params)); } } $this->controller->render($this->resolveView('update'), array( 'model' => $model, 'i18nModels' => $i18nModels, )); } public function actionDelete($id) { if (Yii::app()->request->isPostRequest) { $model = $this->loadModel($id); $model->delete(); if (!isset($_GET['ajax'])) $this->controller->redirect( isset($_POST['returnUrl']) ? $_POST['returnUrl'] : $this->controller->createUrl('', array('crudAction' => 'admin') + $_GET) ); } else throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.'); } public function actionAdmin() { /** @var $model CActiveRecord|INodeCrudModel */ $model = new $this->modelName('search'); $model->unsetAttributes(); // clear any default values $model->setNode($this->node); foreach ($model->getAttributes() as $k => $v) { if (isset($_GET[$k])) { $model->$k = $_GET[$k]; } } if (isset($_GET[$this->modelName])) $model->attributes = $_GET[$this->modelName]; $this->controller->render($this->resolveView('admin'), array( 'model' => $model, )); } public function actionOrder() { if (Yii::app()->request->isPostRequest && isset($_POST['Order'])) { if ($_POST['Order'] != 'none') { $models = explode(',', $_POST['Order']); for ($i = 0; $i < sizeof($models); $i++) { if ($model = $this->loadModel($models[$i])) { $model->rank = $i; $model->save(); } } } $this->controller->redirect($this->controller->createUrl('', array('crudAction' => 'admin') + $_GET)); } else { $dataProvider = new CActiveDataProvider( $this->modelName, array( 'pagination' => false, 'criteria' => array( 'condition' => $this->orderCondition(), 'order' => '`rank` ASC, id DESC', ), )); $this->controller->render( $this->resolveView('order'), array( 'dataProvider' => $dataProvider, )); } } /** * Returns the data model based on the primary key given in the GET variable. * If the data model is not found, an HTTP exception will be raised. * @param $id * @throws CHttpException * @return CActiveRecord * @internal param \the $integer ID of the model to be loaded */ public function loadModel($id) { $class = $this->modelName; $model = call_user_func_array(array(&$class, 'model'), array()); $model = $model->findByPk($id); if ($model === null) throw new CHttpException(404, 'The requested page does not exist.'); return $model; } /** * @return string */ public function orderCondition(){ return ''; } }