Як отримати список всіх товарів у 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? Чи існує якийсь продукт, коли ви видаляєте всі фільтри / умови?
Сіархей Учукхлебау

Як отримати цю вкладку "Змінні" з деревом об'єктів на екрані екрана?
DevonDahon

@maxagaz Використання xDebug у PHPStorm
Siarhey Uchukhlebau

чудова відповідь, @SiarheyUchukhlebau, але що ви маєте на увазі, якщо вам потрібні лише дані про продукт, використовуйте перший клас. Якщо вам потрібно отримати екземпляри продукту - використовуйте другий клас.
Yehia A.Salam

2

Використання виклику REST API:

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

Вилучає всі продукти. "Критерії пошуку" - це обов'язковий параметр, але його можна залишити порожнім, як зазначено вище.


2

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


0

Це можна зробити за допомогою api-запиту. Погляньте на стандартний м2 api

подумайте, що ваш кращий знімок - каталогProductRepositoryV1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.