Magento 2

Como listar os produtos no Magento 2 utilizando uma Collection

Post ensinando a como listar os produtos no 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. 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 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.

Post Recentes

Por que devo sempre manter o Magento 2 atualizado?

Segurança: Atualizações frequentes geralmente incluem patches de segurança para corrigir vulnerabilidades identificadas. Ao manter o Magento atualizado, você reduz significativamente…

1 mês atrás

Adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2

Como adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2 Injete o Magento\Framework\Message\ManagerInterface no construtor da sua…

1 mês atrás

Exibir mensagens erro/sucesso da Classe: Magento\Framework\Message\ManagerInterface

Para exibir as mensagens adicionadas na classe Magento\Framework\Message\ManagerInterface em um arquivo .phtml, você pode usar o seguinte código: <?php $objectManager…

1 mês atrás

Exportar as categorias do Magento 2 em um XML

Para criar um script no Magento 2 que exporte as categorias para um arquivo XML com o nome da categoria,…

2 meses atrás

Colocar um video como Background utilizando HTML + CSS

Para definir um vídeo MP4 como plano de fundo em um <div> usando HTML e CSS, você pode seguir estas…

4 meses atrás

Desativar o “lastname” no Magento 2

Como desativar o "lastname" no Magento 2 e Adobe Commerce Desativando a obrigatoriedade do campo Execute a SQL abaixo diretamente…

4 meses atrás