Post ensinando a como listar os produtos no Magento 2 criando uma Collection, adicionando filtros para exibir apenas os produtos em estoque, ativos e presentes em determinadas categorias.
Exemplo:
namespace [YourClassNameSpace]; class [YourClassName] { protected $_productCollectionFactory; public function __construct( .... \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, ..... ) { ..... $this->_productCollectionFactory = $productCollectionFactory; ..... } public function getProductCollection(){ $collection = $this->_productCollectionFactory->create(); $collection ->addMinimalPrice() ->addFinalPrice() ->addTaxPercents() ->addAttributeToSelect('*') ->addUrlRewrite(); return $collection; } }
Em um bloco – Módulo
Para criar um módulo clique neste link: Como criar um Módulo no Magento 2
Você deve criar o arquivo HelloWord.php no diretório: Rogertakemiya/Test/Block
Conteúdo:
<?php namespace Rogertakemiya\Test\Block; class HelloWorld extends \Magento\Framework\View\Element\Template { protected $_productCollectionFactory; public function __construct( \Magento\Backend\Block\Template\Context $context, \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory, array $data = [] ) { $this->_productCollectionFactory = $productCollectionFactory; parent::__construct($context, $data); } public function getProductCollection() { $collection = $this->_productCollectionFactory->create(); $collection->addAttributeToSelect('*'); $collection->setPageSize(3); // fetching only 3 products return $collection; } } ?>
Para listar os produtos em um arquivo phtml, utilize:
$productCollection = $block->getProductCollection(); foreach ($productCollection as $product) { print_r($product->getData()); echo "<br>"; }
Utilizando objectManager
Utilizar o Object Manager não é considera uma das melhores praticas para esse tipo de tarefa.
Por que?
- O código poderia ser usado com uma estrutura de injeção de dependência diferente no futuro
- O teste é mais fácil: você passa em argumentos simulados para a classe necessária, sem ter que fornecer um ObjectManager simulado
- Mantém as dependências mais claras – é óbvio que o código depende da lista de construtores, em vez de ter dependências escondidas no meio do código
- Encoraja os programadores a pensar sobre conceitos como encapsulamento e modularização. Se o construtor ficar grande, talvez seja um sinal de que o código precisa ser refatorado
A forma correta seria:
- criando um módulo
- declarando preferências
- dependências de injeção
- declarar um método público
Produtos ativos
Filtrando apenas os produtos ativos “habilitados” e com estoque.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $productCollection = $objectManager->create('Magento\Catalog\Model\ResourceModel\Product\CollectionFactory'); $collection = $productCollection->create() ->addAttributeToFilter('status',\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED) ->joinField('qty', 'cataloginventory_stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left') ->addAttributeToSelect('*') ->load(); foreach ($collection as $product){ echo 'Name = '.$product->getName().'<br>'; }
Filtrando pelo nome do produto
$productcollection = $this->_objectManager->create('Magento\Catalog\Model\ResourceModel\Product\Collection') ->addAttributeToSelect(['name', 'price', 'image']) ->addAttributeToFilter('name', array('like' => '%Iphone%')) ->setPageSize(10,1);
Filtrando por múltiplas categorias
$productCollection = $this->productCollectionFactory->create(); $productCollection->addAttributeToSelect('*'); $productCollection->addCategoriesFilter(array('in' => $catalog_ids)); /* $catalog_ids, array com os ID das categorias */
Conclusão
Listar os produtos no Magento 2 pode ser considerado uma tarefa complexa devido a necessidade de se criar um módulo para isso.
Evite utilizar o objectManager, qualquer dúvida por favor, fique a vontade para fazer um comentário.