/** * Save config section * Require set: section, website, store and groups * * @return Mage_Backend_Model_Config */ public function save() { $this->_validate(); $this->_getScope(); $this->_eventManager->dispatch('model_config_data_save_before', array('object' => $this)); $sectionId = $this->getSection(); $groups = $this->getGroups(); if (empty($groups)) { return $this; } $oldConfig = $this->_getConfig(true); $deleteTransaction = $this->_transactionFactory->create(); /* @var $deleteTransaction Mage_Core_Model_Resource_Transaction */ $saveTransaction = $this->_transactionFactory->create(); /* @var $saveTransaction Mage_Core_Model_Resource_Transaction */ // Extends for old config data $extraOldGroups = array(); foreach ($groups as $groupId => $groupData) { $this->_processGroup($groupId, $groupData, $groups, $sectionId, $extraOldGroups, $oldConfig, $saveTransaction, $deleteTransaction); } $deleteTransaction->delete(); $saveTransaction->save(); return $this; }
/** * Save config section * Require set: section, website, store and groups * * @return Mage_Backend_Model_Config */ public function save() { $this->_validate(); $this->_getScope(); $this->_eventManager->dispatch('model_config_data_save_before', array('object' => $this)); $section = $this->getSection(); $website = $this->getWebsite(); $store = $this->getStore(); $groups = $this->getGroups(); $scope = $this->getScope(); $scopeId = $this->getScopeId(); if (empty($groups)) { return $this; } $sections = $this->_structureReader->getConfiguration()->getSections(); $oldConfig = $this->_getConfig(true); $deleteTransaction = $this->_transactionFactory->create(); /* @var $deleteTransaction Mage_Core_Model_Resource_Transaction */ $saveTransaction = $this->_transactionFactory->create(); /* @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[$section]['groups'][$group]; if ($clonedFields = isset($groupConfig['clone_fields']) && !empty($groupConfig['clone_fields'])) { if (isset($groupConfig['clone_model']) && $groupConfig['clone_model']) { $cloneModel = $this->_objectFactory->getModelInstance((string) $groupConfig['clone_model']); } else { Mage::throwException('Config form fieldset clone model required to be able to clone fields'); } $mappedFields = array(); if (isset($groupConfig['fields'])) { $fieldsConfig = $groupConfig['fields']; foreach ($fieldsConfig 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 */ if (isset($groupConfig['fields'][$field]['backend_model'])) { $backendClass = $groupConfig['fields'][$field]['backend_model']; } else { if ($clonedFields && isset($mappedFields[$field]) && isset($groupConfig['fields'][$mappedFields[$field]]['backend_model'])) { $backendClass = $groupConfig['fields'][$mappedFields[$field]]['backend_model']; } else { $backendClass = 'Mage_Core_Model_Config_Data'; } } /* @var $dataObject Mage_Core_Model_Config_Data */ $dataObject = $this->_objectFactory->getModelInstance($backendClass); if (!$dataObject instanceof Mage_Core_Model_Config_Data) { Mage::throwException('Invalid config field backend model: ' . $backendClass); } if (isset($groupConfig['fields'][$field])) { $fieldConfig = $groupConfig['fields'][$field]; } else { if ($clonedFields && isset($mappedFields[$field])) { $fieldConfig = $groupConfig['fields'][$mappedFields[$field]]; } } $dataObject->setField($field)->setGroups($groups)->setGroupId($group)->setStoreCode($store)->setWebsiteCode($website)->setScope($scope)->setScopeId($scopeId)->setFieldConfig($fieldConfig)->setFieldsetData($fieldsetData); $this->_checkSingleStoreMode($fieldConfig, $dataObject); if (!isset($fieldData['value'])) { $fieldData['value'] = null; } $path = $section . '/' . $group . '/' . $field; /** * Look for custom defined field path */ if ($fieldConfig && isset($fieldConfig['config_path'])) { $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; }