2013-11-04 98 views
1

在我的功能,抓住產品的集合,我會通過一個未知數量的屬性,所以我不能硬編碼他們在過濾我的功能就是下面的一個:Magento的1.7添加多個屬性,以收集過濾

public function getAssociatedProducts() 
    { 

     $parameters = $this->getRequest()->getPost();    
     $product = Mage::getModel('catalog/product')->load($parameters['parent_id']); 
     $grouped = Mage::getModel('catalog/product_type_grouped'); 


     $collection = $grouped->getAssociatedProductCollection($product) 
      ->addAttributeToSelect('*') 
      ->addFilterByRequiredOptions() 
      ->setPositionOrder() 
      ->addStoreFilter($grouped->getStoreFilter($product)) 
      ->addAttributeToFilter('status', array('in' => $grouped->getStatusFilters($product)));   
      // I need to do another addAttributeToFilter on this collection for the $parameters variable above. But the number of paramters I will need to check is unknown. 


     return $collection; 

    } 

可以通過addAttributeToFilter處理一組屬性? $ parameters變量將帶來的屬性數目是未知的,我只能弄清楚如何一次完成一個,但我需要它足夠靈活以處理添加最多10個屬性到過濾器。

謝謝!

我要補充一點,paramters的陣列可能是這樣的:

galco_weapon_list => 3602, 
product_color => 1595, 
weapon_draw_hand => 2700 

陣列上方將永遠是不同的。

回答

3

如果您將array作爲第一個參數傳遞給addAttributeToFilter(),則Magento會假設您要構建OR構造。所以不,你不能同時傳遞不同的屬性。

如果您通過string(或Mage_Eav_Model_Entity_Attribute_Abstract的實例),Magento會假設您希望傳遞的屬性爲AND ed。

看看你的帖子,我認爲你的目標是AND一些過濾器,你不知道哪些屬性會來,但它們都需要等於它們的給定值。

假設$parameters中的鍵與屬性名稱相匹配,可以通過在返回前插入一個循環並通過$parameters數組循環來實現。

像往常一樣按屬性進行消毒/驗證,然後在每次迭代中添加一個addAttributeToFilter()調用,例如,這樣的事情:

: 

foreach ($parameters as $k => $v) { 

    // ... sanitizing/validation code here ... 

    $collection->addAttributeToFilter($k, $v); 

} 

return $collection; 
+0

你好Jurgen,謝謝你的回答。本來我曾嘗試類似的東西,但你的回答讓我意識到我錯過了一些東西。你的方法有效。但是,在某些情況下,它不起作用,也許你可以幫助我。我所有的屬性都是多選。當產品只有一個屬性時,請選擇此項,因爲它將其視爲平等。當產品具有多個特定屬性時,它將返回null。我該如何做這個$ collection-> addAttributeToFilter($ code,array('in'=> $ value))的oppopsite,我想查看這個值是否在多選中? –

+0

我只是試過這個,它的工作原理。 $ collection-> addAttributeToFilter($ code,array('like'=>'%'。$ value。'%'));不過,我想知道使用通配符的準確性。 –

+0

您可以簡單地更改代碼來首先檢查'$ v'的數據類型,並相應地使用'addAttributeToFilter()'的不同變體。如果'$ v'是數組,則使用'addAttributeToFilter($ k,array('in',$ v))',等等...... –