2013-01-24 46 views
0

我正在試圖創建一個塊,其中顯示了Magento 1.7上的5個暢銷產品,5個最受歡迎的產品和5個最大折扣產品。 0.2網站。試圖在Magento .phtml塊中對摺扣產品進行分類,添加任何功能都會禁用該塊

塊被定義爲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種產品的類別。

歡迎任何建議。僅從PHP 5.3支持

+0

你有什麼PHP版本?匿名函數只適用於PHP 5.3 – freento

+0

PHP版本5.2.17,所以這將是一個問題,但試圖添加'函數sortByDiscount($ a,$ b){}'也禁用塊...沒有錯誤或任何東西,只是塊停止顯示像magento轉動它的鼻子! 編輯我的帖子,包括此... –

+0

可能是你的顯示錯誤被切換了。嘗試按照以下答案中的建議重新編寫usort。 – freento

回答

2

PHP 5.3支持匿名函數,所以你將無法使用它們。

就我所知,phtml文件被包含在它的block類中,所以你不能在phtml文件中寫一個新的函數。你將不得不延長塊類或創建一個新的輔助類,然後調用

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

其中foo是你的類名和酒吧是函數名(和比較功能應該是靜態的)。

+0

這聽起來像是問題,但是你已經失去了我擴展塊類或創建一個新的幫助類...得到任何鏈接到文檔,我可以找出如何在Magento中做到這一點? –

+1

那麼你將不得不創建一個新的模塊......請參閱本頁http://alanstorm.com/category/magento上的示例教程。你可以寫回聲get_class($ this);在你的phtml文件中,你將得到你的塊類的名稱,然後在那裏寫一個函數來測試這是否是問題(但這對於生產是不可取的,因爲你不能輕易將magento升級到更新的版本...)。少一些混亂的解決方案,但仍然不能被認爲是你將類文件複製到app/core/somewhere到app/local/somewhere的相同位置並在那裏添加函數 –

+0

這是一個核心/模板塊... get_class($ this )給出了'Mage_Core_Block_Template',但是我不知道在哪裏添加我的功能......只是有一種與magento架構有關的損失 我應該編輯app/code/core/Mage/Core/Block/Abstract.php嗎? ?我知道這是核心代碼,我應該重寫模塊,只是想測試) –

0

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

匿名功能。 重寫你的usort方法是這樣的:

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

所以,你移動你的代碼,以阻止並調用它的方法。

+0

看到上面的評論,你是正確的,但這不是問題,將更新我原來的文章與重寫代碼... –

+0

看看更新回答 – freento

+0

http://php.net /manual/ru/language.types.callable.php – freento

相關問題