Коллекция списков продуктов, чтобы не показывать продукты в категории 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, которые не включены в белый список.
Как мне добавить фильтр в свою коллекцию, чтобы делать то, что я хочу в описанном выше сценарии?
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));
}
Вы можете попробовать это событие 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);