天天看點

magento -- 清單頁顯示産品屬性值的幾種調用方式

之前有人提到要在清單顯示一些特定的屬性,除了自帶的名字,價格等。因為清單頁和産品頁都有一個同名的産品對象:$_product,而在産品頁,$_product是直接可以用$_product->getattributename()來擷取屬性值的,是以很多人認為同樣的方式可以在清單頁使用,而測試的結果是同樣的調用方式在清單頁是擷取不到值的,這是為什麼呢?

檢視清單頁和産品頁對應的block的php檔案,可以看出,雖然産品對象都命名為$_product,但來源不同,産品頁的對象來自如下代碼: $product = mage::getmodel('catalog/product')->load($this->getproductid()); 

通過産品id擷取單個産品,這種方式獲得的産品對象是包含該産品的所有資訊的,自然包含全部屬性值。再看清單的:

mage::getsingleton('catalog/layer')->getproductcollection(); 

獲得的是産品的集合,然後再模闆檔案裡循環拿出集合裡的産品,這個産品對象裡隻包含了圖檔,名字,url位址等少數幾個常用屬性,滿足一般清單頁需要的資訊,裡面不包含其它非預設屬性,是以用$_product->getattributename()在清單頁取不到值。

現在可以引出第一種解決方案了,既然清單頁的産品對象裡不包含屬性值,而通過id獲得的單個産品是包含屬性值的,那就在清單頁重新擷取一次産品對象:

………………………………………………………………………………

<?php $_columncount = $this->getcolumncount(); ?>

<?php $i=0; foreach ($_productcollection as $_product): ?>

<!--水水 -->

<?php $_product = mage::getmodel('catalog/product')->load($_product->getid());?>

<?php if ($i++%$_columncount==0): ?>

<ul class="products-grid">

…………………………………………………………………………………… 

現在這個$_product就可以像産品頁的一樣取出各種你想要顯示的屬性,比如顔色:

echo $_product->getattributetext('color');

這種方案雖然可以解決問題,但基于性能原因不推薦,清單頁有大量産品,每次循環都要去重新讀資料庫擷取一次包含所有資訊的産品資料(而你用到的可能隻是其中一個屬性),會加大資源的消耗,在magento本身速度就不占優勢的情況下,這種額外消耗沒有必要。

接下來講第二種方案,magento的頁面是由一個個block組合而成,block在調用的時候都是可以傳參數的(如果有接收參數的代碼的話),對于清單頁産品産品所用的block來說,它可以接受屬性名作為參數,進而在擷取資料集合時将該參數對應的屬性值添加進産品對象裡,打開模闆目錄下/layout/catalog.xml,找到代碼:

<block type="catalog/product_list" name="product_list" template="catalog/product/list.phtml">

<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">

在這裡面新增一個action标簽,這裡還是以顔色為例:

<action method="addattribute"><attribute>color</attribute></action>

<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> 

這樣你就可以在清單頁調用産品的顔色了,需要調用的屬性都可以通過這種方式添加到集合裡去。簡單講下為什麼在這裡可以用<action method="addattribute">,打開block所對應的list.php檔案,可以找到這樣一個函數:

public function addattribute($code)

{

$this->_getproductcollection()->addattributetoselect($code);

return $this;

這裡的addattribute對應的就是action标簽裡的addattribute,$code參數接收的是action标簽裡傳遞的值(這裡是color),看上面的php代碼可以從字面上就了解出,這個函數接收傳遞的參數名,然後把這個參數對應的屬性值添加進産品集合裡面,最終結果就是你可以在清單頁調出你想要的産品屬性值。

現在來講最後一種方案也是今天推薦的方案,打開magento背景,catalog->attributes->manage attributes,找到顔色屬性(color)并點選進入,在配置項裡找到used in product listing選項,選擇是并儲存。

magento -- 清單頁顯示産品屬性值的幾種調用方式

現在你就可以在清單頁用之前同樣的方式調用顔色屬性的值了,不需要前兩種方式那樣修改額外的代碼,也就是說magento本身已經考慮到了可能會用到在清單頁調用常用屬性以外的屬性,并提供了在背景就可以友善添加的方式,是不是很簡單呢。

第三種方案毫無疑問是最合适的,之是以會講一下前兩種方案,是因為了解前兩種方案有助于了解magento本身的結構和block的使用方式,比如說第一種方案就是一種适用性很廣泛的方式,很多地方都會有隻包含部分資訊的産品對象,在你需要特定資訊時,都可以通過産品id來重新擷取完整産品對象,進而得到你要的資訊,這些地方并不是每一個都有第二,第三種方案可供選擇。

ps:額外講了這麼多,希望對看得人在了解magento上有所幫助