2011-05-11 15 views
12

Supongamos que tengo 3 tiendas.Magento: módulo de desactivación para cualquier tienda en particular

Quiero desactivar un módulo en tienda 2. Yo sólo quiero que se habilita en tienda 1 y 3. Tienda

veo que puedo hacerlo a través de: -

  • Going a Sistema -> Configuración -> Avanzado

  • Selección deseada tienda desde lista desplegable actual configuración del ámbito.

Pero esto no funciona del todo.

Y, además, no quiero verificar la tienda en el código del módulo en sí o crear el campo de configuración del sistema para que el módulo active o desactive la casilla para habilitar/deshabilitar.

Lo que estoy esperando es agregando un código en app/etc/modules/MyNamespace_MyModule.xml. ¿Podemos hacerlo de esta manera?

Respuesta

3

Esta configuración simplemente desactiva la salida del módulo en el diseño de la interfaz, pero los controladores de módulo, los observadores de eventos, las páginas de administración, etc. siguen funcionando.

Asimismo, no se olvide de especificar el nombre del módulo en archivos de diseño definición, de lo contrario todo el contenido del archivo de diseño se cargará para una tienda en particular:

<config> 
    <layout> 
     <module_alias module="Module_Name"> 
      <file>yourlayoutfile.xml</file> 
     </module_alias> 
    </layout> 
</config> 

Si está desarrollando un módulo adicional y desea desactivar completa su funcionalidad en la parte frontal de una tienda en particular, entonces debe crear un campo de configuración de tipo "Sí/No" y verificar su valor a través de Mage :: getStoreConfigFlag ('config/field/path') en su código de módulo.

+0

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. –

+0

@chapagain no es posible cambiar la aplicación/etc/modules por tienda, es una configuración global. –

15

Para desactivar un módulo sobre el alcance tienda, he encontrado que es posible hacerlo de esta manera:

Move app/código/core/Mago/Core/modelo/config.php para APP/código/local/Mage/Core/Model/Config.php

Inside Config.php encuentra el método "loadModulesConfiguration" No cambies nada, pero agrega el siguiente código para que el método se vea así.

public function loadModulesConfiguration($fileName, $mergeToObject = null, $mergeModel=null) 
{ 
    $disableLocalModules = !$this->_canUseLocalModules(); 

    if ($mergeToObject === null) { 
     $mergeToObject = clone $this->_prototype; 
     $mergeToObject->loadString('<config/>'); 
    } 
    if ($mergeModel === null) { 
     $mergeModel = clone $this->_prototype; 
    } 
    $modules = $this->getNode('modules')->children(); 
    foreach ($modules as $modName=>$module) { 
     if ($module->is('active')) { 
      // Begin additional code 
      if((bool)$module->restricted) { 
       $restricted = explode(',', (string)$module->restricted); 
       $runCode = (isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default'); 
       if(in_array($runCode, $restricted)) { 
        continue; 
       } 
      } 
      // End additional code 
      if ($disableLocalModules && ('local' === (string)$module->codePool)) { 
       continue; 
      } 
      if (!is_array($fileName)) { 
       $fileName = array($fileName); 
      } 

      foreach ($fileName as $configFile) { 
       $configFile = $this->getModuleDir('etc', $modName).DS.$configFile; 
       if ($mergeModel->loadFile($configFile)) { 
        $mergeToObject->extend($mergeModel, true); 
       } 
      } 
     } 
    } 
    return $mergeToObject; 
} 

El nuevo código hará que el método para comprobar además un nuevo nodo en el archivo XML módulo, <restringido>. Si el nodo existe, el valor sería una lista separada por comas de códigos de tienda en los que NO quiere que se cargue el módulo. Si tiene varias tiendas, la variable $ _SERVER "MAGE_RUN_CODE" se debe establecer con el código de tienda actual. Si no está configurado, la secuencia de comandos dará por sentado que el código de la tienda es "predeterminado", que es lo que es de manera predeterminada, a menos que por alguna extraña razón decidas cambiarlo en el back-end.

un archivo XML de módulos podría tener el siguiente aspecto:

<?xml version="1.0"?> 
<config> 
    <modules> 
     <MyPackage_MyModule> 
      <active>false</active> 
      <restricted>mystore1,mystore4,mystore5</restricted> 
      <codePool>local</codePool> 
     </MyPackage_MyModule> 
    </modules> 
</config> 

Con esto, el módulo no uniforme de la carga, mientras que en las tiendas con un código de tienda de mystore1, mystore4 o mystore5.La etiqueta <restringida> es completamente opcional, si la omite, el módulo se cargará como lo haría normalmente.

+0

Gracias, funciona para mí :) – Magefast

+1

Esta solución no funciona cuando la memoria caché está habilitada. Por favor, avíseme si tiene alguna otra solución para deshabilitar módulos y archivos de módulos como el observador y todo. – Nits

+0

@Nits: compruebe mi solución a continuación. Está basado en este, pero resolví este problema de caché. Funciona con 1.9.2.3. – Deus777

0
+2

Tenga en cuenta que [las respuestas de solo enlace] (http://meta.stackoverflow.com/tags/link-only-answers/info) no se recomiendan, por lo que las respuestas deben ser el punto final de una búsqueda de una solución (vs. otra escala más de referencias, que tienden a quedar obsoletas en el tiempo). Considere agregar una sinopsis independiente aquí, manteniendo el enlace como referencia. – kleopatra

1

Mis clientes instalación de Magento 1.8.1.0 tiene un módulo problemática que rompe menú de otro sitio en una configuración multi-tienda. La solución anterior publicada por Eric Hainer no funcionó para esta instalación, así que la alteré ligeramente:

En lugar de usar $_SERVER['MAGE_RUN_CODE'], utilicé $_SERVER['SERVER_NAME']. Trabajado como un encanto. :)

Así que en lugar de:

$runCode = (isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : 'default'); 

uso:

$runCode = (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'www.site1.com'); 

y en lugar de:

<restricted>mystore1,mystore4,mystore5</restricted> 

uso:

<restricted>www.site2.com,www.site3.com</restricted> 

obviamente cambiando "www.site1.com", "www.site2.com" y "www.site3.com" con sus propias ubicaciones.

Gracias por la idea Eric :)

2

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; 
} 
Cuestiones relacionadas