Как и все прочие элементы в Magento, товары имеют свою собственную модель и коллекцию, которую можно использовать для получения списка товаров. Так что первое что нам нужно - это получить экземпляр коллекции товара:
$collection = Mage::getModel('catalog/product')->getCollection();
В то же время мы можем указать, какие атрибуты товар мы хотим получить. Для этого мы можем использовать метод addAttributeToSelect
. Задавать их можно либо по отдельности - по одному в каждом методе, либо массививом в качестве аргумента.
$collection
->addAttributeToSelect('name')
->addAttributeToSelect('price');
$collection->addAttributeToSelect(array('company', 'region'));
Если нужно получить все атрибуты товара пишем так:
$collection->addAttributeToSelect('*');
Теперь мы можем фильтровать коллекцию по некоторым из выбранных атрибутов, это делается с помощью метода addAttributeToFilter
. Это может быть простой один атрибут фильтра:
$products->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
Или несколько, указанные друг за другом.
$collection
->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED)
->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
При добавлении нескольких фильтров будет использован логическое сравление AND, поэтому все условия должны присутствовать у товара, который будет возвращен по коллекции. Эта функция также поддерживает различные условные операторы, которые похожи на аналогичные в запросах SQL. Вот некоторые примеры:
// Equals: eq
$collection->addAttributeToFilter('name', array('eq' => 'Some product'));
// Not Equals: neq
$collection->addAttributeToFilter('sku', array('neq' => 'not-this-one'));
// Like: like
$collection->addAttributeToFilter('name', array('like' => 'Some%'));
// Not Like: nlike
$collection->addAttributeToFilter('name', array('nlike' => 'Not%'));
// Greater than: gt
$collection->addAttributeToFilter('price', array('gt' => 10));
// Greater than or equals: gteq
$collection->addAttributeToFilter('price', array('gteq' => 10));
// Less than: lt
$collection->addAttributeToFilter('price', array('lt' => 99));
// Less than or equals: lteq
$collection->addAttributeToFilter('price', array('lteq' => 99));
// In: in
$collection->addAttributeToFilter('id', array('in' => array(10, 15, 20)));
// Not In: nin
$collection->addAttributeToFilter('id', array('nin' => array(11, 16, 17)));
// NULL: null
$collection->addAttributeToFilter('size', 'null');
// Not NULL: notnull
$collection->addAttributeToFilter('size', 'notnull');
Получение пересень товаров по категориям делается немного иначе - сначала получаем категорию элемента по идентификатору, а затем - набор продуктов для этой категории.
$category = Mage::getModel('catalog/category')->load($categoryId);
$collection = $category->getProductCollection();
Либо мы можем присоединиться к таблице категорий для более сложной ситуации, следующий пример получает все продукты из категорий с указанными идентификаторами:
$collection = Mage::getModel('catalog/product')->getCollection()
->joinField('category_id', 'catalog/category_product', 'category_id', 'product_id = entity_id', null, 'left')
->addAttributeToFilter('category_id', array('in' => array(1 ,2 ,3)))
->addAttributeToSelect(array('name', 'price'));
В итоге, теперь можно работать с полученной коллекцией товаров:
foreach ($collection as $_product) {
// do something with product
}