我使用 Eric 解决方案有一段时间了。在我的情况下,我在我的一家商店中禁用了负责分层导航的某些模块 - 从而返回到默认的分层导航行为。
它看起来像它的工作,但过了一段时间我注意到分层导航选项停止出现在它们应该出现的位置。很快我就注意到,实际上不应该在这家商店工作的模块继续工作。然后我意识到,当我禁用配置缓存时,Eric 的解决方案有效,但再次启用后它停止了。
过了一会儿,我意识到它必须以这种方式工作,启用配置缓存,因为 Eric 的解决方案仅在生成此 xml 时在全局 xml 中包含(或不包含)指定的配置文件。然后它被缓存并仅从缓存中调用。因此,当它从应该使用某些模块的站点生成时,它被包含在内,然后也在不应该使用它的站点上使用。
无论如何,我根据 Eric 的代码(在模块配置中使用 restricted)制定了另一个解决方案。我认为 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 = '';
}
}
}
}
这个Pneumatig 条件是因为我所有的模块都以公司名称开头,所以我想避免不必要的处理,但它是可选的,代码应该在没有它的情况下工作,或者你可以将其更改为其他任何内容。
然后我得到实际的模块名称[Company]_[Module],然后检查它是否在_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;
}