Como obter uma lista de todos os produtos no Magento 2?


Respostas:


22

Você deve usar Magento\Catalog\Model\ProductRepositoryou de Magento\Catalog\Model\ResourceModel\Product\Collectionacordo com suas necessidades. Você pode usar os dois métodos para obter instâncias do produto com todos os dados.

Exemplo 1 (Repositório):

/**
 * @param \Magento\Catalog\Model\ProductRepository $productRepository
 * @param \Magento\Framework\Api\SearchCriteriaInterface $criteria
 * @param \Magento\Framework\Api\Search\FilterGroup $filterGroup
 * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
 * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
 * @param \Magento\Catalog\Model\Product\Visibility $productVisibility
 */
public function __construct(
    \Magento\Catalog\Model\ProductRepository $productRepository,
    \Magento\Framework\Api\SearchCriteriaInterface $criteria,
    \Magento\Framework\Api\Search\FilterGroup $filterGroup,
    \Magento\Framework\Api\FilterBuilder $filterBuilder,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility
) {
    $this->productRepository = $productRepository;
    $this->searchCriteria = $criteria;
    $this->filterGroup = $filterGroup;
    $this->filterBuilder = $filterBuilder;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;

    $this->getProductData();
}

/**
 * @return \Magento\Cms\Model\Block|null
 * @throws \Magento\Framework\Exception\NoSuchEntityException
 */
protected function getProductData()
{

    $this->filterGroup->setFilters([
        $this->filterBuilder
            ->setField('status')
            ->setConditionType('in')
            ->setValue($this->productStatus->getVisibleStatusIds())
            ->create(),
        $this->filterBuilder
            ->setField('visibility')
            ->setConditionType('in')
            ->setValue($this->productVisibility->getVisibleInSiteIds())
            ->create(),
    ]);

    $this->searchCriteria->setFilterGroups([$this->filterGroup]);
    $products = $this->productRepository->getList($this->searchCriteria);
    $productItems = $products->getItems();

    return $productItems;
}

Resultado:

repositório

Exemplo 2 (coleção):

/**
 * @param \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory
 * @param \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus
 * @param \Magento\Catalog\Model\Product\Visibility $productVisibility
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function __construct(
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility
) {
    $this->productCollectionFactory = $productCollectionFactory;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;
}

/**
 * @return \Magento\Framework\DataObject[]
 * @throws \Magento\Framework\Exception\LocalizedException
 */
public function getProducts()
{
    /** @var \Magento\Catalog\Model\ResourceModel\Product\Collection $collection */
    $collection = $this->productCollectionFactory->create();
    $collection->joinAttribute('status', 'catalog_product/status', 'entity_id', null, 'inner');
    $collection->joinAttribute('visibility', 'catalog_product/visibility', 'entity_id', null, 'inner');
    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()])
        ->addAttributeToFilter('visibility', ['in' => $this->productVisibility->getVisibleInSiteIds()]);

    return $collection->getItems();
}

Resultado:

coleção


oi @siarhey, estou recebendo um resultado vazio com o seu código. Você tem alguma dica sobre isso? Poderia ser por causa de que estou tentando recuperar a lista de uma tarefa cron?
Lorenzo S

@ LorenzoS Oi, qual exemplo você está usando 1 ou 2? Existe algum produto quando você remove todos os filtros / condições?
Siarhey Uchukhlebau

Como obter essa guia "Variáveis" com a árvore de objetos na sua captura de tela?
DevonDahon


ótima resposta, @SiarheyUchukhlebau, mas o que você quer dizer com Se você precisa apenas de dados do produto, use a primeira classe. Se você precisar obter as instâncias do produto - use segunda classe.
Yehia A.Salam

2

Usando uma chamada de API REST:

https://{host}/rest/V1/products/?searchCriteria=

Recupera todos os produtos. "searchCriteria" é um parâmetro obrigatório, mas pode ser deixado em branco, como acima.


2

A resposta mais votada está funcionando, mas eu gostaria de mencionar que a injeção direta de uma implementação de repositório de produtos causará a violação do princípio do contrato de serviço e isso é algo que o Magento deseja que os desenvolvedores corrijam. Você deve injetar em \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryvez da implementação que é \Magento\Catalog\Model\ProductRepository $productRepository. Dessa forma, você terá um espaço para a capacidade de atualização futura. Bottom line é usar contratos de serviço, tanto quanto possível.


0

Você pode fazer isso através da solicitação da API. Dê uma olhada na API padrão m2

acho que sua melhor foto é catalogProductRepositoryV1

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.