我知道Magento如何按范围过滤价格。
但是,如何过滤价格为X及更高的产品?我不想要价格的上限。
如果您需要进一步说明,请询问。
一个更清楚的例子。 我希望能够添加价格过滤器,例如从200 $到800 000 $
答案 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
进行测试,因为这是购买产品时使用的值(与price
,special_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?>