Magento价格筛选“从x到无限”

时间:2011-10-27 10:03:50

标签: magento

我知道Magento如何按范围过滤价格。

但是,如何过滤价格为X及更高的产品?我不想要价格的上限。

如果您需要进一步说明,请询问。

一个更清楚的例子。 我希望能够添加价格过滤器,例如从200 $到800 000 $

4 个答案:

答案 0 :(得分:2)

丑陋的回答:为了对价格字段应用限制,您需要恢复到(几乎)普通的旧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进行测试,因为这是购买产品时使用的值(与pricespecial_price或其他人相比)。< / p>

这是添加条件的示例:

// 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的答案结合起来,使其成为分层导航价格范围过滤器的一部分。

答案 1 :(得分:0)

以下是有关如何使用某些说明创建自己的过滤器的示例。我们使用它为我们的免费产品提供过滤器,您需要适应您的情况。 您需要覆盖班级Mage_Catalog_Model_Layer_Filter_Price

在下面的代码中,$index定义了价格范围过滤器中的索引。如果您有4个价格区间,则索引1是第一个,索引4是最后一个。 $range是价格范围,如果您的范围= 100且指数= 1,则价格范围将介于1到100之间。如果您有index = 4且range = 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;
    }
}

答案 2 :(得分:0)

如果你想这样

低于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/

获得帮助

答案 3 :(得分:0)

我将以下代码用于我的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?>