如何在Magento中以编程方式从搜索结果中排除产品

时间:2015-04-10 13:43:17

标签: magento events

我试图排除填充搜索结果的产品。 它似乎在我的localhost上正常工作,但在客户端dev服务器上没有。 我正在观察这个事件 catalog_block_product_list_collection

并且在观察者方法中,最后是这段代码:

$observer->getCollection() ->addFieldToFilter('entity_id', array('nin' => array_keys($_excludeProducts))) ->clear() ->load();

也适用于目录和搜索结果列表,但暂时不在客户端dev服务器上的搜索结果列表中。 非常感谢任何指导/帮助。

编辑:调试此方法会给我一个空集合,但仍然会从某个地方填充数据。

2 个答案:

答案 0 :(得分:1)

我改变了方法并使用了另一个事件:catalog_product_collection_load_before

找到了使用更少代码实现该方法的更好方法。 #optimization

$excludeIds = array(2,3,4); //$excludeIds mixed

$observer->getCollection() ->addIdFilter($excludeIds, true); //exclude = true

该事件还有助于在收集加载之前调度工具栏上的正确项目数。

答案 1 :(得分:0)

尝试使用此事件过滤此集合时遇到类似问题。 在两种环境中,您是否有扁平类别和扁平产品设置相同?在我的情况下,我的代码只适用于平面表OFF,因为我正在使用加入其他EAV属性。 在您的情况下,如果您使用平板,我认为您只需要addAttributeToFilter()代替。

就我而言,这是我观察者的样子:

function onCategoryCollectionLoad($observer) {
    $collection = $observer->getEvent()->getCategoryCollection();

    $customerGroupId = (int) Mage::getSingleton('customer/session')->getCustomerGroupId();

    // hidden_from_groups is an EAV attribute; I couldn't figure out how to make it work with flat because it has a backend_model
    $collection->addAttributeToSelect('hidden_from_groups');

    $collection->addExpressionAttributeToSelect('should_be_hidden', "COALESCE(FIND_IN_SET($customerGroupId, {{attribute}}), 0)", 'hidden_from_groups');

    // should_be_hidden is not a real db field (nor EAV attribute); it only exists because of the addExpressionAttributeToSelect() above.
    $collection->addFieldToFilter('should_be_hidden', array('lt' => 1));

    // I don't call $collection->load(); that will get called further down the line.    
}