Фильтр цен Magento "от x до безлимитный" - PullRequest
2 голосов
/ 27 октября 2011

Я знаю, как Magento может фильтровать цены по диапазону.

Но как мне отфильтровать товары с ценой X и выше? Я не хочу верхний предел для цены.

Если вам нужно дальнейшее объяснение, пожалуйста, спросите.

Небольшой пример, чтобы быть более понятным. Я хочу иметь возможность добавить ценовой фильтр, который поддерживает, например, от 200 до 800 000 $

Ответы [ 4 ]

2 голосов
/ 13 декабря 2012

Гадкий ответ: чтобы применить ограничение к ценовым полям, вам нужно вернуться к (почти) простому старому 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-совместимый, поэтому он также должен быть достаточно совместимым с восходящим.

Возможно, вы можете объединить это с ответом Сильвена, чтобы сделать его частью многоуровневого фильтра ценового диапазона навигации.

0 голосов
/ 15 февраля 2018

Я использую этот код ниже для моего 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?>
0 голосов
/ 04 июня 2012

если хочешь вот так

до $ 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/

0 голосов
/ 03 ноября 2011

Вот пример того, как вы можете создать свой собственный фильтр с некоторыми пояснениями.Мы используем его для предоставления фильтра для наших бесплатных продуктов, вам нужно будет адаптироваться к вашей ситуации.Вам необходимо перезаписать класс Mage_Catalog_Model_Layer_Filter_Price

. В приведенном ниже коде $index определите индекс в фильтре ценового диапазона.Если у вас 4 ценовых диапазона, индекс 1 является первым, а индекс 4 - последним.$range - это диапазон цен, если у вас есть диапазон = 100 и индекс = 1, диапазон цен будет между 1 и 100. Если у вас есть индекс = 4 и диапазон = 1000, вы получите диапазон цен продукта отОт 3000 долларов США до 4000 долларов США (например, доллар США).

Код может быть улучшен, например, вы можете сделать это в методе _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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...