Фильтр цен Magento «от x до неограниченного»

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