2013-07-24 5 views
7

Ho questa struttura XML nel mio modulo Catalogo Alchemy:Come estendere il blocco CMS all'evento di salvataggio di 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> 

e questo modello che dovrebbe registrare un messaggio per dimostrare che funziona:

<?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'); 
    } 
} 

Ma la rabbitmqBlockProducer() metodo non viene mai chiamato. Nota: gli altri metodi per prodotto e catalogo funzionano correttamente.

Qualsiasi aiuto fissare questo o qualsiasi altro metodo sarà apprezzato

+1

FYI è 'singleton', non' syngleton', anche se l'effetto è lo stesso di 'singleton' è il tipo predefinito – benmarks

risposta

7

Mage_Cms_Model_Block non sostituire la proprietà _eventPrefix, quindi quindi si innesca solo due eventi generici prima di salvare: model_save_before e core_abstract_save_before.

Mentre si sta già riscrivendo il modello di blocco CMS, è possibile semplicemente sovrascrivere la proprietà _eventPrefix e impostarla su cms_block; questo permetterà al tuo osservatore di lavorare. Tuttavia, poiché stai già eseguendo una riscrittura e utilizzando il tuo modello come osservatore, potresti semplicemente ignorare il metodo e aggiungere la tua logica e semplicemente aggiungere un po 'di cose.

Modifica: la riscrittura non funziona. sintassi di riscrittura per cms/block modello è

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

Hi benmarks, ho fatto alcune modifiche al Block.php ma ancora niente, potresti dare un'occhiata? Grazie –

+0

"ancora niente" è ampio. Vuoi dire che non stai vedendo nulla registrato? Se questa è la tua condizione di test, allora hai abilitato la registrazione in Sistema> Config> Sviluppatore? È possibile aggiungere 'true' come quarto argomento a' Mage :: log() 'per forzare la registrazione. – benmarks

+0

Ricevo i registri da altri eventi, quindi significa che il registro funziona, è l'evento che non viene generato. Se metto "protected $ _eventPrefix = 'cms_block';" in /app/code/core/Mage/Cms/Model/Block.php quindi tutto funziona (questa soluzione è rapida ma non ideale in quanto qualsiasi aggiornamento sovrascriverà questo file principale?) –