Коллекция списков продуктов, чтобы не показывать продукты в категории x, если только идентификаторы продуктов не указаны в?


Я создал наблюдателя, слушающего событие catalog_block_product_list_collection.

Что я пытаюсь сделать, так это ограничить перечень продуктов по группам клиентов и определить, есть ли у клиента индивидуальная цена на этот продукт.

Что у меня есть до сих пор, так это наблюдатель, ограничивающий продукты по группам клиентов:

$collection = $observer->getCollection();
$collection->addAttributeToSelect('scode') //custom attribute
           ->addFieldToFilter('scode', array('in' => $filter)); //array of values pulled from a custom table based on customer group id.

Для большинства страниц это нормально, однако, когда вы находитесь в категории X (идентификатор 6) или при поиске, как мне отфильтровать коллекцию, чтобы любые товары в категории X нуждались ограничиваться теми, у кого идентификатор продукта в массиве (значения должны быть взяты из другой пользовательской таблицы).

Если бы это просто применялось к спискам категорий, то я бы сделал что-то вроде:

$cat = Mage::registry('current_category');
if($cat && $cat->getId() == 6) {
    $collection->addFieldToFilter('product_id', array('in' => $product_ids));
}

Но это не помогает для страниц поиска, где я хочу вернуть все товары во всех категориях, кроме товаров категории X, которые не включены в белый список.

Как мне добавить фильтр в свою коллекцию, чтобы делать то, что я хочу в описанном выше сценарии?

Author: Richard Parnaby-King, 2015-12-09

2 answers

Это решение, которое я придумал. Он загружает мою пользовательскую модель, чтобы получить идентификаторы продуктов, которые может приобрести клиент, загружает идентификаторы продуктов для категории X, удаляет допустимые идентификаторы из остальных идентификаторов и выполняет фильтр "не в основной коллекции" (функция loadByAttribute - это пользовательский метод, который возвращает массив строк из базы данных):

//only do this for logged in customers.
$customer_id = Mage::getSingleton('customer/session')->getCustomer()->getId();
if(!is_null($customer_id)) {

    //get all products for this customer
    $whiteList= Mage::getModel('my_module/my_model')->loadByAttribute('customer_id', $customer_id)->toArray();
    $ids = array();
    foreach($whiteList as $item) {
        $ids[] = $item['product_id'];
    }

    //get all products for category X
    $category = Mage::getModel('catalog/category')->load(6);
    $xCollection = Mage::getModel('catalog/product')->getCollection()
                                                    ->addCategoryFilter($category);

    //get ids of products to not include
    $bIds = $xCollection->getAllIds();
    $xCollection->addFieldToFilter('entity_id', array('in' => $ids));
    $b2Ids = $xCollection->getAllIds();
    $doNotIncludeIds = array_diff($bIds, $b2Ids);

    //remove category x product ids that customer cannot buy
    $collection->addFieldToFilter('entity_id', array('nin' => $doNotIncludeIds));
}
 0
Author: Richard Parnaby-King, 2015-12-09 17:02:11

Вы можете попробовать это событие catalog_product_collection_load_before

$productIds = array(1,2,3,4);

$observer->getCollection()->addIdFilter($productIds);

РЕДАКТИРОВАТЬ

Для фильтра конкретной категории вы можете попробовать

$category = Mage::getModel('catalog/category')->load(6);

$observer->getCollection()->addCategoryFilter($category);
 0
Author: Akhilesh Patel, 2015-12-10 04:23:04