/** * Save configuration */ public function indexAction() { try { if (false == $this->_isSectionAllowed($this->getRequest()->getParam('section'))) { throw new Exception($this->_getHelper()->__('This section is not allowed.')); } // custom save logic $this->_saveSection(); $section = $this->getRequest()->getParam('section'); $website = $this->getRequest()->getParam('website'); $store = $this->getRequest()->getParam('store'); $configData = array('section' => $section, 'website' => $website, 'store' => $store, 'groups' => $this->_getGroupsForSave()); /** @var Mage_Backend_Model_Config $configModel */ $configModel = $this->_configFactory->create(array('data' => $configData)); $configModel->save(); // re-init configuration $this->_configModel->reinit(); $this->_eventManager->dispatch('admin_system_config_section_save_after', array('website' => $website, 'store' => $store, 'section' => $section)); $this->_app->reinitStores(); // website and store codes can be used in event implementation, so set them as well $this->_eventManager->dispatch("admin_system_config_changed_section_{$section}", array('website' => $website, 'store' => $store)); $this->_session->addSuccess($this->_getHelper()->__('The configuration has been saved.')); } catch (Mage_Core_Exception $e) { $messages = explode("\n", $e->getMessage()); foreach ($messages as $message) { $this->_session->addError($message); } } catch (Exception $e) { $this->_session->addException($e, $this->_getHelper()->__('An error occurred while saving this configuration:') . ' ' . $e->getMessage()); } $this->_saveState($this->getRequest()->getPost('config_state')); $this->_redirect('*/system_config/edit', array('_current' => array('section', 'website', 'store'))); }
/** * Reinitialize configuration. Instead of doing the actual reinitialization * we mark the cache as invalidated and set a timestamp that is later * matched with a cron scheduled config cache regenerator timestamp. * * @param array $options * @return Mage_Core_Model_Config */ public function reinit($options = array()) { $backend = Mage::app()->getCacheInstance()->getFrontend()->getBackend(); if (get_class($backend) !== 'Made_Cache_Redis_Backend') { return parent::reinit($options); } if (in_array(self::SAVE_KEY, $options)) { // Mark the config cache as valid before we lock to prevent an // invalidate-regenerate race condition $cache = Mage::app()->getCacheInstance(); $types = $cache->load(Mage_Core_Model_Cache::INVALIDATED_TYPES); if ($types) { $types = unserialize($types); if (isset($types[strtolower(self::CACHE_TAG)])) { unset($types[strtolower(self::CACHE_TAG)]); } $cache->save(serialize($types), Mage_Core_Model_Cache::INVALIDATED_TYPES); } // If we got called by our observer, pass it on with a single // instance lock. $options = $this->getLockingOptions(); if ($backend->acquireLock($options['lock_name'], $options['token'], $options['lock_timeout'])) { $this->_allowCacheForInit = false; $this->_useCache = false; $options['lock_acquired'] = true; $this->init($options); $backend->releaseLock($options['lock_name'], $options['token']); } } else { // Instead of reinitializing the cache, simply mark the config // cache as invalidated. Mage::app()->getCacheInstance()->invalidateType(strtolower(self::CACHE_TAG)); } return $this; }