/**
  * Save a category group.
  *
  * @return null
  */
 public function actionSaveGroup()
 {
     $this->requirePostRequest();
     craft()->userSession->requireAdmin();
     $group = new CategoryGroupModel();
     // Set the simple stuff
     $group->id = craft()->request->getPost('groupId');
     $group->name = craft()->request->getPost('name');
     $group->handle = craft()->request->getPost('handle');
     $group->hasUrls = craft()->request->getPost('hasUrls');
     $group->template = craft()->request->getPost('template');
     $group->maxLevels = craft()->request->getPost('maxLevels');
     // Locale-specific URL formats
     $locales = array();
     foreach (craft()->i18n->getSiteLocaleIds() as $localeId) {
         $locales[$localeId] = new CategoryGroupLocaleModel(array('locale' => $localeId, 'urlFormat' => craft()->request->getPost('urlFormat.' . $localeId), 'nestedUrlFormat' => craft()->request->getPost('nestedUrlFormat.' . $localeId)));
     }
     $group->setLocales($locales);
     // Group the field layout
     $fieldLayout = craft()->fields->assembleLayoutFromPost();
     $fieldLayout->type = ElementType::Category;
     $group->setFieldLayout($fieldLayout);
     // Save it
     if (craft()->categories->saveGroup($group)) {
         craft()->userSession->setNotice(Craft::t('Category group saved.'));
         $this->redirectToPostedUrl($group);
     } else {
         craft()->userSession->setError(Craft::t('Couldn’t save the category group.'));
     }
     // Send the category group back to the template
     craft()->urlManager->setRouteVariables(array('categoryGroup' => $group));
 }
 /**
  * Populates a CategoryGroupModel with attributes from a CategoryGroupRecord.
  *
  * @param CategoryGroupRecord|null
  *
  * @return CategoryGroupModel|null
  */
 private function _populateCategoryGroupFromRecord($groupRecord)
 {
     if (!$groupRecord) {
         return null;
     }
     $group = CategoryGroupModel::populateModel($groupRecord);
     if ($groupRecord->structure) {
         $group->maxLevels = $groupRecord->structure->maxLevels;
     }
     return $group;
 }
 /**
  * Creates initial database content for InstaBlog.
  *
  * @return null
  */
 private function _createInstaBlogContent()
 {
     // InstaBlog tag group
     Craft::log('Creating the InstaBlog tag group.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $tagGroup = new TagGroupModel();
     $tagGroup->name = 'InstaBlog Tags';
     $tagGroup->handle = 'instaBlogTags';
     // Save it
     if (craft()->tags->saveTagGroup($tagGroup)) {
         Craft::log('InstaBlog tag group created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog tag group.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // InstaBlog field group
     Craft::log('Creating the InstaBlog field group.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $group = new FieldGroupModel();
     $group->name = 'InstaBlog';
     if (craft()->fields->saveGroup($group)) {
         Craft::log('InstaBlog field group created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog field group.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Body field
     Craft::log('Creating the InstaBlog Body field.');
     $bodyField = new FieldModel();
     $bodyField->groupId = $group->id;
     $bodyField->name = 'InstaBlog Body';
     $bodyField->handle = 'instaBlogBody';
     $bodyField->translatable = true;
     $bodyField->type = 'RichText';
     $bodyField->settings = array('configFile' => 'Standard.json', 'columnType' => ColumnType::Text);
     if (craft()->fields->saveField($bodyField)) {
         Craft::log('InstaBlog Body field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog Body field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Facebook field
     Craft::log('Creating the InstaBlog Facebook field.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $facebookField = new FieldModel();
     $facebookField->groupId = $group->id;
     $facebookField->name = 'Facebook';
     $facebookField->handle = 'instaBlogFacebook';
     $facebookField->translatable = false;
     $facebookField->type = 'PlainText';
     $facebookField->instructions = 'Add your personal Facebook profile link. Example: https://www.facebook.com/xxxxxxxxxx';
     if (craft()->fields->saveField($facebookField)) {
         Craft::log('Facebook field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the Facebook field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Twitter Handle field
     Craft::log('Creating the InstaBlog Twitter field.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $twitterField = new FieldModel();
     $twitterField->groupId = $group->id;
     $twitterField->name = 'Twitter';
     $twitterField->handle = 'instaBlogTwitter';
     $twitterField->translatable = false;
     $twitterField->type = 'PlainText';
     $twitterField->instructions = 'Add your personal Twitter handle. Example: @johndoe';
     if (craft()->fields->saveField($twitterField)) {
         Craft::log('Twitter field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the Twitter field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Google+ field
     Craft::log('Creating the InstaBlog Google+ field.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $googlePlusField = new FieldModel();
     $googlePlusField->groupId = $group->id;
     $googlePlusField->name = 'Google+';
     $googlePlusField->handle = 'instaBlogGooglePlus';
     $googlePlusField->translatable = false;
     $googlePlusField->type = 'PlainText';
     $googlePlusField->instructions = 'Add your personal Google+ profile link. Example: https://plus.google.com/+JohnDoe';
     if (craft()->fields->saveField($googlePlusField)) {
         Craft::log('Google+ field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the Google+ field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // LinkedIn field
     Craft::log('Creating the InstaBlog LinkedIn field.');
     $linkedinField = new FieldModel();
     $linkedinField->groupId = $group->id;
     $linkedinField->name = 'LinkedIn';
     $linkedinField->handle = 'instaBlogLinkedin';
     $linkedinField->translatable = false;
     $linkedinField->type = 'PlainText';
     $linkedinField->instructions = 'Add your personal LinkedIn profile link. Example: https://www.linkedin.com/pub/john-doe/3/7aa/91b';
     if (craft()->fields->saveField($linkedinField)) {
         Craft::log('LinkedIn field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the LinkedIn field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Create the new user field layout
     Craft::log('Creating the new user profile layout.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $userFieldLayout = craft()->fields->getLayoutByType(ElementType::User);
     $fieldsIds = $userFieldLayout->getFieldIds();
     $fieldsIds[] = $facebookField->id;
     $fieldsIds[] = $twitterField->id;
     $fieldsIds[] = $googlePlusField->id;
     $fieldsIds[] = $linkedinField->id;
     craft()->fields->deleteLayoutsByType(ElementType::User);
     $userFieldLayout = craft()->fields->assembleLayout(array(Craft::t('Profile') => $fieldsIds), array(), false);
     $userFieldLayout->type = ElementType::User;
     if (craft()->fields->saveLayout($userFieldLayout, false)) {
         Craft::log('User profile layout saved successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the user profile layout.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Tags field
     Craft::log('Creating the Tags field.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $tagsField = new FieldModel();
     $tagsField->groupId = $group->id;
     $tagsField->name = 'InstaBlog Tags';
     $tagsField->handle = 'instaBlogTags';
     $tagsField->type = 'Tags';
     $tagsField->settings = array('source' => 'taggroup:' . $tagGroup->id);
     if (craft()->fields->saveField($tagsField)) {
         Craft::log('InstaBlog Tags field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog Tags field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // InstaBlog category group
     Craft::log('Creating the InstaBlog category group.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $categoryGroup = new CategoryGroupModel();
     $categoryGroup->name = 'InstaBlog Categories';
     $categoryGroup->handle = 'instaBlogCategories';
     $categoryGroup->template = 'blog/category';
     $categoryGroup->maxLevels = 1;
     // Locale-specific URL formats
     $locales = array();
     foreach (craft()->i18n->getSiteLocaleIds() as $localeId) {
         $locales[$localeId] = new CategoryGroupLocaleModel(array('locale' => $localeId, 'urlFormat' => 'blog/category/{slug}', 'nestedUrlFormat' => null));
     }
     $categoryGroup->setLocales($locales);
     // Group the field layout
     $categoryFieldLayout = craft()->fields->assembleLayout(array('Content' => array($bodyField->id)), array());
     $categoryFieldLayout->type = ElementType::Category;
     $categoryGroup->setFieldLayout($categoryFieldLayout);
     // Save it
     if (craft()->categories->saveGroup($categoryGroup)) {
         Craft::log('InstaBlog category group created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog category group.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Categories field
     Craft::log('Creating the InstaBlog Category field.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $categoriesField = new FieldModel();
     $categoriesField->groupId = $group->id;
     $categoriesField->name = 'InstaBlog Categories';
     $categoriesField->handle = 'instaBlogCategories';
     $categoriesField->type = 'Categories';
     $categoriesField->settings = array('source' => 'group:' . $categoryGroup->id);
     if (craft()->fields->saveField($categoriesField)) {
         Craft::log('InstaBlog Category field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog Category field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // Asset field
     Craft::log('Creating the InstaBlog Asset field.');
     $assetField = new FieldModel();
     $assetField->groupId = $group->id;
     $assetField->name = 'Featured Image';
     $assetField->handle = 'instaBlogImage';
     $assetField->translatable = false;
     $assetField->type = 'Assets';
     $assetField->settings = array('sources' => '*');
     if (craft()->fields->saveField($assetField)) {
         Craft::log('Asset field created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the Asset field.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // InstaBlog section
     Craft::log('Creating the InstaBlog section.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $instaBlogSection = new SectionModel();
     $instaBlogSection->type = SectionType::Channel;
     $instaBlogSection->name = 'InstaBlog';
     $instaBlogSection->handle = 'instaBlog';
     $instaBlogSection->hasUrls = true;
     $instaBlogSection->template = 'blog/_entry';
     // Locale-specific URL formats
     $locales = array();
     if (craft()->isLocalized()) {
         $localeIds = craft()->i18n->getSiteLocaleIds();
     } else {
         $primaryLocaleId = craft()->i18n->getPrimarySiteLocaleId();
         $localeIds = array($primaryLocaleId);
     }
     foreach ($localeIds as $localeId) {
         $locales[$localeId] = new SectionLocaleModel(array('locale' => $localeId, 'enabledByDefault' => true, 'urlFormat' => 'blog/{slug}'));
     }
     $instaBlogSection->setLocales($locales);
     if (craft()->sections->saveSection($instaBlogSection)) {
         Craft::log('InstaBlog section created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog section.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // InstaBlog section entry type layout
     Craft::log('Saving the InstaBlog entry type.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     $instaBlogLayout = craft()->fields->assembleLayout(array('Content' => array($bodyField->id, $assetField->id, $categoriesField->id, $tagsField->id)), array($bodyField->id));
     $instaBlogLayout->type = ElementType::Entry;
     $instaBlogEntryTypes = $instaBlogSection->getEntryTypes();
     $instaBlogEntryType = $instaBlogEntryTypes[0];
     $instaBlogEntryType->setFieldLayout($instaBlogLayout);
     if (craft()->sections->saveEntryType($instaBlogEntryType)) {
         Craft::log('InstaBlog entry type saved successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog entry type.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     // InstaBlog entry
     Craft::log('Creating a InstaBlog entry.');
     $instaBlogEntry = new EntryModel();
     $instaBlogEntry->sectionId = $instaBlogSection->id;
     $instaBlogEntry->typeId = $instaBlogEntryType->id;
     $instaBlogEntry->locale = $primaryLocaleId;
     $instaBlogEntry->authorId = craft()->userSession->getId();
     $instaBlogEntry->enabled = true;
     $instaBlogEntry->getContent()->title = 'We just installed InstaBlog!';
     $instaBlogEntry->getContent()->setAttributes(array('instaBlogBody' => '<p>' . 'Collaboratively administrate empowered markets via plug-and-play networks. Dynamically procrastinate B2C users after installed base benefits. Dramatically visualize customer directed convergence without revolutionary ROI.' . '</p><p>Efficiently unleash cross-media information without cross-media value. Quickly maximize timely deliverables for real-time schemas. Dramatically maintain clicks-and-mortar solutions without functional solutions.' . '</p><p>Completely synergize resource taxing relationships via premier niche markets. Professionally cultivate one-to-one customer service with robust ideas. Dynamically innovate resource-leveling customer service for state of the art customer service.' . '</p>'));
     if (craft()->entries->saveEntry($instaBlogEntry)) {
         Craft::log('InstaBlog entry created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not save the InstaBlog entry.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     //Create Route for Tags
     $urlParts = array('blog/tag/', array('*', '[^\\/]+'));
     $template = 'blog/tag';
     if (craft()->routes->saveRoute($urlParts, $template)) {
         Craft::log('InstaBlog tag route created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not create the InstaBlog tag route.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
     //Create Route for Tags
     $urlParts = array('blog/author/', array('*', '[^\\/]+'));
     $template = 'blog/author';
     if (craft()->routes->saveRoute($urlParts, $template)) {
         Craft::log('InstaBlog author route created successfully.', LogLevel::Info, true, '_createInstaBlogContent', 'InstaBlog');
     } else {
         Craft::log('Could not create the InstaBlog author route.', LogLevel::Error, true, '_createInstaBlogContent', 'InstaBlog');
     }
 }