Come ottenere un elenco di tutti i prodotti in Magento 2?


Risposte:


22

È necessario utilizzare Magento\Catalog\Model\ProductRepositoryo in Magento\Catalog\Model\ResourceModel\Product\Collectionbase alle proprie esigenze. È possibile utilizzare entrambi i metodi per ottenere istanze del prodotto con tutti i dati.

Esempio 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;
}

Risultato:

deposito

Esempio 2 (raccolta):

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

Risultato:

collezione


ciao @siarhey, sto ottenendo un risultato vuoto con il tuo codice. Hai qualche consiglio a riguardo? Potrebbe essere perché sto cercando di recuperare l'elenco da un'attività cron?
Lorenzo S,

@LorenzoS Ciao, quale esempio stai usando 1 o 2? Esiste un prodotto quando si rimuovono tutti i filtri / condizioni?
Siarhey Uchukhlebau,

Come si ottiene questa scheda "Variabili" con l'albero degli oggetti nello screenshot?
DevonDahon,

@maxagaz Utilizzo di xDebug in PHPStorm
Siarhey Uchukhlebau

ottima risposta, @SiarheyUchukhlebau ma cosa intendi se hai bisogno solo di dati di prodotto usa la prima classe. Se è necessario ottenere le istanze del prodotto, utilizzare la seconda classe.
Yehia A.Salam

2

Utilizzando una chiamata API REST:

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

Recupera tutti i prodotti. "searchCriteria" è un parametro richiesto, ma può essere lasciato vuoto, come sopra.


2

La risposta più votata funziona, ma vorrei menzionare che qui iniettando direttamente un'implementazione del repository di prodotti causerà la violazione del principio del contratto di servizio e questo è qualcosa che Magento vuole che gli sviluppatori correggano. Dovresti iniettare \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryinvece della sua implementazione che è \Magento\Catalog\Model\ProductRepository $productRepository. In questo modo avrai uno spazio per le future capacità di aggiornamento. In conclusione, utilizzare i contratti di assistenza il più possibile.


0

Puoi farlo tramite la richiesta API. Dai un'occhiata all'API m2 predefinita

pensa che il tuo scatto migliore sia catalogProductRepositoryV1

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.