Comment obtenir une liste de tous les produits dans Magento 2?

11

Comment obtenir une liste de tous les produits disponibles dans Magento 2?

nuwaus
la source
Ma réponse ne vous a pas aidé?
Siarhey Uchukhlebau
1
Marquer maintenant la réponse @SiarheyUchukhlebau comme correcte ....
P0lT10n

Réponses:

22

Vous devez utiliser Magento\Catalog\Model\ProductRepositoryou Magento\Catalog\Model\ResourceModel\Product\Collectionselon vos besoins. Vous pouvez utiliser les deux méthodes pour obtenir des instances de produit avec toutes les données.

Exemple 1 (référentiel):

/**
 * @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;
}

Résultat:

dépôt

Exemple 2 (collection):

/**
 * @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();
}

Résultat:

collection

Siarhey Uchukhlebau
la source
salut @siarhey, je reçois un résultat vide avec votre code. Avez-vous des conseils à ce sujet? Serait-ce parce que j'essaie de récupérer la liste d'une tâche cron?
Lorenzo S
@ LorenzoS Salut, quel exemple vous utilisez 1 ou 2? Existe-t-il un produit lorsque vous supprimez tous les filtres / conditions?
Siarhey Uchukhlebau
Comment obtenir cet onglet "Variables" avec l'arborescence des objets dans votre capture d'écran?
DevonDahon
@maxagaz Utilisation de xDebug dans PHPStorm
Siarhey Uchukhlebau
excellente réponse, @SiarheyUchukhlebau mais qu'entendez-vous par Si vous avez besoin de données sur les produits, utilisez la première classe. Si vous avez besoin d'obtenir les instances de produit, utilisez la deuxième classe.
Yehia A.Salam
2

À l'aide d'un appel d'API REST:

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

Récupère tous les produits. "searchCriteria" est un paramètre obligatoire, mais peut être laissé vide, comme ci-dessus.

Jamez
la source
2

La réponse la plus votée fonctionne, mais je voudrais mentionner qu'injecter directement une implémentation du référentiel de produits entraînera la violation du principe du contrat de service et c'est quelque chose que Magento veut que les développeurs corrigent. Vous devriez injecter \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryau lieu de sa mise en œuvre qui l'est \Magento\Catalog\Model\ProductRepository $productRepository. De cette façon, vous aurez un espace pour de futures capacités de mise à niveau. L'essentiel est d'utiliser les contrats de service autant que possible.

Sarvagya
la source
0

Vous pouvez le faire via une demande API. Jetez un œil à l' API M2 par défaut

pensez que votre meilleure prise de vue est catalogProductRepositoryV1

95623
la source