/**
  * Saves a category.
  *
  * @param CategoryModel $category
  *
  * @throws Exception|\Exception
  * @return bool
  */
 public function saveCategory(CategoryModel $category)
 {
     $isNewCategory = !$category->id;
     $hasNewParent = $this->_checkForNewParent($category);
     if ($hasNewParent) {
         if ($category->newParentId) {
             $parentCategory = $this->getCategoryById($category->newParentId, $category->locale);
             if (!$parentCategory) {
                 throw new Exception(Craft::t('No category exists with the ID “{id}”.', array('id' => $category->newParentId)));
             }
         } else {
             $parentCategory = null;
         }
         $category->setParent($parentCategory);
     }
     // Category data
     if (!$isNewCategory) {
         $categoryRecord = CategoryRecord::model()->findById($category->id);
         if (!$categoryRecord) {
             throw new Exception(Craft::t('No category exists with the ID “{id}”.', array('id' => $category->id)));
         }
     } else {
         $categoryRecord = new CategoryRecord();
     }
     $categoryRecord->groupId = $category->groupId;
     $categoryRecord->validate();
     $category->addErrors($categoryRecord->getErrors());
     if ($category->hasErrors()) {
         return false;
     }
     $transaction = craft()->db->getCurrentTransaction() === null ? craft()->db->beginTransaction() : null;
     try {
         // Fire an 'onBeforeSaveCategory' event
         $event = new Event($this, array('category' => $category, 'isNewCategory' => $isNewCategory));
         $this->onBeforeSaveCategory($event);
         // Is the event giving us the go-ahead?
         if ($event->performAction) {
             $success = craft()->elements->saveElement($category);
             // If it didn't work, rollback the transaction in case something changed in onBeforeSaveCategory
             if (!$success) {
                 if ($transaction !== null) {
                     $transaction->rollback();
                 }
                 return false;
             }
             // Now that we have an element ID, save it on the other stuff
             if ($isNewCategory) {
                 $categoryRecord->id = $category->id;
             }
             $categoryRecord->save(false);
             // Has the parent changed?
             if ($hasNewParent) {
                 if (!$category->newParentId) {
                     craft()->structures->appendToRoot($category->getGroup()->structureId, $category);
                 } else {
                     craft()->structures->append($category->getGroup()->structureId, $category, $parentCategory);
                 }
             }
             // Update the category's descendants, who may be using this category's URI in their own URIs
             craft()->elements->updateDescendantSlugsAndUris($category, true, true);
         } else {
             $success = false;
         }
         // Commit the transaction regardless of whether we saved the category, in case something changed
         // in onBeforeSaveCategory
         if ($transaction !== null) {
             $transaction->commit();
         }
     } catch (\Exception $e) {
         if ($transaction !== null) {
             $transaction->rollback();
         }
         throw $e;
     }
     if ($success) {
         // Fire an 'onSaveCategory' event
         $this->onSaveCategory(new Event($this, array('category' => $category, 'isNewCategory' => $isNewCategory)));
     }
     return $success;
 }
 /**
  * Saves a category.
  *
  * @param CategoryModel $category
  *
  * @throws Exception|\Exception
  * @return bool
  */
 public function saveCategory(CategoryModel $category)
 {
     $isNewCategory = !$category->id;
     // Category data
     if (!$isNewCategory) {
         $categoryRecord = CategoryRecord::model()->findById($category->id);
         if (!$categoryRecord) {
             throw new Exception(Craft::t('No category exists with the ID “{id}”', array('id' => $category->id)));
         }
     } else {
         $categoryRecord = new CategoryRecord();
     }
     $categoryRecord->groupId = $category->groupId;
     $categoryRecord->validate();
     $category->addErrors($categoryRecord->getErrors());
     if ($category->hasErrors()) {
         return false;
     }
     $transaction = craft()->db->getCurrentTransaction() === null ? craft()->db->beginTransaction() : null;
     try {
         // Fire an 'onBeforeSaveCategory' event
         $this->onBeforeSaveCategory(new Event($this, array('category' => $category, 'isNewCategory' => $isNewCategory)));
         if (craft()->elements->saveElement($category, false)) {
             // Now that we have an element ID, save it on the other stuff
             if ($isNewCategory) {
                 $categoryRecord->id = $category->id;
             }
             $categoryRecord->save(false);
             if ($isNewCategory) {
                 // Add it to the group's structure
                 craft()->structures->appendToRoot($category->getGroup()->structureId, $category);
             }
             if ($transaction !== null) {
                 $transaction->commit();
             }
         } else {
             return false;
         }
     } catch (\Exception $e) {
         if ($transaction !== null) {
             $transaction->rollback();
         }
         throw $e;
     }
     // If we've made it here, everything has been successful so far.
     // Fire an 'onSaveCategory' event
     $this->onSaveCategory(new Event($this, array('category' => $category, 'isNewCategory' => $isNewCategory)));
     return true;
 }