Magento – coleção de produtos / catalog/product_collection

Em casos bem comuns trabalhando com ecommerce temos a necessidade em alguns momentos de ter em mãos uma lista de certos produtos. Sejam esses produtos de uma certa categoria, ou tageados com certas palavras chaves ou dentro de uma faixa de valor.

O Magento trata essa lista de produtos como uma coleção de produtos, que possui um modelo próprio para tratar isso, criando uma interface simpática ao desenvolvedor para criar complexas consultas SQL. Há duas formas de acessar essa interface do “Product Collection” usando o modelo do catalog/product ou acessando diretamente o recurso do modelo , resource model, o catalog/product_collection. Se você der uma olhada na classe Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection, encontrado pelo caminho core/Mage/Catalog/Model/Resource/Eav/Mysql4/Product/Collection.php, é possível ver todos os métodos disponíveis e como eles são implementados.


Primeira Forma

$produtos = Mage::getModel('catalog/product');
$colecaoProdutos = $produtos->getCollection()
                    ->addAttributeToSelect('*')
                    ->addAttributeToFilter(
                                     'type_id',
                                     array('eq' => 'customproduct')
                                     );     
		    ->addAttributeToSort('price','asc')
                    ->load();

Segunda Forma

$colecaoProdutos = Mage::getResourceModel('catalog/product_collection')
                    ->addAttributeToSelect('*')
		    ->addAttributeToSort('price','asc');

Como no dia a dia eu utilizo a segunda forma nos meus exemplos vou fazer o mesmo.

Métodos

Há três metódos que uso com grande frequência são o addAttributeToSelect, addAttributeToFilter e addAttributeToSort. Abaixo uma breve referencia sobre esses métodos com alguns exemplos:

  • addAttributeToSelect()

Com o addAttributeToSelect você define os nomes dos atributos/campos que serão retornados do banco, como uma query SQL. Para retornar todos os atributos/campos do produto use “*”, caso queira apenas algumas informações passe campo a campo como nos exemplos listados abaixo.

//Todos os campos
$colecaoProdutos = Mage::getResourceModel('catalog/product_collection')
                   ->addAttributeToSelect('*');
//Apenas alguns campos
$colecaoProdutos = Mage::getResourceModel('catalog/product_collection')
                   ->addAttributeToSelect('name')
                   ->addAttributeToSelect('price')
                   ->addAttributeToSelect('description')
                   ->addAttributeToSelect('small_image');
//Alguns campos com uma só chamada
$colecaoProdutos = Mage::getResourceModel('catalog/product_collection')
                   ->addAttributeToSelect(
                         array("name", "price","small_image", "description")
                         );
Para mais informações sobre esse método de uma olhada na Documentação do Magento .
  • addAttributeToFilter()

O addAttributeToFilter é equivalente ao WHERE de uma query de consulta SQL. Da mesma forma como você pode adicionar operadores de condição em uma query assim se faz com esse método, passando como paramêtro um array com o nome do campo e a condição como segue os exemplos abaixo.

//Great than - para valores maiores que 99.99

$colecaoProdutos->addAttributeToFilter('price', array('gt' => 99.99));
//Less than or Equals to - para valores maiores ou igual a 99.99

$colecaoProdutos->addAttributeToFilter('price', array('lteq' => 99.99));

Há dois campos do produto, news_from_date e news_to_date, que definem de e até quando ele deve ser considerado novo. Uso também com muita frequência esses dois campos pra selecionar esses novos produtos e colocar um diferencial nele pra chamar a atenção, seja uma borda ou ima imagem com “Novo” sobre a imagem do produto. Segue o código

//Coleção de produtos novos
$colecaoProdutos->addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))
                ->addAttributeToFilter('news_to_date', array('or'=>
                                        array(0 => array('date' => true, 'from' => $todayDate),
                                              1 => array('is' => new Zend_Db_Expr('null')))
                                             ), 'left');

//Assim como visto em /app/code/core/Mage/Catalog/Block/Product/New.php

Se quiser saber mais sobre filtros e outros operadores de condição deem uma olhada no post do Adam Moss que aborda com exemplos rápidos e sem baboseira no link http://www.e-commercewebdesign.co.uk/blog/magento-tips/magento-sql-queries-with-addattributetofilter.php .

  • addAttributeToSort()
Se você estiver familiarizado com SQL sabe que é possível ordenar uma consulta com o ORDER BY nome_campo de forma ASCENDENTE(menor pro maior) ou DESCENTENDE (maior pro menor). Sendo assim o mesmo se aplica com o método addAtributeToSort(). No último caso do addAttributeToFilter() faço uma consulta por produtos marcados como novos de uma data até a outra, só que essa condição vai me trazer todos os produtos não necessariamente ordenados do mais novo para o mais velhos, e também se quissemos que a coleção de produtos fique ordenados dos mais velhos para os mais novos, ou ordenados por preço?
//Mais velhos para mais novos
$colecaoProdutos->addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))
                ->addAttributeToFilter('news_to_date', array('or'=>
                                        array(0 => array('date' => true, 'from' => $todayDate),
                                              1 => array('is' => new Zend_Db_Expr('null')))
                                             ), 'left')
                 ->addAttributeToSort('news_from_date','desc');
//Mais baratos para os mais caros
$colecaoProdutos->addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))
                ->addAttributeToFilter('news_to_date', array('or'=>
                                        array(0 => array('date' => true, 'from' => $todayDate),
                                              1 => array('is' => new Zend_Db_Expr('null')))
                                             ), 'left')
                 ->addAttributeToSort('price','asc');

 

Só espero ter sido bem claro e objetivo nesse post. Com esses exemplos já pode fazer uma página de categoria, ou mesmo uma página de promoção para só listar produtos mais novos ou mais antigos com promoção.

Material de referência:
http://www.e-commercewebdesign.co.uk/blog/magento-tips/magento-sql-queries-with-addattributetofilter.php
http://docs.magentocommerce.com/Mage_Eav/Mage_Eav_Model_Entity_Collection_Abstract.html
http://www.exploremagento.com/magento/some-custom-blocks-to-help-you-show-products.php


Comentários

3 respostas para “Magento – coleção de produtos / catalog/product_collection”

  1. fala amigão, seu post me veio bem acalhar! mas estou tendo dificuldades no momento de exibir os produtos da coleção.

    ainda sou noob no magento e queria uma ajudinha se possível, digamos que estou usando o modo de exibir tudo, como faço para exibir os produtos?

    1. Fala Thiago,

      Não tenho certeza se entendi bem a sua pergunta, mas você gostaria de iterar sobre a coleção de produtos?

      Você pode simplesmente um foreach.

      foreach($colecaoProdutos as $produto){
      //seu código vai aqui
      }
      
  2. Avatar de Danilo Veloso Pires de Mendonça
    Danilo Veloso Pires de Mendonça

    Ola!

    Isso é o mesmo que produto agrupado!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.