_pathIds === null) { $path = $this->currentNode->getPathIds(); $this->_pathIds = $path; } return $this->_pathIds; } public function getPathNodes() { if ($this->_pathNodes === null) { $this->_pathNodes = $this->currentNode->getPath(); } return $this->_pathNodes; } /** * @param string|null $name * @return string[] */ public function getNestedNodeTypes($name = null) { $res = array(); if ($name === null) { foreach (NodeTypeHelper::getNodeTypes() as $typeName => $type) if ($type->isRootNode()) { $res[$typeName] = $type->getName(); } } else { foreach (NodeTypeHelper::getNodeType($name)->getNestedTypes() as $typeName) { $res[$typeName] = NodeTypeHelper::getNodeType($typeName)->getName(); } } return $res; } public function createAction($actionID) { if ($actionID == 'type') { $typeActionName = $_GET['action']; $typeName = $this->getCurrentNode()->data_type; $type = NodeTypeHelper::getNodeType($typeName); $action = $type->createAction($typeActionName, $this, $actionID); $action->node = $this->currentNode; $action->nodeType = $this->getCurrentType(); return $action; } else return parent::createAction($actionID); } private function nodeTree($rootNode) { $tree = array(); foreach ($rootNode->nodes as $childNode) { $url = array('type', 'action' => NodeTypeHelper::getNodeType($childNode->data_type)->getDefaultAction(), 'nodeId' => $childNode->id); $item = array( 'text' => CHtml::link($childNode->i18n->label, $url), ); $children = $this->nodeTree($childNode); if (count($children) > 0) $item['children'] = $children; $tree[] = $item; } if (count(NodeTypeHelper::getNodeType($rootNode->data_type)->getNestedTypes())) $tree[] = array( 'text' => CHtml::link('' . 'Добавить', $this->createUrl('create', array('nodeId' => $rootNode->id))) ); if(count($tree)>2){ $tree[] = array( 'text' => CHtml::link('' . 'Упорядочить', $this->createUrl('order', array('nodeId' => $rootNode->id))), ); } return $tree; } public function getSidebarTree() { $data = array(); /** @var $rootNode Node */ foreach (Node::model()->findAll('node_id is null') as $rootNode) { $url = array('type', 'action' => NodeTypeHelper::getNodeType($rootNode->data_type)->getDefaultAction(), 'nodeId' => $rootNode->id); $item = array( 'text' => CHtml::link($rootNode->i18n->label, $url), ); $children = $this->nodeTree($rootNode); if (count($children) > 0) $item['children'] = $children; $data[] = $item; } $data[] = array( 'text' => CHtml::link('' . 'Добавить', $this->createUrl('create')), ); return $data; } public function actionIndex() { $first = Node::model()->find('node_id is null'); if ($first != null) $url = $this->createUrl('type', array('action' => NodeTypeHelper::getNodeType($first->data_type)->getDefaultAction(), 'nodeId' => $first->id)); else $url = $this->createUrl('create'); $this->redirect($url); } public function actionCreate() { $this->layout = 'tree'; $model = new Node; if (isset($this->currentNode)) { $model->nodeTypes = $this->getNestedNodeTypes($this->currentNode->data_type); $model->node_id = $this->currentNode->id; } else $model->nodeTypes = $this->getNestedNodeTypes(); /** @var $i18nModels NodeI18n[] */ $i18nModels = array(); foreach (Yii::app()->params['languages'] as $lang) { $i18nModel = new NodeI18n(); $i18nModel->lang = $lang; $i18nModels[$lang] = $i18nModel; } if (isset($_POST['Node']) || isset($_POST['NodeI18n'])) { if (isset($_POST['Node'])) $model->attributes = $_POST['Node']; $i18nValidation = true; if (isset($_POST['NodeI18n'])) { foreach ($_POST['NodeI18n'] 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(); } $this->redirect(array('type', 'action' => NodeTypeHelper::getNodeType($model->data_type)->getDefaultAction(), 'nodeId' => $model->id)); } } $this->render('create', array( 'model' => $model, 'i18nModels' => $i18nModels, )); } public function actionUpdate($nodeId) { /** @var $model Node */ $model = Node::model()->findByPk($nodeId); /** @var $i18nModels NodeI18n[] */ $i18nModels = array(); foreach (Yii::app()->params['languages'] as $lang) { if (!isset($model->i18ns[$lang])) { $i18nModel = new NodeI18n(); $i18nModel->id = $model->id; $i18nModel->lang = $lang; $i18nModels[$lang] = $i18nModel; } else { $i18nModels[$lang] = $model->i18ns[$lang]; } } if (isset($_POST['Node']) || isset($_POST['NodeI18n'])) { if (isset($_POST['Node'])) $model->attributes = $_POST['Node']; $i18nValidation = $model->validate(); if (isset($_POST['NodeI18n'])) { foreach ($_POST['NodeI18n'] as $lang => $post) { $i18nModels[$lang]->attributes = $post; $i18nValidation = $i18nModels[$lang]->validate() && $i18nValidation; } } if ($i18nValidation) { $model->i18ns = $i18nModels; $model->save(false); foreach ($i18nModels as $i18nModel) { $i18nModel->save(); } $this->refresh(); } } $this->render('update', array( 'model' => $model, 'i18nModels' => $i18nModels, )); } 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 = Node::model()->findByPk($models[$i])) { $model->rank = $i; $model->save(); } } } $url = array('type', 'action' => NodeTypeHelper::getNodeType($this->currentNode->data_type)->getDefaultAction(), 'nodeId' => $this->currentNode->id); $this->redirect($url); } else { $dataProvider = new CActiveDataProvider( 'Node', array( 'pagination' => false, 'criteria' => array( 'order' => '`rank` ASC, id DESC', 'condition'=>"node_id = {$this->getCurrentNodeId()}", ), )); $this->render( 'order', array( 'dataProvider' => $dataProvider, )); } } /** * Deletes a particular model. * If deletion is successful, the browser will be redirected to the 'admin' page. * @param integer $id the ID of the model to be deleted */ public function actionDelete() { if (Yii::app()->request->isPostRequest) { $this->currentNode->delete(); $this->redirect('index'); } else $this->render('delete'); } /** * @return Node */ public function getCurrentNode() { if ($this->_currentNode === null) $this->_currentNode = isset($_GET['nodeId']) ? Node::model()->with('i18n')->findByPk($_GET['nodeId']) : null; return $this->_currentNode; } public function getNodeMenu() { $menu = array( array( 'label' => 'Параметры страницы', 'url' => array('update', 'nodeId' => $this->currentNode->id), 'active' => $this->action->id == 'update', ), ); $currentAction = isset($_GET['action']) ? $_GET['action'] : null; foreach ($this->currentType->actionLabels() as $action => $label) { $menu[] = array( 'label' => $label, 'url' => array('type', 'action' => $action, 'nodeId' => $this->currentNode->id), 'active' => $currentAction == $action, ); } $menu[] = array( 'label' => 'Удалить', 'url' => array('delete', 'nodeId' => $this->currentNode->id), 'active' => $this->action->id == 'delete', ); return $menu; } /** * @return INodeType */ public function getCurrentType() { return NodeTypeHelper::getNodeType($this->getCurrentNode()->data_type); } }