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 製品のカテゴリで動作する必要があるため、私の方法は非常に遅いと感じています。
どんな提案でも大歓迎です。