Я некоторое время использовал решение Эрика. В моем случае я отключил определенный модуль, отвечающий за многоуровневую навигацию, в одном из моих магазинов - таким образом, вернулся к режиму многоуровневой навигации по умолчанию.
И это выглядело, как будто оно работает, но через некоторое время я заметил, что многоуровневые параметры навигации перестали появляться там, где и должны. Вскоре я заметил, что на самом деле модуль, который не должен работать в этом магазине, продолжал работать. Затем я понял, что когда я отключаю кеш конфигурации, решение Эрика работает, но после повторного включения останавливается.
Через некоторое время я понял, что это должно работать именно так, с включенным кешем конфигурации, потому что решение Эрика включает (или нет) указанные файлы конфигурации в глобальный xml только во время генерации этого xml. Затем он кэшируется и вызывается только из кэша. Поэтому, когда он был создан с сайта, который должен использовать какой-то модуль, он был включен, а затем использован также на сайте, который не должен был его использовать.
В любом случае, я разработал другое решение, основанное на коде Эрика (используя с ограничением в конфигурации модулей). Я думал, что Magento должен решить, что загружать, когда запрашивается класс. Затем он может проверить текущее значение MAGE_RUN_CODE и использовать его динамически.
В Mage_Core_Model_Config существует метод, который отвечает за получение имени класса: getGroupedClassName .
Вот код, который я там использовал:
if (strpos($className, 'Pneumatig_') !== false) {
$var = substr($className, 0, strpos($className, '_', strpos($className, '_') + 1));
if (isset($this->_xml->modules->$var)) {
if ((bool)$this->_xml->modules->$var->restricted === true) {
$code = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default';
if (strpos((string)$this->_xml->modules->$var->restricted, $code) !== false) {
$className = '';
}
}
}
}
Это Пневматическое условие состоит в том, что все мои модули начинаются с названия компании, поэтому я хотел избежать ненужной обработки, но необязательный код должен работать без него, или вы можете изменить его на что-нибудь еще.
Затем я получаю фактическое имя модуля [Компания] _ [Модуль] , а затем проверяю, включено ли оно в _xml (который является текущим объектом конфигурации). Если он ограничен, я очищаю $ className , поэтому он заставляет Magento загрузить значение по умолчанию в следующей строке.
И этот код добавляется непосредственно перед тем, как пустое условие:
// Second - if entity is not rewritten then use class prefix to form class name
if (empty($className)) {
if (!empty($config)) {
$className = $config->getClassName();
}
if (empty($className)) {
$className = 'mage_'.$group.'_'.$groupType;
}
if (!empty($class)) {
$className .= '_'.$class;
}
$className = uc_words($className);
}
$this->_classNameCache[$groupRootNode][$group][$class] = $className;
return $className;
И для вашего удобства я вставляю целые getGroupedClassName код:
public function getGroupedClassName($groupType, $classId, $groupRootNode=null)
{
if (empty($groupRootNode)) {
$groupRootNode = 'global/'.$groupType.'s';
}
$classArr = explode('/', trim($classId));
$group = $classArr[0];
$class = !empty($classArr[1]) ? $classArr[1] : null;
if (isset($this->_classNameCache[$groupRootNode][$group][$class])) {
return $this->_classNameCache[$groupRootNode][$group][$class];
}
$config = $this->_xml->global->{$groupType.'s'}->{$group};
// First - check maybe the entity class was rewritten
$className = null;
if (isset($config->rewrite->$class)) {
$className = (string)$config->rewrite->$class;
} else {
/**
* Backwards compatibility for pre-MMDB extensions.
* In MMDB release resource nodes <..._mysql4> were renamed to <..._resource>. So <deprecatedNode> is left
* to keep name of previously used nodes, that still may be used by non-updated extensions.
*/
if (isset($config->deprecatedNode)) {
$deprecatedNode = $config->deprecatedNode;
$configOld = $this->_xml->global->{$groupType.'s'}->$deprecatedNode;
if (isset($configOld->rewrite->$class)) {
$className = (string) $configOld->rewrite->$class;
}
}
}
//START CHECKING IF CLASS MODULE IS ENABLED
if (strpos($className, 'Pneumatig_') !== false) {
$var = substr($className, 0, strpos($className, '_', strpos($className, '_') + 1));
if (isset($this->_xml->modules->$var)) {
if ((bool)$this->_xml->modules->$var->restricted === true) {
$code = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default';
if (strpos((string)$this->_xml->modules->$var->restricted, $code) !== false) {
$className = '';
}
}
}
}
//END CHECKING IF CLASS MODULE IS ENABLED
// Second - if entity is not rewritten then use class prefix to form class name
if (empty($className)) {
if (!empty($config)) {
$className = $config->getClassName();
}
if (empty($className)) {
$className = 'mage_'.$group.'_'.$groupType;
}
if (!empty($class)) {
$className .= '_'.$class;
}
$className = uc_words($className);
}
$this->_classNameCache[$groupRootNode][$group][$class] = $className;
return $className;
}