/** * @throws Exception * @throws NotSupportedException */ public function beforeSave() { if ($this->node !== null && !$this->node->getIsNewRecord()) { $this->node->refresh(); } switch ($this->operation) { case self::OPERATION_MAKE_ROOT: $this->owner->setAttribute($this->parentAttribute, null); if ($this->sortable !== false) { $this->owner->setAttribute($this->behavior->sortAttribute, 0); } break; case self::OPERATION_PREPEND_TO: $this->insertIntoInternal(false); break; case self::OPERATION_APPEND_TO: $this->insertIntoInternal(true); break; case self::OPERATION_INSERT_BEFORE: $this->insertNearInternal(false); break; case self::OPERATION_INSERT_AFTER: $this->insertNearInternal(true); break; default: if ($this->owner->getIsNewRecord()) { throw new NotSupportedException('Method "' . $this->owner->className() . '::insert" is not supported for inserting new nodes.'); } } }
/** * @throws Exception */ public function beforeUpdate() { if ($this->node !== null && !$this->node->getIsNewRecord()) { $this->node->refresh(); } switch ($this->operation) { case self::OPERATION_MAKE_ROOT: if ($this->treeAttribute === null) { throw new Exception('Can not move a node as the root when "treeAttribute" is not set.'); } if ($this->isRoot()) { throw new Exception('Can not move the root node as the root.'); } break; case self::OPERATION_INSERT_BEFORE: case self::OPERATION_INSERT_AFTER: if ($this->node->isRoot()) { throw new Exception('Can not move a node before/after root.'); } case self::OPERATION_PREPEND_TO: case self::OPERATION_APPEND_TO: if ($this->node->getIsNewRecord()) { throw new Exception('Can not move a node when the target node is new record.'); } if ($this->owner->equals($this->node)) { throw new Exception('Can not move a node when the target node is same.'); } if ($this->node->isChildOf($this->owner)) { throw new Exception('Can not move a node when the target node is child.'); } } }
/** * @throws Exception * @throws NotSupportedException */ public function beforeSave() { if ($this->node !== null && !$this->node->getIsNewRecord()) { $this->node->refresh(); } switch ($this->operation) { case self::OPERATION_MAKE_ROOT: $this->makeRootInternal(); break; case self::OPERATION_PREPEND_TO: $this->insertIntoInternal(false); break; case self::OPERATION_APPEND_TO: $this->insertIntoInternal(true); break; case self::OPERATION_INSERT_BEFORE: $this->insertNearInternal(false); break; case self::OPERATION_INSERT_AFTER: $this->insertNearInternal(true); break; default: if ($this->owner->getIsNewRecord()) { throw new NotSupportedException('Method "' . $this->owner->className() . '::insert" is not supported for inserting new nodes.'); } $item = $this->owner->getAttribute($this->itemAttribute); $path = $this->getParentPath(); $this->owner->setAttribute($this->pathAttribute, ($path !== null ? $path . $this->delimiter : null) . $item); } }
/** * @throws Exception */ public function beforeUpdate() { if ($this->node !== null && !$this->node->getIsNewRecord()) { $this->node->refresh(); } switch ($this->operation) { case self::OPERATION_MAKE_ROOT: if ($this->treeAttribute === false) { throw new Exception('Can not move a node as the root when "treeAttribute" is false.'); } if ($this->owner->isRoot()) { throw new Exception('Can not move the root node as the root.'); } if (!$this->treeAttributeById) { if ($this->owner->getOldAttribute($this->treeAttribute) === $this->owner->getAttribute($this->treeAttribute)) { throw new Exception('Can not move a node as the root when its tree attribute "' . $this->treeAttribute . '" is not changed.'); } if ($this->owner->find()->andWhere([$this->treeAttribute => $this->owner->getAttribute($this->treeAttribute), $this->leftAttribute => 1])->one()) { throw new Exception('Can not move a node as the root when another root with this "' . $this->treeAttribute . '" already exists.'); } } break; case self::OPERATION_INSERT_BEFORE: case self::OPERATION_INSERT_AFTER: if ($this->node->isRoot()) { throw new Exception('Can not move a node when the target node is root.'); } case self::OPERATION_PREPEND_TO: case self::OPERATION_APPEND_TO: if ($this->node->getIsNewRecord()) { throw new Exception('Can not move a node when the target node is new record.'); } if ($this->owner->equals($this->node)) { throw new Exception('Can not move a node when the target node is same.'); } if ($this->node->isChildOf($this->owner)) { throw new Exception('Can not move a node when the target node is child.'); } } }
/** * @inheritdoc */ public function refresh() { if (!parent::refresh()) { return false; } $dynCol = static::dynamicColumn(); if (isset($this->attributes[$dynCol])) { $this->_dynamicAttributes = static::dynColDecode($this->attributes[$dynCol]); } return true; }
/** * @throws Exception * @throws NotSupportedException */ public function beforeSave() { if ($this->node !== null && !$this->node->getIsNewRecord()) { $this->node->refresh(); } switch ($this->operation) { case self::OPERATION_MAKE_ROOT: $item = $this->owner->getAttribute($this->itemAttribute); if ($item !== null) { $this->owner->setAttribute($this->pathAttribute, $item); } $this->owner->setAttribute($this->depthAttribute, 0); break; case self::OPERATION_PREPEND_TO: $this->checkNode(false); $item = $this->owner->getAttribute($this->itemAttribute); if ($item !== null) { $path = $this->node->getAttribute($this->pathAttribute); $this->owner->setAttribute($this->pathAttribute, $path . $this->delimiter . $item); } $this->owner->setAttribute($this->depthAttribute, $this->node->getAttribute($this->depthAttribute) + 1); if ($this->sortAttribute !== null) { $to = $this->node->getChildren()->orderBy(null)->min($this->sortAttribute); $to = $to !== null ? $to - $this->step : 0; $this->owner->setAttribute($this->sortAttribute, $to); } break; case self::OPERATION_APPEND_TO: $this->checkNode(false); $item = $this->owner->getAttribute($this->itemAttribute); if ($item !== null) { $path = $this->node->getAttribute($this->pathAttribute); $this->owner->setAttribute($this->pathAttribute, $path . $this->delimiter . $item); } $this->owner->setAttribute($this->depthAttribute, $this->node->getAttribute($this->depthAttribute) + 1); if ($this->sortAttribute !== null) { $to = $this->node->getChildren()->orderBy(null)->max($this->sortAttribute); $to = $to !== null ? $to + $this->step : 0; $this->owner->setAttribute($this->sortAttribute, $to); } break; case self::OPERATION_INSERT_BEFORE: $this->checkNode(true); $item = $this->owner->getAttribute($this->itemAttribute); if ($item !== null) { $path = $this->getParentPath($this->node->getAttribute($this->pathAttribute)); $this->owner->setAttribute($this->pathAttribute, $path . $this->delimiter . $item); } $this->owner->setAttribute($this->depthAttribute, $this->node->getAttribute($this->depthAttribute)); if ($this->sortAttribute !== null) { $this->moveTo($this->node->getAttribute($this->sortAttribute) - 1, false); } break; case self::OPERATION_INSERT_AFTER: $this->checkNode(true); $item = $this->owner->getAttribute($this->itemAttribute); if ($item !== null) { $path = $this->getParentPath($this->node->getAttribute($this->pathAttribute)); $this->owner->setAttribute($this->pathAttribute, $path . $this->delimiter . $item); } $this->owner->setAttribute($this->depthAttribute, $this->node->getAttribute($this->depthAttribute)); if ($this->sortAttribute !== null) { $this->moveTo($this->node->getAttribute($this->sortAttribute) + 1, true); } break; default: if ($this->owner->getIsNewRecord()) { throw new NotSupportedException('Method "' . $this->owner->className() . '::insert" is not supported for inserting new nodes.'); } $item = $this->owner->getAttribute($this->itemAttribute); $path = $this->getParentPath($this->owner->getAttribute($this->pathAttribute)); $this->owner->setAttribute($this->pathAttribute, $path . $this->delimiter . $item); } }
/** * @param ActiveRecord $model * @return ActiveRecord * @throws \yii\web\ServerErrorHttpException */ protected function chainSave($model) { $model->scenario = $this->saveScenario; $model->attributes = Yii::$app->getRequest()->post(); if (!$model->save()) { if (YII_DEBUG) { Yii::$app->response->statusCode = 500; Yii::$app->response->format = Response::FORMAT_JSON; var_dump($model->getErrors()); Yii::$app->end(); } throw new ServerErrorHttpException('Do not able to save the model.'); } $model->refresh(); return $model; }