2010-01-29 6 views
7

In Magento è possibile sostituire un blocco (o un helper, o modello, ecc.) Da un modulo in un altro (il più comune dal modulo Magento Adminhtml) . Ora ho il problema che voglio sovrascrivere un blocco che era già stato superato da qualche altra estensione. C'è un modo per dire a Magento di ignorare il tag <rewrite> in qualche altra configurazione del modulo similare al tag <remove> negli aggiornamenti del layout?sovrascrivere un blocco magento in più moduli (e come ignorare gli altri)

Ecco la configurazione della altro interno:

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

Ecco la configurazione della mia estensione:

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

ho integrato la funzionalità del blocco da Symmetrics_DeliveryTime nel mio blocco e ora vuoi che Magento ignori il blocco che sovrascrive da quel modulo.

C'è un modo Magento per farlo o è l'unico modo per commentare la configurazione (che è quello che ho fatto per ora) compresi tutti i problemi durante l'aggiornamento di quel modulo in seguito?

risposta

9

Se si imposta il modulo di 'dipende' su quello che sta facendo anche una riscrittura, la tua configurazione verrà letto ultima e la riscrittura dovrebbe attenersi, nella appropriata file all'interno di app/etc/modules si dovrebbe avere:

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

funziona bene ... ma ora c'è una dipendenza "reale" su quel altro modulo e di Magento si lamentano, se non è installato l'altro modulo ... nel mio caso va bene, ma una soluzione pulita per riscritture multiple in Magento andrebbe bene ... forse un giorno;) –

0

Ho dato un'occhiata al caricamento della classe, e non sembra che ci sia una soluzione pulita. Il codice di nome di classe di carico rilevante è questo:

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

    ... 

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

Quindi sembra che non v'è alcuna cosa come un riscritto-riscrittura. Quello che viene inserito nell'array di configurazione è quello che viene caricato e, una volta memorizzato nella cache, viene semplicemente restituito come richiesto. Neanche io vedo un modo semplice per hackerare il cache. Potresti provare a ottenere la precedenza per il tuo modulo (rinominandolo alfabeticamente, presumo), ma è un trucco totale e probabilmente fallirà misteriosamente in seguito. Questo uccide le possibilità di configurazione.

anche antipatico: sembra Magento richiede solo quella griglia in due posti, entro (che si può facilmente ignorare), ma anche in Mage_Adminhtml_Catalog_ProductController (d'oh!). A seconda del caso d'uso, considerare di ignorare il blocco del prodotto del catalogo e sostituire la funzione _prepareLayout() con la propria. Se si desidera sovrascrivere anche il controller, è consigliabile creare il proprio controller (che scende da Mage_Adminhtml_Catalog_ProductController) e definire una riscrittura all'interno della configurazione per indirizzare l'azione admin/catalog/product/grid. Un dolore, ma almeno realizza il tuo obiettivo.

Speranza che aiuta,

Joe

0

Invece di riscrivere catalog_product_grid, perché non estendere lo Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid? In questo modo il modulo Symmetrics manterrà tutte le sue funzionalità e potrai aggiungere il tuo.

Così, invece di:

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

fare questo:

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

Certo che un dipenderà nella vostra applicazione file/etc/moduli sarebbe opportuno.

0

Il modo migliore per superare questo problema utilizzando, layout dopo o prima di osservatore.

app/code/local/mio/modulo/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 possono utilizzare evento: core_block_abstract_prepare_layout_after.

E in Observer:

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

Mentre scheda aggiungendo allora si può prendere di riferimento di modifica del prodotto schede per aggiungere i campi del modulo in che usando è il modulo.

Spero che questo sarà utile a qualcuno :)

Problemi correlati