¿Cómo obtener una lista de todos los productos en Magento 2?

11

¿Cómo puedo obtener una lista de todos los productos disponibles en Magento 2?

nuwaus
fuente
¿Mi respuesta no te ha ayudado?
Siarhey Uchukhlebau
1
Marque ahora @SiarheyUchukhlebau con la respuesta correcta ....
P0lT10n

Respuestas:

22

Debe usar Magento\Catalog\Model\ProductRepositoryo Magento\Catalog\Model\ResourceModel\Product\Collectionsegún sus necesidades. Puede usar ambos métodos para obtener instancias de productos con todos los datos.

Ejemplo 1 (repositorio):

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

Resultado:

repositorio

Ejemplo 2 (Colección):

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

Resultado:

colección

Siarhey Uchukhlebau
fuente
hola @siarhey, obtengo un resultado vacío con tu código. ¿Tienes algún consejo al respecto? ¿Podría ser porque estoy tratando de recuperar la lista de una tarea cron?
Lorenzo S
@LorenzoS Hola, ¿qué ejemplo estás usando 1 o 2? ¿Existe algún producto cuando elimina todos los filtros / condiciones?
Siarhey Uchukhlebau
¿Cómo obtener esta pestaña "Variables" con el árbol de objetos en tu captura de pantalla?
DevonDahon
@maxagaz Usando xDebug en PHPStorm
Siarhey Uchukhlebau
gran respuesta, @SiarheyUchukhlebau, pero ¿a qué te refieres? Si solo necesita datos del producto, use la primera clase. Si necesita obtener las instancias del producto, use la segunda clase.
Yehia A.Salam
2

Usando una llamada a la API REST:

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

Recupera todos los productos. "searchCriteria" es un parámetro requerido, pero puede dejarse en blanco, como se indicó anteriormente.

Jamez
fuente
2

La respuesta más votada está funcionando, pero me gustaría mencionar que al inyectar una implementación del repositorio del producto directamente causará la violación del principio del contrato de servicio y eso es algo que Magento quiere que los desarrolladores corrijan. Debería inyectar en \Magento\Catalog\Api\ProductRepositoryInterface $productRepositorylugar de su implementación, que es \Magento\Catalog\Model\ProductRepository $productRepository. De esa manera, tendrá un espacio para la capacidad de actualización futura. La conclusión es utilizar contratos de servicio tanto como sea posible.

Sarvagya
fuente
0

Puede hacerlo a través de la solicitud de API. Echa un vistazo a la API de m2 predeterminada

piensa que tu mejor sesión es catalogueProductRepositoryV1

95623
fuente