2013-07-24 9 views
7

Ich habe diese XML-Struktur in meinem Katalog-Modul Alchemie:Wie erweitere ich den CMS-Block beim Speichervorgang von Magento?

<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
    @filepath /app/code/local/Alchemy/Catalog/etc 
The XML has been extended following 
Magento Events API Observers 
http://www.excellencemagentoblog.com/magento-part11-series-eventsapi 
or 
http://blog.chapagain.com.np/magento-event-observer-with-save-before-and-save-after/ 
--> 
<config> 
    <modules> 
     <Alchemy_Catalog> 
      <version>0.1.0</version> 
     </Alchemy_Catalog> 
    </modules> 

    <global> 
     <models> 
      <alchemycatalog> 
       <rewrite> 
        <product>Alchemy_Catalog_Model_Product</product> 
        <block>Alchemy_Catalog_Model_Block</block> 
       </rewrite> 
      </alchemycatalog> 
     </models> 
     <events> 
      <!-- 
      Examples: catalog_product_save_before, catalog_product_prepare_save 
      Check out Magento events cheat sheet at http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ --> 
      <catalog_product_save_after> 
       <observers> 
        <Alchemy_Catalog> 
         <type>singleton</type> 
         <class>Alchemy_Catalog_Model_Product</class> 
         <method>pingBaseProductService</method> 
        </Alchemy_Catalog> 
       </observers> 
      </catalog_product_save_after> 
      <catalog_category_save_after> 
       <observers> 
        <Alchemy_Catalog> 
         <type>singleton</type> 
         <class>Alchemy_Catalog_Model_Product</class> 
         <method>pingBaseCategoryService</method> 
        </Alchemy_Catalog> 
       </observers> 
      </catalog_category_save_after> 
      <cms_block_save_before> 
       <observers> 
        <Alchemy_Catalog> 
         <type>singleton</type> 
         <class>Alchemy_Catalog_Model_Block</class> 
         <method>rabbitmqBlockProducer</method> 
        </Alchemy_Catalog> 
       </observers> 
      </cms_block_save_before> 
     </events> 
    </global> 
</config> 

und dieses Modell, das eine Nachricht, es zu beweisen loggt sein sollte funktioniert:

<?php 
class Alchemy_Catalog_Model_Block extends Mage_Cms_Model_Block { 
    /** 
    * Implement function rabbitmqBlockProducer(). 
    * This function writes a message to the rabbit 
    * mq server 
    */ 
    protected $_eventPrefix = 'cms_block'; 

    public function rabbitmqBlockProducer ($event) { 
     Mage::log('save3 block invoked', null, 'marian.log'); 
    } 
    /** 
    * Prevent blocks recursion 
    * 
    * @throws Mage_Core_Exception 
    * @return Mage_Core_Model_Abstract 
    */ 
    protected function _beforeSave() { 
     Mage::log('save2 block invoked', null, 'marian.log'); 
    } 
} 

Aber die rabbitmqBlockProducer() Methode wird nie namens. Hinweis: Die anderen Methoden für Produkt und Katalog funktionieren einwandfrei.

Jede Hilfe dieses oder ein anderes Verfahren zur Festsetzung wird

+1

ist FYI es ist 'singleton', nicht' syngleton', obwohl der Effekt der gleiche wie 'singleton' ist der Standardtyp – benmarks

Antwort

7

Mage_Cms_Model_Block außer Kraft nicht die _eventPrefix Eigenschaft geschätzt werden, so wird es daher nur zwei generische Ereignisse auslösen vor dem Speichern: model_save_before und core_abstract_save_before. Wenn Sie das CMS-Blockmodell bereits überschreiben, können Sie einfach die _eventPrefix-Eigenschaft überschreiben und sie auf cms_block setzen; Dies ermöglicht Ihrem Beobachter zu arbeiten. Da Sie jedoch bereits und mit Ihrem Modell als Beobachter überschreiben, können Sie einfach die _beforeSave()-Methode außer Kraft setzen und Ihre Logik dort und einfach ein wenig hinzufügen.

Bearbeiten: Ihre Neuschreibung funktioniert nicht. Rewrite-Syntax für cms/block Modell

<global> 
    <models> 
     <cms> 
      <rewrite> 
       <block>Alchemy_Catalog_Model_Block</block> 
      </rewrite> 
     </cms> 
    </models> 
</global> 
+0

Hallo benmarks ich einige Änderungen an die gemacht haben Block.php aber immer noch nichts, könntest du einen Blick darauf werfen? Danke –

+0

"immer noch nichts" ist breit. Meinst du, dass du nichts gesehen hast? Wenn das Ihre Testbedingung ist, haben Sie dann die Protokollierung in System> Config> Developer aktiviert? Sie können 'true' als viertes Argument zu' Mage :: log() 'hinzufügen, um die Protokollierung zu erzwingen. – benmarks

+0

Ich bekomme Protokolle von anderen Ereignissen, das bedeutet, dass das Protokoll funktioniert, es ist das Ereignis, das nicht ausgelöst wird. Wenn ich "protected $ _eventPrefix = 'cms_block';" in /app/code/core/Mage/Cms/Model/Block.php dann funktioniert alles (dies ist eine schnelle Problemumgehung, aber nicht ideal, da jedes Update diese Kerndatei überschreibt?) –