尝试对Magento .phtml块中的折扣产品进行排序,添加任何功能都会禁用该块


trying to sort discounted products in a Magento .phtml block, adding any function disables the block

>我正在尝试创建一个块,该块显示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'));

因此,您将代码移动到块并调用其方法。

相关文章: