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 を効率的に並べ替える方法に苦労しています。'price' と '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;

これにより、'special_price' を持つ製品の配列 $saleProducts が残ります。ただし、最も割引率の高いトップ 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 に答える