0

我正在尝试创建一个块,显示 Magento 1.7.0.2 网站上的 5 个最畅销产品、5 个最受欢迎的产品和 5 个最大的折扣产品。

该块在 local.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 名进行排序。我将折扣定义为“价格”和“特价”之间的百分比差异。

我的代码如下:

$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['discount'] 中的最高值)。

我一直在尝试使用以下方法对数组进行排序:

function cmp($a, $b) {
   return ($a['discount'] - $b['discount']);
}

usort($saleProducts, "cmp");

但是,只要我在代码中添加任何带有“功能”的内容,整个块就不再显示......即使我只是写:

function sortByDiscount($a, $b) {};

.phtml 文件中的任何位置,Magento 是否阻止我创建函数?还有其他人解决了这个特殊问题吗?我感觉我的方式可能会很慢,特别是因为我之前在同一个 .phtml 文件中使用了其他带有过滤器的产品集合,并且这个块需要处理多达 20,000 个产品的类别。

欢迎任何建议。

4

2 回答 2

2

从 PHP 5.3 开始支持匿名函数,因此您将无法使用它们。

据我所知,phtml 文件包含在它的块类中,因此您不能在 phtml 文件中编写新函数。您将不得不扩展块类或创建一个新的帮助类,然后调用

usort( $saleProducts, array('foo', 'bar'));

其中 foo 是您的类名, bar 是函数名(并且比较器函数应该是静态的)。

于 2013-01-24T19:28:08.660 回答
0

http://php.net/manual/en/functions.anonymous.php

仅从 PHP 5.3 开始支持匿名函数。将您的 usort 方法重写为:

usort($saleProducts, array($this, 'cmp'));

因此,您将移动代码以阻止并调用其方法。

于 2013-01-24T19:24:52.300 回答