2012-09-05 159 views
12

我正在爲頁腳構建「本月產品」塊。它應該加載一個類別的產品並顯示第一個。Magento:在頁腳中顯示特定類別的產品

這是我的模板文件custom/featured-product.phtml

<?php $_productCollection = $this->getLoadedProductCollection() ?> 

<div class="featured-product"> 
    <h2><?php echo $this->__('Product of the Month') ?></h2> 

    <?php foreach ($_productCollection as $_product): ?> 
     <div class="item"> 
      <a class="product-image" href="<?php echo $_product->getProductUrl() ?>"> 
       <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(200); ?>" alt="<?php echo $this->htmlEscape($this->getImageLabel($_product, 'small_image')) ?>" /> 
      </a> 

      <a class="product-name" href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->htmlEscape($_product->getName()) ?></a> 

      <?php echo $this->getPriceHtml($_product, true) ?> 
     </div> 

     <?php 
     // Note: Exit after first product. 
     break; 
     ?> 
    <?php endforeach ?> 
</div> 

這只是Magento的產品列表模板的一個簡化版本:catalog/product/list.phtml


WORKING

當一個CMS頁面嵌入塊,它工作正常。例如:

{{block type="catalog/product_list" category_id="13" template="custom/featured-product.phtml" }} 


NOT WORKING

當經由local.xml嵌入塊,它失敗。正確的標記被返回,但指定的類別未被加載。而是一個隨機(我不知道他們是如何選擇的)一套產品被加載。

我在local.xml代碼:

<default> 
    <reference name="footer"> 
     <block type="catalog/product_list" name="custom.featuredProduct" as="product_of_the_month" category_id="13" template="custom/featured-product.phtml" /> 
    </reference> 
</default> 

爲了完整起見,我明確地渲染塊page/html/footer.phtml像這樣:

<?php echo $this->getChildHtml('product_of_the_month') ?> 


任何想法?

我最好的猜測是我的local.xml是不正確的。是否有我需要加載的父塊?


[更新]

我原來的代碼崩潰的產品頁面。解決方法是而不是基於Magento核心文件上的代碼太重了:catalog/product/list.phtml。特別是避免這一行:

<?php $_productCollection = $this->getLoadedProductCollection() ?> 


[解決方法]

在CMS頁和LayoutXML使用實例的工作版本,這裏包括: https://stackoverflow.com/a/12288000/1497746

+0

'local.xml' - 這哪裏是文件在什麼位置? (完整路徑) – FlorinelChis

+0

@FlorinelChis - 這不是主題備用層次結構的問題。這是一個自定義包的正常位置:/app/design/frontend/custom/custom/layout/local.xml –

回答

12

使用Alan Storm的建議找到了一個工作解決方案。

/template/custom/featured-product。PHTML

<?php 
$_categoryId = $this->getCategoryId(); 

$_productCollection = Mage::getModel('catalog/category')->load($_categoryId) 
    ->getProductCollection() 
    ->addAttributeToSelect('*') 
    ->addAttributeToFilter('status', 1) 
    ->addAttributeToFilter('visibility', 4) 
    ->setOrder('price', 'ASC'); 
?> 

<div class="featured-product"> 
    <h2><?php echo $this->__($this->getLabel()); ?></h2> 

    <?php foreach ($_productCollection as $_product): ?> 
     <div class="item"> 
      <a class="product-image" href="<?php echo $_product->getProductUrl() ?>"> 
       <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(200); ?>" alt="<?php echo $this->htmlEscape($this->getImageLabel($_product, 'small_image')) ?>" /> 
      </a> 

      <a class="product-name" href="<?php echo $_product->getProductUrl() ?>"><?php echo $this->htmlEscape($_product->getName()) ?></a> 

      <?php echo $this->getPriceHtml($_product, true) ?> 
     </div> 

     <?php 
     // Note: Exit after first product. 
     break; 
     ?> 
    <?php endforeach ?> 
</div> 

簡而言之,收集手動生成,而不是接收的集合(如我的初始的嘗試沒有):

<?php $_productCollection = $this->getLoadedProductCollection() ?> 
<?php $_collectionSize = $_productCollection->count(); ?> 


使用在CMS頁:

{{block type="core/template" category_id="13" label="Product of the Month" template="custom/featured-product.phtml" }} 


使用模板:

/layout/local.xml

<default> 
    <reference name="footer"> 
     <block type="core/template" name="custom.featuredProduct" as="featured_product" template="custom/featured-product.phtml"> 
      <action method="setData"><key>category_id</key><value>13</value></action> 
      <action method="setData"><key>label</key><value>Product of the Month</value></action> 
     </block> 
    </reference> 
</default> 

/template/page/html/footer.phtml

<?php echo $this->getChildHtml('featured_product') ?> 


有用的資源:

如何獲得一個產品集合:

使用魔法getter/setter方法:

+0

注意到'<?php echo $ this-> getPriceHtml($ _ product,true)?>'似乎沒有渲染。 –

+0

您是否找到了提供價格的解決方案? @ brendan-falkowski – Kenny

+0

@Kenny - 不,不知道如何做到這一點。 –

5

