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 > ……………………………………………………………………………………
現在這個$_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標簽,這裏還是以顏色為例:
<block type="catalog/product_list" name="product_list" template="catalog/product/list.phtml"> <!--水水 --> <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本身的結構和block的使用方式,比如說第一種方案就是一種適用性很廣泛的方式,很多地方都會有隻包含部分信息的產品對象,在你需要特定信息時,都可以通過產品ID來重新獲取完整產品對象,從而得到你要的信息,這些地方並不是每一個都有第二,第三種方案可供選擇。
PS:額外講了這麼多,希望對看得人在了解Magento上有所幫助
最後更新:2017-04-02 06:51:27