Как получить список всех продуктов в Magento 2?


Ответы:


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?
Лоренцо С

@LorenzoS Привет, какой пример вы используете 1 или 2? Существует ли какой-либо продукт при удалении всех фильтров / условий?
Сергей Учухлебау

Как получить эту вкладку «Переменные» с деревом объектов на скриншоте?
DevonDahon

@maxagaz Использование xDebug в PHPStorm
Сергей Учухлебау

отличный ответ, @SiarheyUchukhlebau, но что вы подразумеваете под Если вам нужны только данные о продукте, используйте первый класс. Если вам нужно получить экземпляры продукта - используйте второй класс.
Yehia A.Salam

2

Использование вызова REST API:

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

Получает все продукты. «searchCriteria» является обязательным параметром, но его можно оставить пустым, как указано выше.


2

Ответ с наибольшим количеством голосов работает, но я хотел бы упомянуть, что здесь непосредственное внедрение реализации репозитория продукта приведет к нарушению принципа контракта на обслуживание, и это то, что Magento хочет, чтобы разработчики исправили. Вы должны внедрить \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryвместо его реализации, которая есть \Magento\Catalog\Model\ProductRepository $productRepository. Таким образом, у вас будет место для будущего обновления способности. Суть в том, чтобы максимально использовать контракты на обслуживание.


0

Вы можете сделать это через запрос API. Посмотрите на API по умолчанию м2

думаю, что лучше снимать каталоги ProductRepositoryV1

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.