que estaba usando solución de Eric por un tiempo. En mi caso, desactivé cierto módulo responsable de la navegación en capas en una de mis tiendas, volviendo así al comportamiento de navegación en capas predeterminado.
Y parecía que funcionaba, pero después de un tiempo me di cuenta de que las opciones de navegación en capas se detenían para aparecer donde debían. Pronto me di cuenta de que, de hecho, el módulo que no debería funcionar en esta tienda siguió funcionando. Entonces me di cuenta de que cuando desactivo la caché de configuración, la solución de Eric funciona, pero después de habilitarla nuevamente se detiene.
Después de un tiempo me di cuenta de que tenía que funcionar de esa manera, con la caché de configuración activada, porque la solución de Eric incluye (o no) archivos de configuración especificados en XML global solo mientras se genera este XML. Luego se almacena en caché y se llama desde caché únicamente. Entonces, cuando se generó desde el sitio que debería usar algún módulo, se incluyó y luego se usó también en el sitio, que no se suponía que debía usarlo.
De todos modos, resolví otra solución, basada en el código de Eric (usando restringido en la configuración de los módulos). Pensé que Magento debería decidir qué cargar cuando se solicita la clase. Luego, puede verificar qué es MAGE_RUN_CODE y usarlo dinámicamente.
Hay un método en el Mage_Core_Model_Config que se encarga de hacer que el nombre de clase: getGroupedClassName.
Aquí está el código que utiliza allí:
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 = '';
}
}
}
}
Esta condición Pneumatig es porque todos mis módulos comienzan a partir del nombre de la empresa, por lo que quería evitar no procesamiento necesario, pero su opcional, el código debería funcionar sin ella , o puedes cambiarlo a cualquier otra cosa.
entonces consigo nombre de módulo real [Company] _ [Módulo], y a continuación, comprobar si es habilitado en _xml (que es objeto de configuración actual). Si está restringido, borro $ className por lo que fuerza a Magento a cargar el valor predeterminado en la siguiente línea.
y este código se añade justo antes es condición vacía:
// 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;
y para su comodidad pego toda getGroupedClassName código:
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;
}
lo sé. Puedo crear el campo de configuración del sistema para la habilitación de la tienda. Pero, estoy buscando respuesta solo para cambiar el archivo de configuración del módulo en el directorio de la aplicación/etc/modules. –
@chapagain no es posible cambiar la aplicación/etc/modules por tienda, es una configuración global. –