2012-06-05 2 views
0

У меня есть сайт, который продает автозапчасти. Я настроил свои категории как Make -> Model -> Year, отсюда фильтрация выполняется с помощью атрибутов. Тормоза, Колеса, Двигатель и т. Д.Magento Merge 2 Категории В 1 сборник

Это фильтрует коллекцию, как я ожидал, но как только я доберусь до Года, я хочу также включить предметы из Универсальной категории. И.Е. Коллекция должна включать предметы для определенного автомобиля, а также универсальные предметы на всех автомобилях.

Я нашел это Magento: how to merge two product collections into one?, который кажется тем, что я хочу, но я не могу понять, где именно это должно быть реализовано.

Есть методы getCollection() в List.php, Layer.php и Category.php, и я попытался реализовать код в приведенной выше ссылке, но без успеха. Если я включу его в List.php, коллекции, похоже, будут объединены, но фильтрация атрибутов не применяется к продуктам Universal.

Я попытался отредактировать функцию getProductCollection в category.php как так:

public function getProductCollection() 
{ 
    $collection = Mage::getResourceModel('catalog/product_collection') 
     ->setStoreId($this->getStoreId()) 
     ->addCategoryFilter($this); 
    //return $collection; 

    $universalCollection = Mage::getModel('catalog/category')->load(18)->getProductCollection(); 

    $merged_ids = array_merge($collection->getAllIds(), $universalCollection->getAllIds()); 
    // can sometimes use "getLoadedIds()" as well 

    $merged_collection = Mage::getResourceModel('catalog/product_collection') 
     ->addFieldToFilter('entity_id', $merged_ids) 
     ->addAttributeToSelect('*'); 

    return $merged_collection; 
} 

Но это дает мне: «Фатальная ошибка: Максимальный уровень вложенности функции от„200“достиг, отбрасывание»

Если кто-либо может дать какие-либо советы, будем признательны.

ответ

1

Вы получаете фатальную ошибку, потому что вы вызываете бесконечный цикл.

Это просто из-за того, что ваш код находится внутри метода getProductCollection() модели категории, и вы снова вызываете getProductCollection() в новой модели модели. Это приводит к бесконечному циклу

Итак, вам нужно переместить этот код. Вы действительно не должны редактировать эти основные файлы так, как вы в настоящее время.

Его полностью зависит от вас, как вы расширяете модель: переписываете, наблюдаете и т. Д. Но просто не изменяйте основной код Magento.

Я представил рабочий пример, ниже которого объединяет две коллекции категории продукта, внешне категории модели:

$storeId = Mage::app()->getStore()->getId(); 
    $categoryOneId = 10; 
    $categoryTwoId = 13; 

    $categoryOne = Mage::getModel('catalog/category')->load($categoryOneId); 
    $categoryTwo = Mage::getModel('catalog/category')->load($categoryTwoId); 

    $collectionOne = Mage::getModel('catalog/product')->getCollection() 
     ->setStoreId($storeId) 
     ->addCategoryFilter($categoryOne); 

    $collectionTwo = Mage::getModel('catalog/product')->getCollection() 
     ->setStoreId($storeId) 
     ->addCategoryFilter($categoryTwo); 

    $merged_ids = array_merge($collectionOne->getAllIds(), $collectionTwo->getAllIds()); 

    $mergedCollection = Mage::getModel('catalog/product')->getCollection() 
     ->addFieldToFilter('entity_id', $merged_ids); 
+0

Благодаря Дрю, я понимаю, что не следует редактировать файлы ядра. План заключался в том, чтобы заставить его работать в той или иной форме, а затем сделать это правильно позже. Будет ли это происходить или нет, другое дело ... lol ... Спасибо за вашу помощь, я уверен, что смогу понять это. –

+0

Привет, Дрю, когда я использую этот код, мои фильтры атрибутов, похоже, не работают. Я получаю целую загрузку предметов без названия, стоимость 0,00 и «Нет в наличии», а затем элементы, относящиеся к фильтрам. Есть идеи? –

+0

@JohnCondron - попробуйте использовать addAttributeToSelect в объединенной коллекции с вашими необходимыми атрибутами или * для всех i.e. addAttributeToSelect (массив ('цена', 'name')) или addAttributeToSelect ('*') и т. Д. –

Смежные вопросы