Wie erhalte ich eine Liste aller Produkte in Magento 2?


11

Wie kann ich eine Liste aller verfügbaren Produkte in Magento 2 erhalten?


Meine Antwort hat dir nicht geholfen?
Siarhey Uchukhlebau

1
Markieren Sie jetzt @SiarheyUchukhlebau Antwort als richtig ....
P0lT10n

Antworten:


21

Sie sollten verwenden Magento\Catalog\Model\ProductRepositoryoder Magento\Catalog\Model\ResourceModel\Product\Collectionnach Ihren Bedürfnissen. Sie können beide Methoden verwenden, um Produktinstanzen mit allen Daten abzurufen.

Beispiel 1 (Repository):

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

Ergebnis:

Repository

Beispiel 2 (Sammlung):

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

Ergebnis:

Sammlung


hi @siarhey, ich bekomme ein leeres Ergebnis mit deinem Code. Hast du irgendwelche Tipps dazu? Könnte es daran liegen, dass ich versuche, die Liste von einer Cron-Aufgabe abzurufen?
Lorenzo S

@ LorenzoS Hallo, welches Beispiel verwendest du 1 oder 2? Gibt es ein Produkt, wenn Sie alle Filter / Bedingungen entfernen?
Siarhey Uchukhlebau

Wie erhalten Sie diese Registerkarte "Variablen" mit dem Objektbaum in Ihrem Screenshot?
DevonDahon

@maxagaz Verwenden von xDebug in PHPStorm
Siarhey Uchukhlebau

tolle Antwort, @SiarheyUchukhlebau, aber was meinst du mit Wenn du nur Produktdaten brauchst, benutze die erste Klasse. Wenn Sie die Produktinstanzen benötigen, verwenden Sie die zweite Klasse.
Yehia A. Salam

1

Verwenden eines REST-API-Aufrufs:

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

Ruft alle Produkte ab. "searchCriteria" ist ein erforderlicher Parameter, kann aber wie oben leer gelassen werden.


1

Die am besten bewertete Antwort funktioniert, aber ich möchte erwähnen, dass hier durch direktes Einfügen einer Produkt-Repository-Implementierung der Verstoß gegen das Prinzip des Servicevertrags verursacht wird. Magento möchte, dass Entwickler dies korrigieren. Sie sollten \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryanstelle der Implementierung injizieren \Magento\Catalog\Model\ProductRepository $productRepository. Auf diese Weise haben Sie Platz für zukünftige Upgrade-Funktionen. Fazit ist, Serviceverträge so weit wie möglich zu nutzen.


0

Sie können dies über eine API-Anfrage tun. Schauen Sie sich die Standard- API von m2 an

Ich denke, dein besseres Shooting ist catalogProductRepositoryV1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.