#magento
#magento
Вопрос:
Я знаю, как Magento может фильтровать цены по диапазону.
Но как я могу фильтровать товары с ценой X и выше? Мне не нужен верхний предел цены.
Если вам нужно дополнительное объяснение, пожалуйста, спросите.
Небольшой пример, чтобы было более понятно. Я хочу иметь возможность добавить ценовой фильтр, который поддерживает, например, от 200 $ до 800 000 $
Комментарии:
1. вы хотите, чтобы это работало как обычный многоуровневый навигационный фильтр? Итак, в блоке фильтра в левом столбце (обычно)
2. Вы пытаетесь сделать это программно или через какой-либо интерфейс на сайте?
3. я знаю, что это невозможно через существующий интерфейс. Поэтому я ищу программный способ. И да, Джонатан Дэй, он должен работать как обычный многоуровневый навигационный фильтр
Ответ №1:
Уродливый ответ: чтобы применить ограничение к полям цены, вам нужно вернуться к (почти) простому старому 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, совместимый со стандартом, поэтому он также должен быть совместим с повышением.
Возможно, вы можете объединить это с ответом от Sylvain, чтобы сделать его частью многоуровневого фильтра ценового диапазона навигации.
Ответ №2:
Вот пример того, как вы можете создать свой собственный фильтр с некоторыми пояснениями. Мы используем его для обеспечения фильтра для наших бесплатных продуктов, вам нужно будет адаптироваться к вашей ситуации. Вам нужно перезаписать класс Mage_Catalog_Model_Layer_Filter_Price
В приведенном ниже коде $index
определите индекс в фильтре ценового диапазона. Если у вас есть 4 ценовых диапазона, индекс 1 является первым, а индекс 4 — последним. $range
это диапазон цен, если у вас есть диапазон = 100 и индекс = 1, диапазон цен будет от 1 до 100. Если у вас index = 4 и range = 1000, вы получите диапазон цен на продукт от 3000 до 4000 долларов США (пример — USD).
Код может быть улучшен, вы могли бы, например, сделать в методе _getItemsData()
, $data = parent::_getItemsData()
, затем использовать $data для внесения изменений
class MyCompany_Catalog_Model_Layer_Filter_Price extends Mage_Catalog_Model_Layer_Filter_Price {
protected function _getItemsData()
{
$range = $this->getPriceRange();
$dbRanges = $this->getRangeItemCounts($range);
// Display an item Free Products to allow to select only them in the layer navigation block
if($count = $this->_getResource()->getCountFreeProducts($this)){
$data[] = array(
'label' => Mage::helper('catalog')->__('Free Products'),
'value' => '1,1',
'count' => $this->_getResource()->getCountFreeProducts($this) );
}else{
$data = array();
}
foreach ($dbRanges as $index=>$count) {
$data[] = array(
'label' => $this->_renderItemLabel($range, $index),
'value' => $index . ',' . $range,
'count' => $count,
);
}
return $data;
}
}
Комментарии:
1. это хорошее объяснение добавления фильтра, но я не вижу здесь, как я могу добавить фильтр, который начинается со 1009 и заканчивается, например, на 500 000.
Ответ №3:
если вы хотите, как это
менее 50 долларов
$50 — $99(5)
$100 — $199(3)
$200 — $299(10)
$300 — $499(2)
$500 — $699(17)
$700 — $899(1)
900 долларов или выше (12)
Вы можете получить помощь от http://www.codegyan.com/2012/01/06/customize-filter-price-range-in-magento /
Ответ №4:
Я использую этот код ниже для своего filter.phtml. надеюсь, это поможет.
<?php
$getLabel = $_item->getLabel();
if (strpos($getLabel, 'price')!== false) :?>
<a class="multi-select unselected" href="<?php echo $this->urlEscape($_item->getUrl()) ?>">
<?php
$getValue = $_item->getValue();
$fitlerPrices = str_replace('-', ' - ', $getValue);
$file = basename($fitlerPrices);
$parts = explode("-", $file);
$getCurency = Mage::app()->getLocale()->currency(Mage::app()->getStore()->getCurrentCurrencyCode())->getSymbol();
$priceBefore = $getCurency . number_format($parts[0], 0);
$priceAfter = $getCurency . number_format($parts[1], 0); ?>
<?php
if($i == $count){
//Last Item
echo '<span class="price">' . $priceBefore . ' and Above</span>';
}elseif($i <= 1){
//First Item
echo '<span class="price">Under ' . $priceAfter . '</span>';
}else{
echo '<span class="price">' . $priceBefore . ' - ' .$priceAfter . '</span>';
}
?>
</a>
<?php else :?>
<a class="multi-select unselected" href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel(); ?></a>
<?php endif?>
Комментарии:
1. Ответы только на код не приветствуются, поскольку они не предоставляют много информации для будущих читателей, пожалуйста, предоставьте некоторые пояснения к тому, что вы написали