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:
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")
);
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 .
//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
Deixe um comentário