Magento филтрира колекцията от продукти по ниво на цена за текущата клиентска група

Как да филтрирам колекция от продукти, като проверя дали е зададена цена на ниво за текущата клиентска група?

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

Предистория: Някои продукти не са достъпни за определени групи клиенти и ние използваме цена на ниво, за да направим това определяне (т.е. ако цена на ниво излезе, включете в колекцията и покажете, ако не, изключете и не показвайте).

Всяка помощ е много ценена


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


Отговори (1)


Да, това трябва да е постижимо, но се опитайте да не мислите за него от гледна точка на таблици, а по-скоро като обекти и колекции.

Продуктовият обект има метод getTierPrice, който използва фабричен модел, за да върне ценообразуването на ниво в зависимост от типа продукт (прост, пакет и т.н.). Този метод проверява текущата посетителска група, когато изчислява цените на ниво.

Така че цената на ниво не е атрибут в класическия смисъл на 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