Magento фильтрует коллекцию продуктов по цене уровня для текущей группы клиентов

Как отфильтровать коллекцию продуктов, проверив, установлена ​​ли цена уровня для текущей группы клиентов?

Я думаю, мне нужно посмотреть в таблицу catalog_product_entity_tier_price, чтобы увидеть, есть ли запись для current customer_group_id для каждого продукта в коллекции (если нет, продукт должен быть исключен / отфильтрован из коллекции), но я не могу понять, как это сделать.

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

Любая помощь высоко ценится


person Toby Hemmerling    schedule 31.01.2011    source источник


Ответы (1)


Да, это должно быть достижимо, но постарайтесь думать об этом не с точки зрения таблиц, а скорее как объектов и коллекций.

Объект Product имеет метод getTierPrice, который использует шаблон Factory для возврата цен уровня в зависимости от типа продукта (простой, пакет и т. д.). Этот метод проверяет текущую группу посетителей при расчете цен уровня.

Таким образом, цена уровня не является атрибутом в классическом смысле Magento, что означает, что вы не можете фильтровать по атрибуту, вместо этого вы можете использовать функцию walk для коллекции, чтобы вычислить цену уровня, а затем отфильтровать коллекцию по обновленным значениям.

Примером функции ходьбы может быть:

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->walk('Namespace_Module_Helper_Data::removeStockData',array());

то в вашем Namespace_Module_Helper_Data у вас есть что-то вроде:

public static function removeStockData($product = null)
{
    $product->setData('stock_item',null);
    return;
}

В качестве альтернативы вы можете запустить коллекцию через цикл foreach:

foreach($collection->getItems() as $key => $item){
   if($item->getTierPrice($qty) == $item->getPrice()){  //insert your own criteria
        $collection->removeItemByKey($key);
   }
}
person Jonathan Day    schedule 01.02.2011
comment
Спасибо. Хотя я понимаю, что вы говорите в теории, мне не удалось применить это на практике. У вас есть какие-либо ссылки на фактические образцы кода, которые могут помочь мне понять, как это сделать? - person Toby Hemmerling; 09.02.2011
comment
ага, скоро выложу пример - person Jonathan Day; 10.02.2011
comment
спасибо за пример кода. У меня все еще есть вопросы. 1) можно ли удалить элементы из коллекции с помощью функции walk()? Если да, то как? 2) когда я использую getSize() до и после вашего примера foreach для перебора коллекции (удаление всех элементов с ключом ‹ 100), я получаю тот же результат. Что мне не хватает? - person Toby Hemmerling; 10.02.2011