2013-07-25 30 views
0

首先,我在Magento中是全新的,所以我對它的結構和功能知之甚少。Magento的addAttributeToFilter不起作用

我正在構建過濾和顯示產品的自定義模塊。 到目前爲止,我做得很好,但現在我正在努力過濾和顯示產品嘿嘿。

我在app/code/local/Mage/Catalog/Block/Product/Filter.php 源創建的目錄塊:

<?php 
class Mage_Catalog_Block_Product_Filter extends Mage_Catalog_Block_Product_List 
{  
    protected function _beforeToHtml() 
    { 
     $table = Mage::getConfig()->getTablePrefix() . 'custom_table'; 

     //GET 
     $param1 = $this->getRequest()->getParam('param1'); 
     $param2 = $this->getRequest()->getParam('param1'); 
     $param3 = $this->getRequest()->getParam('param3'); 
     $param4 = $this->getRequest()->getParam('param4'); 

     $sql = "SELECT sku FROM " . $table . " WHERE param1 = '".$param1."' AND param2 = '".$param2."' AND param3 = '".$param3."' AND param4 = '".$param4."'"; 
     $query = Mage::getSingleton('core/resource') 
     ->getConnection('core_read') 
     ->fetchAll($sql); 

     $res = $query[0];//only one result expected 

     $collection = Mage::getResourceModel('catalog/product_collection'); 
     $collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds()); 

     $collection = $this->_addProductAttributesAndPrices($collection) 
      ->addStoreFilter() 
      ->addAttributeToFilter('sku', array('in' => $res['sku'])) 
      ->setPageSize($this->getProductsCount()) 
      ->setCurPage(1) 
     ; 

     $this->setProductCollection($collection); 
     return parent::_beforeToHtml(); 
    } 

} 
?> 

而我的模塊使用一個.phtml。 來源:

<?php 
echo $this->getLayout()->createBlock('catalog/product_filter')->setTemplate('catalog/product/list.phtml')->toHtml(); 

的問題是: 它suposed只加載從數據庫中檢索到的SKU的產品。但是,相反,它總是加載相同的產品,無論我放入addAttributeToFilter。

出於測試目的,我刪除了Filter.php中的所有內容(類聲明除外)並且行爲相同。我也在addAttributeToFilter中對sku進行了硬編碼,沒有運氣。 我檢查了查詢和結果,它是正確的。

其他方法我試過:

$_testproductCollection = Mage::getResourceModel('catalog/product_collection') 
     ->addAttributeToSelect('*') 
     ->addAttributeToFilter('sku', array('in' => array($res['sku']))); 
     $this->setProductCollection($_testproductCollection); 

/-------------------------/

$collection = Mage::getModel('catalog/product')->getCollection() 
->addAttributeToFilter('sku', array('in' => $idsProdutos)); 
$this->setProductCollection($collection); 

/-------------------------/

$products = Mage::getModel('catalog/product')->getCollection(); 
     $products->addAttributeToFilter('sku', 'asd');//show only skus starting with... 
     $products->addAttributeToFilter('status', 1);//enabled 
     $products->addAttributeToFilter('visibility', 4);//catalog, search 
     $products->addAttributeToSelect('*'); 
     $products->load(); 
     $this->setProductCollection($products); 

任何幫助是非常讚賞。

編輯

找到了解決辦法!

在腳本(在return之前)結束,我已經包括這一行:

$this->_productCollection = $collection; 

,由於某種原因,現在它正在工作。謝謝您的幫助!

+0

'addAttributeToFilter '僅與EAV屬性一起使用。 SKU作爲產品表中的普通列存儲。你可以嘗試使用'addFieldToFilter'。雖然,如果您只查找一種產品,您應該遵循dagfr的答案。 –

+0

嘗試使用addFieldToFilter,但它仍然無法正常工作。出於某種原因,收藏品沒有正確設置(?)。 正如我對dagfr所說,我最多可以返回3個sku,所以我需要這個集合。 –

回答

2

如果你只有1 SKU返回,不使用收集,只需使用產品:

$product = Mage::helper('catalog/product')->getProduct('SKU_GOES_HERE', Mage::app()->getStore()->getId(), 'sku'); 

如果你真的需要一個收集,您可以過濾通過ENTITY_ID與$product->getId()

+0

其實我最多有3個sku返回。這就是爲什麼我使用集合並使用'in'進行篩選。 –

+0

我試過這個,但總是返回同樣的產品,無論我把什麼放在集合中。 –

+0

感謝您的幫助!我設法使它工作。 –