Основные трюки при работе с коллекцией товаров в Magento

Любой разработчик, который работает с Magento, рано или поздно столкнется с коллекциями товаров. Практически для любого интернет-магазина на CMS Magento крайне важно правильно и эффективно использовать выборку, фильтрацию и сортировку товаров. В этой статье мы попробуем собрать основные сниппеты, которые будут полезны разработчикам Мадженто любого уровня при работе с коллекциями товаров.

 

 

Загрузка коллекции товаров

Существует два основных способа загрузки коллекции товаров. Вы можете вызывать метод getCollection() в экземпляре модели товара, либо загружать класс коллекции в фабричном методе getResourceModel().

$collection = Mage::getModel('catalog/product')->getCollection();
$collection = Mage::getResourceModel('catalog/product_collection');

 

 

Добавление атрибутов в коллекцию

Модель товара – это огромный набор данных, и чем больше атрибутов мы добавляем в выборку, тем дольше времени нужно для ее загрузки. По умолчанию Magento загружает только базовые данные, которые находятся в таблице catalog_product_entity (такие, как ID, SKU, идентификатор типа объекта и т.д.).

 

Добавление всех атрибутов в выборку

$collection->addAttributeToSelect('*');

 

Добавление некоторых атрибутов в выборку

$collection->addAttributeToSelect('name', 'description', 'brand');

 

Добавление атрибутов особых цен в выборку

$collection->addMinimalPrice();
$collection->addFinalPrice();
$collection->addTaxPercents();

 

Добавление идентификаторов категорий в выборку

$collection->addCategoryIds();

 

Добавление информации ценовых правил в выборку

$collection->addTierPriceData();

 

Добавление переадресации URL товара

$collection->addUrlRewrite();

 

 

 

Фильтрация коллекции товаров

Тип EAV сущности позволяет получать доступ к замечательному методу addAttributeToFilter() в дополнение к стандартному addFieldToFilter(), который может принимать более широкий диапазон аргументов.

Ниже перечислены основные условия для фильтра, которые используются в запросе MySQL:

 

РАВНО

$collection->addAttributeToFilter('status', array('eq' => 1));

 

НЕ РАВНО

$collection->addAttributeToFilter('visibility', array('neq' => 1));

 

БОЛЬШЕ ЧЕМ

$collection->addAttributeToFilter('price', array('gt' => 5));

 

МЕНЬШЕ ЧЕМ

$collection->addAttributeToFilter('price', array('lt' => 10));

 

БОЛЬШЕ ИЛИ РАВНО

$collection->addAttributeToFilter('price', array('gteq' => 15));

 

МЕНЬШЕ ИЛИ РАВНО

$collection->addAttributeToFilter('price', array('lteq' => 4));

 

СОДЕРЖИТ – % (подстановочные знаки)

$collection->addAttributeToFilter('sku', array('like' => 'COMP%'));

 

НЕ СОДЕРЖИТ – % (подстановочные знаки)

$collection->addAttributeToFilter('sku', array('nlike' => 'ABC%'));

 

СОДЕРЖИТСЯ В МАССИВЕ

$collection->addAttributeToFilter('entity_id', array('in' => array(1,5,15)));

 

НЕ СОДЕРЖИТСЯ В МАССИВЕ

$collection->addAttributeToFilter('entity_id', array('nin' => array(1,5,15)));

 

НУЛЕВОЙ

$collection->addAttributeToFilter('description', 'null');

 

НЕ НУЛЕВОЙ

$collection->addAttributeToFilter('description', 'notnull');

 

 

 

Фильтрация результатов

Вы также можете использовать следующие общие фильтры:

 

ФИЛЬТР ТОВАРОВ ПО ID

$collection->addIdFilter(array(100,250,501));

 

ФИЛЬТР ПО ТЕКУЩЕМУ МАГАЗИНУ

$collection->addStoreFilter();

 

ФИЛЬТР ПО ТЕКУЩЕМУ ВЕБ-САЙТУ

$collection->addWebsiteFilter();

 

ФИЛЬТР ПО КАТЕГОРИИ

$id = Mage::app()->getStore()->getStoreId(); // получаем ID магазина
$collection->setStoreId($id)->addCategoryFilter($category);

 

 

 

Сортировка коллекции

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

 

СОРТИРОВКА В ПОРЯДКЕ ВОЗРАСТАНИЯ

$collection->setOrder('price', 'ASC');

 

СОРТИРОВКА В ПОРЯДКЕ УБЫВАНИЯ

$collection->setOrder('name', 'DESC');

 

РАНДОМНАЯ СОРТИРОВКА

$collection->setOrder('rand()');

 

 

 

Ограничение для выборки коллекции

Если вам нужно получить коллекцию товаров, но вы хотите ограничить количество результатов до определенного лимита, вы можете использовать метод setPageSize() и передать в качестве аргумента лимит. Это особенно полезно, если ваша коллекция содержит сотни тысяч данных – так вам не нужно будет выполнять сложные операции с коллекцией такого размера.

Эта функция ограничивает количество возвращаемых результатов, используя, в основном, SQL запрос LIMIT X. Например:

$collection->setPageSize(105);

 

Похожий результат можно получить, если использовать другую конструкцию:

$collection->getSelect()->limit(50); // вернет первые 50 результатов

 

 

Если вам нужно получить определенное количество товаров с определенной стартовой точки, тогда используйте метод setPage(). Он позволяет указать два параметра: первый параметр – стартовая точка, второй – количество результатов. Этот метод формирует SQL запрос вида LIMIT 0,50. Например:

$collection->setPage(0,50); // вернет первые 50 товаров
$collection->setPage(25,10); // вернет 10 товаров после 25-го

 

 

Подсчет результатов

$collection->count();

 

 

Получение ID товаров
Иногда нужно получить только идентификаторы товаров из коллекции, но не другие данные товаров. Для этой цели вы можете использовать метод getAllIds().

$collection->getAllIds();

 

 

Отладка коллекции
Хотите знать, какой SQL запрос отправляется в базу данных? Используйте для этого метод getSelect().

$collection->getSelect();

 

 

 

Классы по работе с коллекциями в Magento очень эффективны, и они позволяют легко делать запросы и фильтрацию данных, даже без каких-либо знаний MySQL.

Прокомментируйте, пожалуйста, данную статью в форме комментирования ниже!

 

View Comments

  • Фантастика! Коротко, информативно и очень-очень полезно! Прекрасная шпаргалка! Большое спасибо за ваш труд:)

Recent Posts

Зачем выбирать образование за границей: преимущества для будущего вашего ребенка

Учеба за границей уже давно ассоциируется с качественным образованием, новыми возможностями и множеством перспектив. Но…

4 дня ago

Как выбрать мастера для перетяжки мебели?

Выбор мастера для ремонта и перетяжки мебели — задача, которая требует вдумчивого подхода. Ведь от…

5 дней ago

Что лучше выбрать для хостинга: сервер VPS Windows или VPS Linux?

Выбор идеального хостинга под свой сайт может быть довольно запутанным делом, особенно когда существует так…

2 недели ago

Лоуренс Питер

Чтобы избегать ошибок, нужно набираться опыта; чтобы набираться опыта, надо делать ошибки Лоуренс Питер  

2 недели ago

Что такое Черное СЕО (Black Hat SEO) — вся нужная информация

Краткое определение Черного SEO Черное СЕО (или Черная оптимизация) — это любая практика, целью которой…

3 недели ago

Права категории C: кому они нужны и как их получить?

Получение водительских прав категории C открывает двери к профессиональной деятельности, связанной с управлением грузовыми автомобилями.…

3 недели ago