Как я могу сбросить addAttributeToFilter в поисках Magento - PullRequest
4 голосов
/ 23 апреля 2010

У меня проблемы с получением функции addAttributeToFilter в цикле, чтобы вести себя в Magento. У меня есть тестовые данные в моем магазине для поддержки поиска всех следующих данных:

$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 при первом изменении цикла, похоже, сохраняются для каждого поиска. Я попытался очистить свой поисковый объект, например, unset ($ searcher) и unset ($ result). Я также пробовал magento-функции, такие как getNewEmptyItem (), resetData (), Different () и clear (), но ни одна из них не имела желаемого эффекта.

По сути, я пытаюсь проверить наличие дублирующихся продуктов, прежде чем мой сценарий попытается программно создать продукт с этими комбинациями атрибутов. Массив выбора атрибутов может иметь различные размеры, поэтому необходим цикл.

Я был бы очень признателен, если бы кто-нибудь смог пролить свет на мою проблему.

Ответы [ 3 ]

9 голосов
/ 11 октября 2011

@ matei removeAttributeToSelect на самом деле не работает, к сожалению. Сегодня я обнаружил, что правильный способ сброса коллекции:

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

Это удалит загруженные _items и удалит все предложения where, которые выбраны в коллекции. Затем вы можете добавить новые критерии и load коллекции.

1 голос
/ 23 апреля 2010

Смысл синглтона в том, чтобы каждый раз получать один и тот же объект, чтобы сброс $ $ searchcher не работал. Вы можете использовать

$searcher->removeAttributeToSelect($k) 
для удаления каждого фильтра атрибутов.
0 голосов
/ 23 апреля 2010

Как уже указывал matei, проблема здесь в том, что getSingleton извлекает тот же объект. Я заменил эту строку объявления на;

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

Теперь работает как нужно.

...