2010-01-29 11 views
7

In Magento können Sie einen Block (oder Helfer oder Modell, etc.) von einem Modul in einem anderen Modul überschreiben (am häufigsten von Magento Adminhtml Modul) . Jetzt habe ich das Problem, dass ich einen Block überschreiben möchte, der bereits von einer anderen Erweiterung überschrieben wurde. Gibt es eine Möglichkeit, Magento zu sagen, das <rewrite>-Tag in einer anderen Modulkonfiguration ähnlich dem <remove>-Tag in Layout-Updates zu ignorieren? Hiereinen Magento-Block in mehreren Modulen überschreiben (und wie die anderen ignoriert werden)

ist die Konfiguration der anderen Verlängerung:

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

Hier ist die Konfiguration meiner Erweiterung:

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

integrierte ich die Funktionalität des Blockes von Symmetrics_DeliveryTime in meinen eigenen Block und ich jetzt möchte, dass Magento den Block außer Kraft setzt, der von diesem Modul ausgeht.

Gibt es eine Magento-Möglichkeit, dies zu tun oder ist die einzige Möglichkeit, die Konfiguration zu kommentieren (was ich für jetzt getan habe), einschließlich aller Schwierigkeiten beim späteren Aktualisieren dieses Moduls?

Antwort

9

Wenn Sie Ihr Modul auf ‚abhängig‘ auf dem einen, der auch eine Rewrite tut, wird die Config zuletzt gelesen werden und die Rewrite sollte bleiben, in den entsprechenden Datei in app/etc/Module sollten Sie haben:

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

Arbeiten hilfreich sein, in Ordnung ... aber jetzt gibt es eine „echte“ Abhängigkeit von dem anderen Modul und magento wird sich beschweren, wenn das andere Modul nicht installiert ist ... in meinem Fall ist das in Ordnung, aber eine saubere Lösung für mehrere Umschreibungen in Magento wäre in Ordnung ... vielleicht eines Tages;) –

0

Ich schaute in der Klasse laden, und es sieht nicht aus wie es eine saubere Lösung ist. Der relevante Klassenname Ladecode ist dies:

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

    ... 

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

So sieht es aus, als gäbe es so etwas wie ein Neuschreiben nicht. Derjenige, der in das Konfigurations-Array geladen wird, wird geladen und sobald er zwischengespeichert ist, wird er einfach wie angefordert zurückgegeben. Ich sehe auch keinen einfachen Weg, den Cache zu hacken. Sie könnten versuchen, Vorrang für Ihr Modul zu bekommen (indem ich es alphabetisch umbenenne, nehme ich an), aber das ist ein totaler Hack und wird wahrscheinlich auf mysteriöse Weise später scheitern. Das tötet die Konfigurationsmöglichkeiten.

auch widerwärtig: es sieht aus wie nur Magento, dass die Gitter an zwei Stellen fordert, innerhalb (die man leicht überschreiben können), sondern auch in Mage_Adminhtml_Catalog_ProductController (d'oh!). Abhängig von Ihrem Anwendungsfall sollten Sie den Katalogproduktblock überschreiben und die _prepareLayout()-Funktion durch Ihre eigene ersetzen. Wenn Sie den Controller ebenfalls überschreiben möchten, sollten Sie einen eigenen Controller erstellen (der von Mage_Adminhtml_Catalog_ProductController abstammt) und einen Neuschreibe innerhalb Ihrer Konfiguration definieren, um admin/catalog/product/grid an Ihre Aktion zu leiten. Ein Schmerz, aber zumindest erreicht dein Ziel.

Hoffnung, die hilft,

Joe

0

Statt catalog_product_grid neu zu schreiben, warum nicht auf Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid verlängern? Auf diese Weise behält das Symmetrics-Modul alle Funktionen bei und Sie können Ihre hinzufügen.

Also statt:

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

dies tun:

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

Natürlich als abhängig in Ihrer app/etc/würde Module Datei passend sein.

0

Der beste Weg, um dieses Problem zu lösen mit Layout nach oder vor Beobachter.

app/code/local/My/Module/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> 

oder Ereignis verwenden können: core_block_abstract_prepare_layout_after.

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

Während Registerkarte Hinzufügen, dann können Sie anhand von Produkt bearbeiten Registerkarten nehmen Sie Ihre Formularfelder in hinzufügen, dass Sie Modul.

hoffen, dass dies für einige ein :)

Verwandte Themen