Bagaimana cara mendapatkan daftar semua produk di Magento 2?


11

Bagaimana saya bisa mendapatkan daftar semua produk yang tersedia di Magento 2?


Jawaban saya tidak membantu Anda?
Siarhey Uchukhlebau

1
Tandai sekarang @SiarheyUchukhlebau jawaban sudah benar ....
P0lT10n

Jawaban:


22

Anda harus menggunakan Magento\Catalog\Model\ProductRepositoryatau Magento\Catalog\Model\ResourceModel\Product\Collectionsesuai kebutuhan Anda. Anda dapat menggunakan kedua metode untuk mendapatkan contoh produk dengan semua data.

Contoh 1 (Repositori):

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

Hasil:

gudang

Contoh 2 (Koleksi):

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

Hasil:

koleksi


hai @siarhey, saya mendapatkan hasil kosong dengan kode Anda. Apakah Anda punya tips tentang itu? Mungkinkah karena saya mencoba mengambil daftar dari tugas cron?
Lorenzo S

@ LorenzoS Hai, contoh mana yang Anda gunakan 1 atau 2? Apakah ada produk saat Anda menghapus semua filter / kondisi?
Siarhey Uchukhlebau

Bagaimana cara mendapatkan tab "Variabel" ini dengan objek pohon di tangkapan layar Anda?
DevonDahon

@maxagaz Menggunakan xDebug di PHPStorm
Siarhey Uchukhlebau

jawaban yang bagus, @SiarheyUchukhlebau tetapi apa yang Anda maksud dengan Jika Anda hanya membutuhkan data produk, gunakan kelas satu. Jika Anda perlu mendapatkan contoh produk - gunakan kelas dua.
Yehia A.Salam

2

Menggunakan panggilan API REST:

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

Mengambil kembali semua produk. "searchCriteria" adalah param yang diperlukan, tetapi dapat dibiarkan kosong, seperti di atas.


2

Jawaban yang paling banyak dipilih adalah bekerja tetapi saya ingin menyebutkan bahwa di sini dengan menyuntikkan implementasi repositori produk secara langsung akan menyebabkan pelanggaran prinsip kontrak layanan & itu adalah sesuatu yang Magento ingin pengembang perbaiki. Anda harus menyuntikkan \Magento\Catalog\Api\ProductRepositoryInterface $productRepositorybukan implementasi itu \Magento\Catalog\Model\ProductRepository $productRepository. Dengan begitu Anda akan memiliki ruang untuk kemampuan peningkatan di masa mendatang. Intinya adalah menggunakan kontrak Layanan sebanyak mungkin.


0

Anda dapat melakukan ini melalui permintaan api. Lihatlah api standar m2

pikir menembak Anda yang lebih baik adalah catalogProductRepositoryV1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.