Magento 2のすべての製品のリストを取得するにはどうすればよいですか?


11

Magento 2で利用可能なすべての製品のリストを取得するにはどうすればよいですか?


私の答えはあなたを助けませんでしたか?
Siarhey Uchukhlebau 16

1
今すぐ@SiarheyUchukhlebauの答えを正解としてマークしてください...
P0lT10n

回答:


22

あなたは使用すべきMagento\Catalog\Model\ProductRepositoryか、Magento\Catalog\Model\ResourceModel\Product\Collectionあなたのニーズに応じて。両方の方法を使用して、すべてのデータを含む製品インスタンスを取得できます。

例1(リポジトリ):

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

結果:

リポジトリ

例2(コレクション):

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

結果:

コレクション


こんにちは@siarhey、私はあなたのコードで空の結果を得ています。何かヒントはありますか?cronタスクからリストを取得しようとしているためでしょうか?
ロレンソS

@LorenzoSこんにちは、1と2のどちらの例を使用していますか?すべてのフィルター/条件を削除すると、製品が存在しますか?
Siarhey Uchukhlebau 2017

スクリーンショットのオブジェクトツリーでこの「変数」タブを取得するにはどうすればよいですか?
DevonDahon


すばらしい回答です。@ SiarheyUchukhlebau ですが、製品データだけが必要な場合は、ファーストクラスを使用してください。製品インスタンスを取得する必要がある場合-2番目のクラスを使用します。
Yehia A.Salam 2017年

2

REST API呼び出しの使用:

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

すべての製品を取得します。「searchCriteria」は必須パラメーターですが、上記のように空白のままにすることができます。


2

最も賛成された答えは機能していますが、ここで製品リポジトリの実装を直接注入するとサービス契約の原則に違反することになります。これはMagentoが開発者に修正してほしいことです。あなたは\Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryそれである実装の代わりに注入する必要があり\Magento\Catalog\Model\ProductRepository $productRepositoryます。そうすれば、将来のアップグレード能力のためのスペースができます。結論は、可能な限り使用サービス契約です。


0

これは、apiリクエストを通じて実行できます。デフォルトのM2 APIを見てください

あなたのより良い撮影はcatalogProductRepositoryV1だと思います

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.