Гадкий ответ: чтобы применить ограничение к ценовым полям, вам нужно вернуться к (почти) простому старому SQL.
Сначала немного фона.
В коллекциях товаров используются предварительно рассчитанные значения из таблицы индексов цен catalog_product_index_price
.
Таблица индексов объединяется с использованием псевдонима таблицы price_index
, когда в коллекции вызывается addPriceData()
.
Предположим, у нас есть коллекция продуктов и переменная, содержащая нижний предел цены, инициализированный следующим образом:
$lowerPriceLimit = 200;
/** @var $products Mage_Catalog_Model_Resource_Product_Collection */
$products = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect('name');
Возможно, вы захотите проверить по полю final_price
, потому что это значение будет использоваться при покупке продукта (по сравнению с price
, special_price
или другими).
Это пример того, как добавить условие:
// Join the price_index table
$products->addPriceData();
// Apply price limit
$products->getSelect()->where('price_index.final_price >= ?', $lowerPriceLimit);
Вот альтернатива. Если вы хотите сделать это немного больше способом Magento (то есть использовать более сложные методы), используйте это:
$customerGroupId = Mage::getSingleton('customer/session')->getCustomerGroupId();
$websiteId = Mage::app()->getWebsite()->getId();
$products->joinField(
'filter_price', // field alias
'catalog/product_index_price', // table
'final_price', // real field name
'entity_id=entity_id', // primary condition
array( // additional conditions
'website_id' => $websiteId,
'customer_group_id' => $customerGroupId,
'final_price' => array('gteq' => $lowerPriceLimit)
)
);
Если вы также используете addPriceData()
таким вторым способом, вы получите двойное внутреннее объединение индекса цен, но оно все равно будет работать ...
Все довольно низкий уровень, но с другой стороны, по крайней мере, это все еще довольно стандартный SQL-совместимый, поэтому он также должен быть достаточно совместимым с восходящим.
Возможно, вы можете объединить это с ответом Сильвена, чтобы сделать его частью многоуровневого фильтра ценового диапазона навигации.