2010-01-29 6 views
7

En Magento puede anular un bloque (o ayuda, o modelo, etc.) de un módulo en otro (más común desde el módulo Magento Adminhtml) . Ahora tengo el problema de que quiero anular un bloque que ya fue reemplazado por otra extensión. ¿Hay alguna manera de decirle a magento que ignore la etiqueta <rewrite> en alguna otra configuración de módulo similar a la etiqueta <remove> en las actualizaciones de diseño?anulando un bloque magento en múltiples módulos (y cómo ignorar los otros)

Aquí es la configuración de la otra extensión:

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

Aquí la configuración de mi extensión:

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

integré la funcionalidad del bloque de Symmetrics_DeliveryTime en mi propio bloque y ahora quiere que magento ignore el bloqueo anulando desde ese módulo.

¿Hay alguna forma de hacer eso o es la única manera de comentar la configuración (que es lo que he hecho por ahora) incluyendo todas las molestias al actualizar ese módulo más tarde?

Respuesta

9

Si configura el módulo de 'dependerá' en la que también está haciendo una reescritura, su configuración se leerá pasado y la reescritura debe pegarse, en el adecuado archivo dentro de app/etc/modules usted debe tener:

<config> 
    <modules> 
    <Your_Module> 
     <active>true</active> 
     <codePool>local</codePool> 
     <depends> 
     <Other_Module/> 
     </depends> 
    </Your_Module> 
    <modules> 
<config> 
+0

funciona bien ... pero ahora hay una dependencia "real" en ese otro módulo y se quejará de Magento, si el otro módulo no está instalado ... en mi caso esto está bien, pero una solución limpia para múltiples reescrituras en magento estaría bien ... tal vez algún día;) –

0

Eché un vistazo a la carga de clases, y no parece que haya una solución limpia. El código de carga del nombre de clase relevante es el siguiente:

if (isset($this->_classNameCache[$groupRootNode][$group][$class])) { 
     return $this->_classNameCache[$groupRootNode][$group][$class]; 
    } 

    ... 

    if (isset($config->rewrite->$class)) { 
     $className = (string)$config->rewrite->$class; 

Parece que no existe una reescritura. El que se coloca en la matriz de configuración es el que se carga y, una vez en la memoria caché, simplemente se devuelve según lo solicitado. Tampoco veo una manera fácil de hackear el caché. Podrías tratar de obtener prioridad para tu módulo (al renombrarlo alfabéticamente, supongo), pero eso es un truco total y es probable que falle misteriosamente más adelante. Eso mata las posibilidades de configuración.

También desagradable: parece que sólo se solicita que Magento rejilla en dos lugares, dentro (que se puede reemplazar fácilmente), pero también en Mage_Adminhtml_Catalog_ProductController (d'oh!). Dependiendo de su caso de uso, considere anular el bloque del producto de catálogo y reemplazar la función _prepareLayout() con la suya. Si también desea anular el controlador, querrá crear su propio controlador (que desciende de Mage_Adminhtml_Catalog_ProductController) y definir una reescritura dentro de su configuración para dirigir admin/catalog/product/grid a su acción. Un dolor, pero al menos logra su objetivo.

Espero que ayude,

Joe

0

en lugar de volver a escribir catalog_product_grid, ¿por qué no se extienden en Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid? De esa forma, el módulo Symmetrics mantendrá todas sus funcionalidades y podrá agregar las suyas.

Así que en lugar de:

<blocks> 
    <adminhtml> 
     <rewrite> 
       <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

hacer esto:

<blocks> 
    <adminhtml> 
     <rewrite> 
       <deliverytime_catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</deliverytime_catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

Por supuesto que un dependerá en su aplicación/etc/modules sería apropiado.

0

La mejor manera de superar este problema es utilizar, diseño antes o después del observador.

app/código/local/Mi/Módulo/etc/config.xml

<config> 
<adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_before> 
      <observers> 
       <mymodule> 
        <!-- Add column to catalog product grid --> 
        <class>mymodule/adminhtml_observer</class> 
        <method>onBlockHtmlBefore</method> 
       </mymodule> 
      </observers> 
     </core_block_abstract_prepare_layout_before> 
    </events> 
</adminhtml> 

o puede utilizar el evento: core_block_abstract_prepare_layout_after.

Y con calidad de observador:

class My_Module_Model_Adminhtml_Observer 
{ 
    public function onBlockHtmlBefore(Varien_Event_Observer $observer) { 
    $block = $observer->getBlock(); 
    if (!isset($block)) return; 

    switch ($block->getType()) { 
     case 'adminhtml/catalog_product_grid': //or here you can put any other block 

      /*For example i am using Mage_Adminhtml_Block_Catalog_Product_Grid, and want to add a column*/ 

      $block->addColumn('COLUMN_ID', array(
       'header' => Mage::helper('mymodule')->__('COLUMN HEADER'), 
       'index' => 'COLUMN_ID', 
      )); 
      break; 

      case 'adminhtml/catalog_product_edit_tabs': 

      /*Or i want to add new tab to admin product edit*/ 
       /* @var $block Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs */ 
      $block->addTab('tab_name', array(
         'label'  => Mage::helper('catalog')->__('Tab Tilte'), 
         'content' => $block->getLayout()->createBlock('modulename/adminhtml_product_edit_tabname')->toHtml(), 
         'after'  => 'inventory', 
      )); 
      break; 
    } 
    } 
} 

Mientras pestaña añadiendo entonces puede tomar de referencia del producto editar tablas para agregar los campos del formulario en que el uso que los módulos.

la esperanza que esto sea útil a alguien :)

Cuestiones relacionadas