/**
  * @param string $assetHandle
  * @param array $assetSourceDefinition
  * @return AssetSourceModel
  */
 private function populateAssetSource($assetHandle, array $assetSourceDefinition)
 {
     $assetSource = $sourceRecord = AssetSourceRecord::model()->findByAttributes(['handle' => $assetHandle]);
     $assetSource = $assetSource ? AssetSourceModel::populateModel($assetSource) : new AssetSourceModel();
     $assetSource->setAttributes(array('handle' => $assetHandle, 'type' => $assetSourceDefinition['type'], 'name' => $assetSourceDefinition['name'], 'sortOrder' => $assetSourceDefinition['sortOrder'], 'settings' => $assetSourceDefinition['settings']));
     return $assetSource;
 }
 /**
  * Saves an asset source.
  *
  * @return null
  */
 public function actionSaveSource()
 {
     craft()->userSession->requireAdmin();
     $this->requirePostRequest();
     $existingSourceId = craft()->request->getPost('sourceId');
     if ($existingSourceId) {
         $source = craft()->assetSources->getSourceById($existingSourceId);
     } else {
         $source = new AssetSourceModel();
     }
     $source->name = craft()->request->getPost('name');
     if (craft()->getEdition() == Craft::Pro) {
         $source->type = craft()->request->getPost('type');
     }
     $typeSettings = craft()->request->getPost('types');
     if (isset($typeSettings[$source->type])) {
         if (!$source->settings) {
             $source->settings = array();
         }
         $source->settings = array_merge($source->settings, $typeSettings[$source->type]);
     }
     // Set the field layout
     $fieldLayout = craft()->fields->assembleLayoutFromPost(false);
     $fieldLayout->type = ElementType::Asset;
     $source->setFieldLayout($fieldLayout);
     // Did it save?
     if (craft()->assetSources->saveSource($source)) {
         craft()->userSession->setNotice(Craft::t('Source saved.'));
         $this->redirectToPostedUrl();
     } else {
         craft()->userSession->setError(Craft::t('Couldn’t save source.'));
     }
     // Send the source back to the template
     craft()->urlManager->setRouteVariables(array('source' => $source));
 }
 /**
  * Gets an asset source by its ID.
  *
  * @param int $sourceId
  * @return AssetSourceModel|null
  */
 public function getSourceById($sourceId)
 {
     $sourceRecord = AssetSourceRecord::model()->findById($sourceId);
     if ($sourceRecord) {
         return AssetSourceModel::populateModel($sourceRecord);
     }
 }
 /**
  * Saves an asset source.
  *
  * @param AssetSourceModel $source
  *
  * @throws \Exception
  * @return bool
  */
 public function saveSource(AssetSourceModel $source)
 {
     $sourceRecord = $this->_getSourceRecordById($source->id);
     $isNewSource = $sourceRecord->isNewRecord();
     if (!$isNewSource) {
         $oldSource = AssetSourceModel::populateModel($sourceRecord);
     }
     $sourceRecord->name = $source->name;
     $sourceRecord->handle = $source->handle;
     $sourceRecord->type = $source->type;
     $sourceRecord->fieldLayoutId = $source->fieldLayoutId;
     $sourceType = $this->populateSourceType($source);
     $processedSettings = $sourceType->prepSettings($source->settings);
     $sourceRecord->settings = $source->settings = $processedSettings;
     $sourceType->setSettings($processedSettings);
     $recordValidates = $sourceRecord->validate();
     $settingsValidate = $sourceType->getSettings()->validate();
     $sourceErrors = $sourceType->getSourceErrors();
     if ($recordValidates && $settingsValidate && empty($sourceErrors)) {
         $transaction = craft()->db->getCurrentTransaction() === null ? craft()->db->beginTransaction() : null;
         try {
             if ($isNewSource) {
                 // Set the sort order
                 $maxSortOrder = craft()->db->createCommand()->select('max(sortOrder)')->from('assetsources')->queryScalar();
                 $sourceRecord->sortOrder = $maxSortOrder + 1;
             }
             if (!$isNewSource && $oldSource->fieldLayoutId) {
                 // Drop the old field layout
                 craft()->fields->deleteLayoutById($oldSource->fieldLayoutId);
             }
             // Save the new one
             $fieldLayout = $source->getFieldLayout();
             craft()->fields->saveLayout($fieldLayout);
             // Update the source record/model with the new layout ID
             $source->fieldLayoutId = $fieldLayout->id;
             $sourceRecord->fieldLayoutId = $fieldLayout->id;
             // Save the source
             $sourceRecord->save(false);
             if ($isNewSource) {
                 // Now that we have a source ID, save it on the model
                 $source->id = $sourceRecord->id;
             } else {
                 // Update the top folder's name with the source's new name
                 $topFolder = craft()->assets->findFolder(array('sourceId' => $source->id, 'parentId' => ':empty:'));
                 if ($topFolder->name != $source->name) {
                     $topFolder->name = $source->name;
                     craft()->assets->storeFolder($topFolder);
                 }
             }
             craft()->assetIndexing->ensureTopFolder($source);
             if ($transaction !== null) {
                 $transaction->commit();
             }
         } catch (\Exception $e) {
             if ($transaction !== null) {
                 $transaction->rollback();
             }
             throw $e;
         }
         if ($isNewSource && $this->_fetchedAllSources) {
             $this->_sourcesById[$source->id] = $source;
         }
         if (isset($this->_viewableSourceIds)) {
             if (craft()->userSession->checkPermission('viewAssetSource:' . $source->id)) {
                 $this->_viewableSourceIds[] = $source->id;
             }
         }
         return true;
     } else {
         $source->addErrors($sourceRecord->getErrors());
         $source->addSettingErrors($sourceType->getSettings()->getErrors());
         $source->addSettingErrors($sourceErrors);
         return false;
     }
 }