getCollection наблюдателя() не переписывается


Это стандартное поведение, или я делаю что-то не так?

// in event 'catalog_product_collection_load_before'
get_class($observer->getCollection());
 > Mage_Catalog_Model_Resource_Product_Collection
get_class(Mage::getModel('catalog/resource_product_collection'));
 > MyStuff_Catalog_Model_Resource_Product_Collection

Я пытаюсь избежать перезаписи блока, который выводит этот код, так как один из наших плагинов уже делает это (bleh), поэтому я использую событие.

Author: mpw, 2013-04-29

3 answers

Есть возможность включить весь Catalog/Model/Resource/Product/Collection.php с моими новыми методами в папку app/code/local/Mage, но я не решаюсь прибегать к этому, если это не является абсолютно необходимым.

 0
Author: mpw, 2013-04-29 20:12:40

Почему бы не установить родительскую коллекцию в своем собственном блоке?

class Company_Module_Block_Customcollection extends Mage_Catalog_Block_Product_List {

    /**
     * Set collection to Product list before Html is rendered
     */
    public function _beforeToHtml() {
        parent::setCollection(Mage::getModel('catalog/category')->setCollection()); // <- Or custom collection
        parent::_beforeToHtml();
    }
}

Вы можете наблюдать controller_action_layout_load_before и использовать что-то вроде

public function observe($observer) {
    if ($observer->getEvent()->getAction()->getFullActionName() == 'checkout_cart_index')) {
         $observer->getEvent()->getLayout()->getUpdate()->addHandle('module_block');
    }
}
 0
Author: B00MER, 2017-04-13 12:55:02

Звучит так, как будто кто-то сделал это неправильно и создал экземпляр с помощью new вместо заводских методов getSingleton() и getModel() в вашем модуле нет способа исправить это.

Поэтому, если вы хотите иметь правильный класс, вам нужно изменить модуль, который использует new

 0
Author: Fabian Blechschmidt, 2013-05-06 10:57:52