Làm thế nào để có được danh sách tất cả các sản phẩm trong Magento 2?


11

Làm cách nào tôi có thể nhận được danh sách tất cả các sản phẩm có sẵn trong Magento 2?


Câu trả lời của tôi đã không giúp bạn?
Siarhey Uchukhlebau

1
Đánh dấu ngay @SiarheyUchukhlebau trả lời đúng ....
P0lT10n

Câu trả lời:


21

Bạn nên sử dụng Magento\Catalog\Model\ProductRepositoryhoặc Magento\Catalog\Model\ResourceModel\Product\Collectiontheo nhu cầu của bạn. Bạn có thể sử dụng cả hai phương pháp để lấy các phiên bản sản phẩm với tất cả dữ liệu.

Ví dụ 1 (Kho lưu trữ):

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

Kết quả:

kho

Ví dụ 2 (Bộ sưu tập):

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

Kết quả:

bộ sưu tập


xin chào @siarhey, tôi nhận được một kết quả trống với mã của bạn. Bạn có bất cứ lời khuyên về nó? Có thể là do tôi đang cố lấy danh sách từ một tác vụ cron?
Lorenzo S

@LorenzoS Xin chào, ví dụ nào bạn đang sử dụng 1 hoặc 2? Có sản phẩm nào tồn tại khi bạn loại bỏ tất cả các bộ lọc / điều kiện không?
Siarhey Uchukhlebau

Làm cách nào để có được tab "Biến" này với cây đối tượng trong ảnh chụp màn hình của bạn?
DevonDahon


câu trả lời tuyệt vời, @SiarheyUchukhlebau nhưng ý của bạn là gì nếu bạn chỉ cần dữ liệu sản phẩm sử dụng lớp đầu tiên. Nếu bạn cần lấy các phiên bản sản phẩm - sử dụng lớp thứ hai.
Yehia A.Salam

1

Sử dụng lệnh gọi API REST:

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

Lấy tất cả các sản phẩm. "searchCriteria" là một tham số bắt buộc, nhưng có thể để trống, như trên.


1

Câu trả lời được đánh giá cao nhất đang hoạt động nhưng tôi muốn đề cập rằng ở đây bằng cách tiêm trực tiếp vào kho lưu trữ sản phẩm sẽ gây ra sự vi phạm nguyên tắc hợp đồng dịch vụ & đó là điều Magento muốn các nhà phát triển sửa. Bạn nên tiêm \Magento\Catalog\Api\ProductRepositoryInterface $productRepositorythay vì đó là thực hiện \Magento\Catalog\Model\ProductRepository $productRepository. Bằng cách đó bạn sẽ có một không gian cho khả năng nâng cấp trong tương lai. Điểm mấu chốt là sử dụng hợp đồng dịch vụ càng nhiều càng tốt.


0

Bạn có thể làm điều này thông qua yêu cầu api. Hãy nhìn vào api m2 mặc định

nghĩ rằng bức ảnh đẹp hơn của bạn là danh mụcSản phẩmRep repositoryV1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.