/app/code/core/Mage/Adminhtml/Model/Config/Data.php
PHP | 304 lines | 174 code | 36 blank | 94 comment | 31 complexity | 0817646b868680f35e35642413ff7fbe MD5 | raw file
Possible License(s): CC-BY-SA-3.0, LGPL-2.1, GPL-2.0, WTFPL
- <?php
- /**
- * Magento
- *
- * NOTICE OF LICENSE
- *
- * This source file is subject to the Open Software License (OSL 3.0)
- * that is bundled with this package in the file LICENSE.txt.
- * It is also available through the world-wide-web at this URL:
- * http://opensource.org/licenses/osl-3.0.php
- * If you did not receive a copy of the license and are unable to
- * obtain it through the world-wide-web, please send an email
- * to license@magentocommerce.com so we can send you a copy immediately.
- *
- * DISCLAIMER
- *
- * Do not edit or add to this file if you wish to upgrade Magento to newer
- * versions in the future. If you wish to customize Magento for your
- * needs please refer to http://www.magentocommerce.com for more information.
- *
- * @category Mage
- * @package Mage_Adminhtml
- * @copyright Copyright (c) 2010 Magento Inc. (http://www.magentocommerce.com)
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
- */
- /**
- * Adminhtml config data model
- *
- * @category Mage
- * @package Mage_Adminhtml
- * @author Magento Core Team <core@magentocommerce.com>
- */
- class Mage_Adminhtml_Model_Config_Data extends Varien_Object
- {
- /**
- * Save config section
- * Require set: section, website, store and groups
- *
- * @return Mage_Adminhtml_Model_Config_Data
- */
- public function save()
- {
- $this->_validate();
- $this->_getScope();
- $section = $this->getSection();
- $website = $this->getWebsite();
- $store = $this->getStore();
- $groups = $this->getGroups();
- $scope = $this->getScope();
- $scopeId = $this->getScopeId();
- if (empty($groups)) {
- return $this;
- }
- $sections = Mage::getModel('adminhtml/config')->getSections();
- /* @var $sections Mage_Core_Model_Config_Element */
- $oldConfig = $this->_getConfig(true);
- $deleteTransaction = Mage::getModel('core/resource_transaction');
- /* @var $deleteTransaction Mage_Core_Model_Resource_Transaction */
- $saveTransaction = Mage::getModel('core/resource_transaction');
- /* @var $saveTransaction Mage_Core_Model_Resource_Transaction */
- // Extends for old config data
- $oldConfigAdditionalGroups = array();
- foreach ($groups as $group => $groupData) {
- /**
- * Map field names if they were cloned
- */
- $groupConfig = $sections->descend($section.'/groups/'.$group);
- if ($clonedFields = !empty($groupConfig->clone_fields)) {
- if ($groupConfig->clone_model) {
- $cloneModel = Mage::getModel((string)$groupConfig->clone_model);
- } else {
- Mage::throwException('Config form fieldset clone model required to be able to clone fields');
- }
- $mappedFields = array();
- $fieldsConfig = $sections->descend($section.'/groups/'.$group.'/fields');
- if ($fieldsConfig->hasChildren()) {
- foreach ($fieldsConfig->children() as $field => $node) {
- foreach ($cloneModel->getPrefixes() as $prefix) {
- $mappedFields[$prefix['field'].(string)$field] = (string)$field;
- }
- }
- }
- }
- // set value for group field entry by fieldname
- // use extra memory
- $fieldsetData = array();
- foreach ($groupData['fields'] as $field => $fieldData) {
- $fieldsetData[$field] = (is_array($fieldData) && isset($fieldData['value']))
- ? $fieldData['value'] : null;
- }
- foreach ($groupData['fields'] as $field => $fieldData) {
- /**
- * Get field backend model
- */
- $backendClass = $sections->descend($section.'/groups/'.$group.'/fields/'.$field.'/backend_model');
- if (!$backendClass && $clonedFields && isset($mappedFields[$field])) {
- $backendClass = $sections->descend($section.'/groups/'.$group.'/fields/'.$mappedFields[$field].'/backend_model');
- }
- if (!$backendClass) {
- $backendClass = 'core/config_data';
- }
- $dataObject = Mage::getModel($backendClass);
- if (!$dataObject instanceof Mage_Core_Model_Config_Data) {
- Mage::throwException('Invalid config field backend model: '.$backendClass);
- }
- /* @var $dataObject Mage_Core_Model_Config_Data */
- $fieldConfig = $sections->descend($section.'/groups/'.$group.'/fields/'.$field);
- if (!$fieldConfig && $clonedFields && isset($mappedFields[$field])) {
- $fieldConfig = $sections->descend($section.'/groups/'.$group.'/fields/'.$mappedFields[$field]);
- }
- $dataObject
- ->setField($field)
- ->setGroups($groups)
- ->setGroupId($group)
- ->setStoreCode($store)
- ->setWebsiteCode($website)
- ->setScope($scope)
- ->setScopeId($scopeId)
- ->setFieldConfig($fieldConfig)
- ->setFieldsetData($fieldsetData)
- ;
- if (!isset($fieldData['value'])) {
- $fieldData['value'] = null;
- }
- /*if (is_array($fieldData['value'])) {
- $fieldData['value'] = join(',', $fieldData['value']);
- }*/
- $path = $section.'/'.$group.'/'.$field;
- /**
- * Look for custom defined field path
- */
- if (is_object($fieldConfig)) {
- $configPath = (string)$fieldConfig->config_path;
- if (!empty($configPath) && strrpos($configPath, '/') > 0) {
- // Extend old data with specified section group
- $groupPath = substr($configPath, 0, strrpos($configPath, '/'));
- if (!isset($oldConfigAdditionalGroups[$groupPath])) {
- $oldConfig = $this->extendConfig($groupPath, true, $oldConfig);
- $oldConfigAdditionalGroups[$groupPath] = true;
- }
- $path = $configPath;
- }
- }
- $inherit = !empty($fieldData['inherit']);
- $dataObject->setPath($path)
- ->setValue($fieldData['value']);
- if (isset($oldConfig[$path])) {
- $dataObject->setConfigId($oldConfig[$path]['config_id']);
- /**
- * Delete config data if inherit
- */
- if (!$inherit) {
- $saveTransaction->addObject($dataObject);
- }
- else {
- $deleteTransaction->addObject($dataObject);
- }
- }
- elseif (!$inherit) {
- $dataObject->unsConfigId();
- $saveTransaction->addObject($dataObject);
- }
- }
- }
- $deleteTransaction->delete();
- $saveTransaction->save();
- return $this;
- }
- /**
- * Load config data for section
- *
- * @return array
- */
- public function load()
- {
- $this->_validate();
- $this->_getScope();
- return $this->_getConfig(false);
- }
- /**
- * Extend config data with additional config data by specified path
- *
- * @param string $path Config path prefix
- * @param bool $full Simple config structure or not
- * @param array $oldConfig Config data to extend
- * @return array
- */
- public function extendConfig($path, $full = true, $oldConfig = array())
- {
- $extended = $this->_getPathConfig($path, $full);
- if (is_array($oldConfig) && !empty($oldConfig)) {
- return $oldConfig + $extended;
- }
- return $extended;
- }
- /**
- * Validate isset required parametrs
- *
- */
- protected function _validate()
- {
- if (is_null($this->getSection())) {
- $this->setSection('');
- }
- if (is_null($this->getWebsite())) {
- $this->setWebsite('');
- }
- if (is_null($this->getStore())) {
- $this->setStore('');
- }
- }
- /**
- * Get scope name and scopeId
- *
- */
- protected function _getScope()
- {
- if ($this->getStore()) {
- $scope = 'stores';
- $scopeId = (int)Mage::getConfig()->getNode('stores/' . $this->getStore() . '/system/store/id');
- } elseif ($this->getWebsite()) {
- $scope = 'websites';
- $scopeId = (int)Mage::getConfig()->getNode('websites/' . $this->getWebsite() . '/system/website/id');
- } else {
- $scope = 'default';
- $scopeId = 0;
- }
- $this->setScope($scope);
- $this->setScopeId($scopeId);
- }
- /**
- * Return formatted config data for current section
- *
- * @param bool $full Simple config structure or not
- * @return array
- */
- protected function _getConfig($full = true)
- {
- return $this->_getPathConfig($this->getSection(), $full);
- }
- /**
- * Return formatted config data for specified path prefix
- *
- * @param string $path Config path prefix
- * @param bool $full Simple config structure or not
- * @return array
- */
- protected function _getPathConfig($path, $full = true)
- {
- $configDataCollection = Mage::getModel('core/config_data')
- ->getCollection()
- ->addScopeFilter($this->getScope(), $this->getScopeId(), $path);
- $config = array();
- foreach ($configDataCollection as $data) {
- if ($full) {
- $config[$data->getPath()] = array(
- 'path' => $data->getPath(),
- 'value' => $data->getValue(),
- 'config_id' => $data->getConfigId()
- );
- }
- else {
- $config[$data->getPath()] = $data->getValue();
- }
- }
- return $config;
- }
- }