2010-04-23 133 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集合。