2013-07-24 41 views
7

Tôi có cấu trúc XML này trong Alchemy Catalogue Mô-đun của tôi:Làm cách nào để mở rộng Chặn CMS khi lưu sự kiện của 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> 

và mô hình này cần đăng nhập một thông điệp để chứng minh nó hoạt động:

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

Nhưng rabbitmqBlockProducer() phương pháp không bao giờ gọi là. Lưu ý: Các phương pháp khác cho sản phẩm và danh mục hoạt động tốt.

Bất kỳ trợ giúp khắc phục này hoặc bất kỳ phương pháp khác sẽ được đánh giá

+1

FYI nó là 'singleton', không phải 'syngleton', mặc dù hiệu quả là giống như' singleton' là loại mặc định – benmarks

Trả lời

7

Mage_Cms_Model_Block không ghi đè lên _eventPrefix bất động sản, vì vậy nó do đó sẽ chỉ kích hoạt hai sự kiện chung trước khi lưu: model_save_beforecore_abstract_save_before.

Trong khi bạn đã viết lại mô hình khối CMS, bạn có thể chỉ cần ghi đè thuộc tính _eventPrefix và đặt thành cms_block; điều này sẽ cho phép người quan sát của bạn làm việc. Tuy nhiên, vì bạn đã thực hiện viết lại bằng cách sử dụng mô hình của mình làm người quan sát, bạn có thể chỉ cần ghi đè phương thức _beforeSave() và thêm logic của bạn vào đó và chỉ đơn giản là mọi thứ một chút.

Chỉnh sửa: Viết lại của bạn không hoạt động. cú pháp Rewrite cho cms/block mô hình là

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

Hi benmarks, tôi đã thực hiện một số thay đổi đối với Block.php nhưng vẫn không có gì, bạn có thể xem được không? Cảm ơn –

+0

"vẫn không có gì" là rộng. Bạn có nghĩa là bạn không nhìn thấy bất cứ điều gì đăng nhập? Nếu đó là điều kiện thử nghiệm của bạn thì bạn có bật tính năng ghi nhật ký trong System> Config> Developer không? Bạn có thể thêm 'true' làm đối số thứ tư vào' Mage :: log() 'để bắt buộc đăng nhập. – benmarks

+0

Tôi nhận nhật ký từ các sự kiện khác, vì vậy điều đó có nghĩa là nhật ký đang hoạt động, đó là sự kiện không bị sa thải. Nếu tôi đặt "protected $ _eventPrefix = 'cms_block';" trong /app/code/core/Mage/Cms/Model/Block.php sau đó mọi thứ hoạt động (đây là giải pháp nhanh nhưng không lý tưởng vì bất kỳ cập nhật nào sẽ ghi đè tệp lõi này?) –

Các vấn đề liên quan