/** * Persists this object to the database. * * If the object is new, it inserts it; otherwise an update is performed. * All modified related objects will also be persisted in the doSave() * method. This method wraps all precipitate database operations in a * single transaction. * * @param PropelPDO $con * @return int The number of rows affected by this insert/update and any referring fk objects' save() operations. * @throws PropelException * @throws Exception * @see doSave() */ public function save(PropelPDO $con = null) { if ($this->isDeleted()) { throw new PropelException("You cannot save an object that has been deleted."); } if ($con === null) { $con = Propel::getConnection(PagePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); } $con->beginTransaction(); $isInsert = $this->isNew(); try { $ret = $this->preSave($con); // nested_set behavior if ($this->isNew() && $this->isRoot()) { // check if no other root exist in, the tree $nbRoots = PageQuery::create()->addUsingAlias(PagePeer::LEFT_COL, 1, Criteria::EQUAL)->count($con); if ($nbRoots > 0) { throw new PropelException('A root node already exists in this tree. To allow multiple root nodes, add the `use_scope` parameter in the nested_set behavior tag.'); } } $this->processNestedSetQueries($con); if ($isInsert) { $ret = $ret && $this->preInsert($con); // denyable behavior if (!(PagePeer::isIgnoringRights() || $this->mayOperate("insert"))) { throw new PropelException(new NotPermittedException("insert.custom", array("role_key" => "pages"))); } // extended_timestampable behavior if (!$this->isColumnModified(PagePeer::CREATED_AT)) { $this->setCreatedAt(time()); } if (!$this->isColumnModified(PagePeer::UPDATED_AT)) { $this->setUpdatedAt(time()); } // attributable behavior if (Session::getSession()->isAuthenticated()) { if (!$this->isColumnModified(PagePeer::CREATED_BY)) { $this->setCreatedBy(Session::getSession()->getUser()->getId()); } if (!$this->isColumnModified(PagePeer::UPDATED_BY)) { $this->setUpdatedBy(Session::getSession()->getUser()->getId()); } } } else { $ret = $ret && $this->preUpdate($con); // denyable behavior if (!(PagePeer::isIgnoringRights() || $this->mayOperate("update"))) { throw new PropelException(new NotPermittedException("update.custom", array("role_key" => "pages"))); } // extended_timestampable behavior if ($this->isModified() && !$this->isColumnModified(PagePeer::UPDATED_AT)) { $this->setUpdatedAt(time()); } // attributable behavior if (Session::getSession()->isAuthenticated()) { if ($this->isModified() && !$this->isColumnModified(PagePeer::UPDATED_BY)) { $this->setUpdatedBy(Session::getSession()->getUser()->getId()); } } } if ($ret) { $affectedRows = $this->doSave($con); if ($isInsert) { $this->postInsert($con); } else { $this->postUpdate($con); } $this->postSave($con); PagePeer::addInstanceToPool($this); } else { $affectedRows = 0; } $con->commit(); return $affectedRows; } catch (Exception $e) { $con->rollBack(); throw $e; } }
protected function moveSubtreeTo($destLeft, $levelDelta, PropelPDO $con = null) { $oOldParent = $this->getParent($con); $oNewParent = PageQuery::create()->filterByTreeLeft($destLeft, Criteria::LESS_THAN)->filterByTreeRight($destLeft, Criteria::GREATER_EQUAL)->filterByTreeLevel($this->getLevel() + $levelDelta - 1)->findOne(); // Copied from denyable behavior if (!(PagePeer::isIgnoringRights() || $this->mayMoveFromTo($oOldParent, $oNewParent))) { throw new PropelException(new NotPermittedException("move.custom.pages", array("role_key" => "pages"))); } return parent::moveSubtreeTo($destLeft, $levelDelta, $con); }