2012-11-23 94 views
0

在local.xml中,我創建了佈局更新,以便我可以顯示自定義過濾的產品集合。特定類別佈局更新,自定義產品集合 - 缺少工具欄?

這是local.xml中:

<CATEGORY_7> 
     <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml"> 
      <block type="catalog/product_list" name="product_list" template="catalog/product/cashcrop.phtml"> 
       <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml"> 
        <block type="page/html_pager" name="product_list_toolbar_pager"/> 
       </block> 
       <action method="addColumnCountLayoutDepend"><layout>empty</layout><count>6</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>one_column</layout><count>5</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>two_columns_left</layout><count>4</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>two_columns_right</layout><count>4</count></action> 
       <action method="addColumnCountLayoutDepend"><layout>three_columns</layout><count>3</count></action> 
       <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> 
       <action method="setColumnCount"><columns>4</columns></action> 

      </block> 
     </block> 
</CATEGORY_7> 

模板文件是list.phtml的副本,但修改過濾收集:

<?php 
    $_productCollection = Mage::getModel('catalog/product')->getCollection(); 
    //$_productCollection=$this->getLoadedProductCollection(); 
    $_productCollection 
    ->addAttributeToSelect('*') 
    //->addAttributeToFilter('status', 1) 
    //->addAttributeToFilter('visibility', 4) 
    ->addAttributeToFilter('randament', array('in' => array(101, 102))) 
    ->load() 
    ; 
    $this->setCollection($_productCollection); 
    $_helper = $this->helper('catalog/output'); 
?> 

這工作,我得到105個產品在集合中。 問題是工具欄 - 它沒有被顯示。有沒有人知道爲什麼工具欄沒有顯示? (我知道這<?php echo $this->getToolbarHtml(); ?>返回一個空字符串,但我不明白爲什麼。

任何幫助表示讚賞。

乾杯, 邁克爾。

回答

0

你不需要重新初始化的一切。試試這個,看看它的工作原理:

<CATEGORY_7> 
    <reference name="product_list"> 
     <action method="setTemplate"> 
      <tpl>catalog/product/cashcrop.phtml</tpl> 
     </action> 
    </reference> 
</CATEGORY_7> 

而且,我會小心的腳本或佈局文件使用自動增量數據,我會傾向於把這個佈局更新的類別DB。可能不是一個值得關注的問題您的環境,但7是存儲後端的任意功能,而不是更有意義的東西,如類別名稱。

+0

我同意你的看法,我也嘗試過這種方式,仍然沒有工具欄,沒有分頁,只是整個頁面上引發的集合。我同意你把它放在local.xml中,這只是最後一次看到它的工作。最初我在類別的「自定義佈局更新」部分中有更新位置。就我個人而言,我認爲工具欄會因更新而丟失,或者由於我繞開預期的調用$ _productCollection = $ this-> getLoadedProductCollection();工具欄未被調用。但只是猜測... –

+0

最好的DDx將做到以上,但傳遞原始模板(* catalog/product/list.phtml *)作爲您的參數,看看它是否工作。如果是這樣,那麼問題出在您的模板上 - 很可能是因爲您沒有使用尋呼機等期望的原始產品集合。產品列表視圖不是一個乾淨的區域,因爲視圖中的各種對象和模型層都通過註冊表綁定。您需要在預渲染階段進行更高級的工作,即不在模板中。 – benmarks

0

其實我自己弄明白了。覆蓋模板很好,如果放在類別的「自定義佈局更新」部分中就足夠了;不需要將其放置在local.xml中。

問題在於Mage/Catalog/Block/Product/List.php中的_beforeHtml()函數,其中工具欄正在由塊的_getProductCollection()函數初始化,該函數始終返回一個空集合,因爲它嘗試獲取當前類別的產品集合。

所以作爲一個快速和髒的修復,我只是從_beforeHtml()函數複製代碼,並將其直接插入到我的cashcrop.phtml模板中。模板的頂部看起來像這樣:

<?php 
    $_productCollection = Mage::getModel('catalog/product')->getCollection(); 
    $_productCollection->addAttributeToSelect('*') 
         ->addAttributeToFilter('randament', array('in' => array(101, 102))) 
         ->addAttributeToFilter('inflorire', array('in' => array(97))) 
         ->addMinimalPrice() 
         ->addFinalPrice() 
         ->addTaxPercents(); 

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($_productCollection); 
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($_productCollection); 

    $_helper = $this->helper('catalog/output'); 

    $toolbar = $this->getToolbarBlock(); 
    $collection = $_productCollection; 

    // use sortable parameters 
    if ($orders = $this->getAvailableOrders()) { 
     $toolbar->setAvailableOrders($orders); 
    } 
    if ($sort = $this->getSortBy()) { 
     $toolbar->setDefaultOrder($sort); 
    } 
    if ($dir = $this->getDefaultDirection()) { 
     $toolbar->setDefaultDirection($dir); 
    } 
    if ($modes = $this->getModes()) { 
     $toolbar->setModes($modes); 
    } 

    // set collection to toolbar and apply sort 
    $toolbar->setCollection($_productCollection); 

    $this->setChild('toolbar', $toolbar); 
    Mage::dispatchEvent('catalog_block_product_list_collection', array(
     'collection' => $_productCollection 
    )); 

    $_productCollection->load(); 
?> 

我知道這可能不是理想的解決方案,但它的工作。如果其他人有更好的解決方案,我很樂意聽到它。

乾杯, Michael。