Примените дополнительный фильтр в поле зрения


Я пытаюсь добавить дополнительные фильтры в коллекцию после того, как коллекция, похоже, была сгенерирована. В каталоге product list.phtml есть следующая строка кода:

$_productCollection = $this->getLoadedProductCollection();

Когда я var_dump это делаю, он отчитывается как коллекция (mage_catalog_model_resource_product_collection). Однако, если я попытаюсь добавить:

$_productCollection->addAttributeToFilter('attr_handle', array('eq' => 155));

Непосредственно после первой строки результирующая коллекция остается точно такой же. Как я могу изменить то, что находится в $_productCollection в list.phtml?

Любая помощь приветствуется

---- ОБНОВЛЕНИЕ----

Я замечаю, что в List.php блок коллекция загружается в метод _beforeToHtml:

$this->_getProductCollection()->load();

Поэтому я предполагаю, что мне нужно "выгрузить" (?) его, а затем применить мои фильтры в представлении, а затем повторно загрузить его (?)

Author: beingalex, 2013-09-16

3 answers

Вы можете вызвать $collection->clear(), применить свои фильтры, а затем перезагрузить коллекцию. Однако IIRC коллекция будет находиться в другом состоянии, чем ожидает модель слоя.

Это комбинация обоих Mage_Catalog_Model_Resource_Product_Collection::clear() и Varien_Data_Collection::clear().

 4
Author: benmarks, 2013-09-16 15:03:37

Вы можете отфильтровать коллекцию продуктов перед загрузкой. Смотрите следующее, ваш config.xml

<frontend>   
       <events>
            <catalog_product_collection_load_before>
                <observers>
                    <ssd_ajaxify>
                        <class>SSD_Ajaxify_Model_Observer</class>
                        <method>catalogProductCollectionLoadBefore</method>
                    </ssd_ajaxify>
                </observers>
            </catalog_product_collection_load_before>
        </events>
</frontend>

И Observer.php :

class SSD_Ajaxify_Model_Observer
{    
public function catalogProductCollectionLoadBefore($observer)
        {
            $request = Mage::app()->getRequest();
            $path    = implode('_', array(
                $request->getModuleName(),
                $request->getControllerName(),
                $request->getActionName(),
            ));
            if ($path == 'catalog_category_view') {
                $collection = $observer->getEvent()->getCollection();
                $collection->addAttributeToFilter('price', array('gt'=> 50));
            }
        }
}

Кстати, это влияет на вашу панель инструментов и многоуровневую навигацию, а также на список товаров на странице просмотра категорий.

 4
Author: mageUz, 2013-09-16 15:30:30

Используя блок перезаписи списка продуктов Magento, мы можем добавить дополнительный фильтр в коллекцию продуктов.

Please use below link for reference:-
[http://shariqnasir.blogspot.in/2011/06/override-core-modules.html][1]
[http://pratikkhamar.wordpress.com/2012/04/13/magentooverride-block/][2]

Надеюсь, это поможет вам.

 0
Author: Stan, 2013-09-19 11:41:23