/** * @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; }
/** * 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; } }