>我正在尝试创建一个块,该块显示Magento 5网站上5种最畅销的产品,5种浏览量最大的产品和5种最大的折扣产品。
该块在本地.xml中定义如下:
<reference name="content">
<block type="core/template" name="movies_block" template="catalog/product-block.phtml" before="-">
<action method="setData"><name>category_id</name><value>5</value></action>
</block>
</reference>
(您向它传递一个类别ID,这个想法是它可以在整个主题中快速重用我选择的类别)
我已经编写并测试了用于显示最畅销和查看次数最多的代码,但我正在努力寻找一种有效排序前 5 名最折扣的方法。我将折扣定义为"价格"和"special_price"之间的百分比差异。
我的代码如下:
$visibility = array(
Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH,
Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
);
$catNum = $this->getCategoryId(); // grab cat id from xml
$category = Mage::getModel('catalog/category')->load($catNum);
// load products from $category
$_productCollection = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('*')
->addAttributeToFilter('visibility', $visibility)
->addCategoryFilter($category);
$saleProducts = array();
$i=0;
foreach($_productCollection as $product):
if($product->getSpecialPrice()): // if a product has a special price
/* calculate discount as percentage and add it to $product array of each */
$product['discount'] = $product->getSpecialPrice()/$product->getPrice()*100;
$saleProducts[$i] = $product; // put discounted products into separate array
$i++;
endif;
endforeach;
这留下了一个$saleProducts,即具有"special_price"的产品数组。但是,我只想要前 5 个最优惠的(首先是 $product['折扣'] 中的最高值)。
我一直在尝试使用以下方法对数组进行排序:
function cmp($a, $b) {
return ($a['discount'] - $b['discount']);
}
usort($saleProducts, "cmp");
但是一旦我在代码中添加任何带有"函数"的内容,整个块就不再显示......即使我只是写:
function sortByDiscount($a, $b) {};
在.phtml文件中的任何地方,Magento是否阻止我创建函数?还有其他人解决了这个特殊问题吗?我有一种感觉,我的方式可能很慢,特别是因为我之前在同一个 .phtml 文件中使用了带有过滤器的其他产品系列,并且此块需要处理多达 20,000 个产品的类别。
欢迎任何建议。
从 PHP 5.3 开始支持匿名函数,因此您将无法使用它们。
据我所知,phtml文件包含在它的块类中,因此您无法在phtml文件中编写新函数。您必须扩展块类或创建新的帮助程序类,然后调用
usort( $saleProducts, array('foo', 'bar'));
其中 foo 是您的类名,bar 是函数名称(比较器函数应该是静态的)。
http://php.net/manual/en/functions.anonymous.php
匿名函数仅从 PHP 5.3 开始支持。重写你的 usort 方法,如下所示:
usort($saleProducts, array($this, 'cmp'));
因此,您将代码移动到块并调用其方法。