首先,我有隨機的問題多年來使用佈局更新xml屬性節點來設置塊上的值(除了template,as,name,typeclass,所以試着像這樣的

<default> 
    <reference name="footer"> 
     <block type="catalog/product_list" name="custom.featuredProduct" as="product_of_the_month" template="custom/featured-product.phtml"> 
      <action method="setCategoryId"><id>13</id></action> 
     </block> 
    </reference> 
</default> 

或本

<default> 
    <reference name="footer"> 
     <block type="catalog/product_list" name="custom.featuredProduct" as="product_of_the_month" template="custom/featured-product.phtml"> 
      <action method="setData"><key>category_id</key><value>13</value></action> 
     </block> 
    </reference> 
</default> 

可以幫忙,將是我的第一步。

在那之後,我會去看看塊碼與加載集合

#File: app/code/core/Mage/Catalog/Block/Product/List.php 
class Mage_Catalog_Block_Product_List extends Mage_Catalog_Block_Product_Abstract 
{ 
    ... 
    public function getLoadedProductCollection() 
    { 
     return $this->_getProductCollection(); 
    }   
    ... 
    protected function _getProductCollection() 
    { 
     if (is_null($this->_productCollection)) { 
      $layer = $this->getLayer(); 
      /* @var $layer Mage_Catalog_Model_Layer */ 
      if ($this->getShowRootCategory()) { 
       $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId()); 
      } 

      // if this is a product view page 
      if (Mage::registry('product')) { 
       // get collection of categories this product is associated with 
       $categories = Mage::registry('product')->getCategoryCollection() 
        ->setPage(1, 1) 
        ->load(); 
       // if the product is associated with any category 
       if ($categories->count()) { 
        // show products from this category 
        $this->setCategoryId(current($categories->getIterator())); 
       } 
      } 

      $origCategory = null; 
      if ($this->getCategoryId()) { 
       $category = Mage::getModel('catalog/category')->load($this->getCategoryId()); 
       if ($category->getId()) { 
        $origCategory = $layer->getCurrentCategory(); 
        $layer->setCurrentCategory($category); 
       } 
      } 
      $this->_productCollection = $layer->getProductCollection(); 

      $this->prepareSortableFieldsByCategory($layer->getCurrentCategory()); 

      if ($origCategory) { 
       $layer->setCurrentCategory($origCategory); 
      } 
     } 

     return $this->_productCollection; 
    }     
} 

getLoadedProductCollection方法換到_getProductCollection一個電話,_getProductCollection是其中收集實際裝載。

所以,在

protected function _getProductCollection() 
{ 
    var_dump(__METHOD__); 
    var_dump($this->getCategoryId()); 
    Mage::Log(__METHOD__); 
    Mage::Log($this->getCategoryId()); 
} 

一些臨時調試代碼可以幫助確保您的類ID從佈局更新XML的塊使得它。

但是,如果您在_getProductCollection處稍微深入一點,您會注意到有幾個條件,其中將類別ID重置爲

if ($this->getShowRootCategory()) { 
    $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId()); 
} 
... 
if (Mage::registry('product')) { 
    // get collection of categories this product is associated with 
    $categories = Mage::registry('product')->getCategoryCollection() 
     ->setPage(1, 1) 
     ->load(); 
    // if the product is associated with any category 
    if ($categories->count()) { 
     // show products from this category 
     $this->setCategoryId(current($categories->getIterator())); 
    } 
} 
... 

是否有其它片的Magento的代碼已經設置了show_root_category屬性,或者你是一個網頁,其中有一個在註冊表中的一個產品對象上,Magento的將覆蓋類別ID。

使事情更加複雜,一旦收集加載它被設置在一個受保護的財產

$this->_productCollection = $layer->getProductCollection(); 

沒有公用getter方法。

在這裏進行的方式是無數的。如果是我,我會考慮以下

  1. 一個使用擴展Mage_Catalog_Block_Product_List和具有對集合重置類別或加載一個新的集合

  2. 載入的方法的自定義模塊類收集自己,沒有product/list

+0

''action method =「setCategoryId」>'method and' category_id'方法在* CMS頁*和*目錄視圖*上工作。 *產品視圖*上引發異常。調查... –

+0

Magento *確實*重寫了*產品視圖上的集合,導致了一個異常,我不知道如何跟蹤,所以我轉向了最後的兩個建議。 #2爲我工作。很快會作爲答案發布。 –

1

依託代碼,我成功地重新創建下Magento的CE 1.7.0.2問題。

首先,我創建了一個local.xml中與此內容:

<default> 
    <reference name="footer"> 
     <block type="catalog/product_list" name="custom.featuredProduct" as="product_of_the_month" category_id="13" template="custom/featured-product.phtml" /> 
    </reference> 
</default> 

我想通了,有些包裝XML元素丟失並增加了一些額外的線路:

<?xml version="1.0"?> 
<layout> 
    <default> 
     <reference name="footer"> 
      <block type="catalog/product_list" name="custom.featuredProduct" as="product_of_the_month" category_id="13" template="custom/featured-product.phtml" /> 
     </reference> 
    </default> 
</layout> 

加入後需要它工作的XML元素。

+0

- 好主意,但我的'local.xml'也包含這些。我只發佈了刪節的相關代碼。 –

+0

我是你有一些特殊情況。只是爲了記錄:我只對主頁進行了測試。此外,我創建了虛擬主題,其中放置了local.xml和custom/featured-product.phtml沒有安裝擴展名。產品樣本數據被使用,我只改變了類別ID。 – ceckoslab

+0

它是否從指定的類別加載正確的產品集合? –

相關問題