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

11

Como posso obter uma lista de todos os produtos disponíveis no Magento 2?

nuwaus
fonte
Minha resposta não ajudou você?
Siarhey Uchukhlebau 9/09/16
1
Marque agora @SiarheyUchukhlebau, responda como correto .... #
P0lT10n

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

Siarhey Uchukhlebau
fonte
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
@maxagaz Usando xdebug em PHPStorm
Siarhey Uchukhlebau
ó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.

Jamez
fonte
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.

Sarvagya
fonte
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

95623
fonte