2010-04-23 137 views
4

我有一個循環內的addAttributeToFilter函數行爲在Magento中出現問題。我在商店中有測試數據以支持搜索以下所有數據;我如何重置Magento搜索addAttributeToFilter

$attributeSelections=array(array('size' => 44, 'color' => 67, 'manufacturer' => 17), 
         array('size' => 43, 'color' => 69, 'manufacturer' => 17), 
         array('size' => 42, 'color' => 70, 'manufacturer' => 17)); 

而我的代碼來搜索這些組合;

foreach ($attributeSelections as $selection) { 
    $searcher = Mage::getSingleton('catalogsearch/advanced')->getProductCollection(); 
    foreach ($selection as $k => $v) { 
     $searcher->addAttributeToFilter("$k", array('eq' => "$v")); 
     echo "$k: $v<br />"; 
    } 
    $result=$searcher->getData(); 
    print_r($result); 
} 

這個循環給出了以下結果(稍微消毒以獲得快樂);

size: 44 
color: 67 
manufacturer: 17 
Array ([0] => Array ([entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17)) 

size: 43 
color: 69 
manufacturer: 17 
Array ([0] => Array ([entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17)) 

size: 42 
color: 70 
manufacturer: 17 
Array ([0] => Array ([entity_id] => 2965 [entity_type_id] => 4 [attribute_set_id] => 28 [type_id] => simple [sku] => 1006-0001 [size] => 44 [color] => 67 [manufacturer] => 17)) 

所以我的循環是功能和生成搜索。但是,循環的第一次迭代中輸入到addAttributeToFilter的值似乎仍保存在每個搜索中。 我試過清除我的搜索對象,例如,未設置($ searcher)和未設置($ result)。我也嘗試過magento函數,比如getNewEmptyItem(),resetData(),distinct()和clear(),但沒有一個具有所需的效果。

基本上我試圖做的是檢查重複的產品,然後我的腳本嘗試以編程方式創建具有這些屬性組合的產品。屬性選擇的數組可能具有不同的大小,因此需要循環。

如果有人能夠闡明我的問題,我會非常樂觀。

回答

1

單例的整點是每次都得到相同的對象,所以未設置$ searcher不起作用。您可以使用

 
$searcher->removeAttributeToSelect($k)
刪除每個屬性過濾器。

+0

謝謝我剛剛意識到問題在於getSingleton。我還沒有測試過你的解決方案,但我已經改變了我的getModel爲最初的聲明和所有工作正常。 – Bobby 2010-04-23 18:06:49

0

由於matei已經指出,這裏的問題在於getSingleton檢索同一個對象。我用這個聲明行取代了;

$searcher = Mage::getModel('catalogsearch/advanced')->getProductCollection(); 

它現在按照需要工作。

+0

如果他的答案解決了您的問題,請單擊他帖子旁邊的複選標記以接受他的答案。 – 2010-04-24 00:24:55

9

@matei removeAttributeToSelect實際上並不幸運。我今天發現,重置收集正確的方法是:

$searcher->clear() 
     ->getSelect()->reset('where'); 

,將刪除加載的_items,並移除任何where條款,是對集合的選擇。然後,您可以添加您的標準新鮮和load集合。