Magento 2의 모든 제품 목록을 얻는 방법?


11

Magento 2에서 사용 가능한 모든 제품 목록을 얻으려면 어떻게해야합니까?


내 대답이 도움이되지 않습니까?
Siarhey Uchukhlebau

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 작업에서 목록을 검색하려고했기 때문일 수 있습니까?
Lorenzo S

@LorenzoS 안녕하세요, 어느 예에서 1 또는 2를 사용하고 있습니까? 모든 필터 / 조건을 제거 할 때 제품이 있습니까?
Siarhey Uchukhlebau

스크린 샷에 개체 트리가있는이 "변수"탭을 얻는 방법은 무엇입니까?
DevonDahon


훌륭한 답변, @SiarheyUchukhlebau 그러나 당신은 무엇을 의미합니까 제품 데이터 만 필요하다면 첫 번째 클래스를 사용하십시오. 제품 인스턴스를 가져와야하는 경우 두 번째 클래스를 사용하십시오.
Yehia A.Salam

2

REST API 호출 사용

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

모든 제품을 검색합니다. "searchCriteria"는 필수 매개 변수이지만 위와 같이 비워 둘 수 있습니다.


2

가장 유력한 답변이 효과가 있지만 여기서는 제품 리포지토리 구현을 직접 주입하여 서비스 계약 원칙을 위반하게되며 이는 마 젠토가 개발자가 수정하기를 원하는 것입니다. \Magento\Catalog\Api\ProductRepositoryInterface $productRepository구현 인 대신 주입해야합니다 \Magento\Catalog\Model\ProductRepository $productRepository. 이렇게하면 향후 업그레이드 기능을위한 공간이 생깁니다. 결론은 가능한 한 서비스 계약을 사용하는 것입니다.


0

API 요청을 통해이 작업을 수행 할 수 있습니다. 기본 m2 API를 살펴보십시오

더 나은 촬영은 카탈로그라고 생각하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.