Magento 2'deki tüm ürünlerin listesi nasıl alınır?


Yanıtlar:


22

Kullanmanız gerekir Magento\Catalog\Model\ProductRepositoryveya Magento\Catalog\Model\ResourceModel\Product\Collectionihtiyaçlarınıza göre. Tüm verileri içeren ürün örneklerini almak için her iki yöntemi de kullanabilirsiniz.

Örnek 1 (Depo):

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

Sonuç:

depo

Örnek 2 (Koleksiyon):

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

Sonuç:

Toplamak


merhaba @siarhey, kodunuzla boş bir sonuç alıyorum. Bununla ilgili ipuçlarınız var mı? Listeyi bir cron görevinden almaya çalıştığım için olabilir mi?
Lorenzo S

@LorenzoS Merhaba, hangi örneği 1 veya 2 kullanıyorsunuz? Tüm filtreleri / koşulları kaldırdığınızda herhangi bir ürün var mı?
Siarhey Uchukhlebau

Ekran görüntünüzde nesne ağacıyla bu "Değişkenler" sekmesini nasıl edinebilirsiniz?
DevonDahon


büyük cevap, @SiarheyUchukhlebau ama ne demek istiyorsun Sadece ürün verilerine ihtiyacınız varsa birinci sınıf kullanın. Ürün örneklerini almanız gerekiyorsa - ikinci sınıfı kullanın.
Yehia A.Salam

2

Bir REST API çağrısı kullanma:

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

Tüm ürünleri alır. "searchCriteria" zorunlu bir parametredir, ancak yukarıdaki gibi boş bırakılabilir.


2

En çok oylanan cevap işe yarıyor, ancak burada doğrudan bir ürün veri havuzu uygulaması enjekte ederek hizmet sözleşmesi ilkesinin ihlaline neden olacağını ve Magento'nun geliştiricilerin düzeltmesini istediği bir şey olduğunu belirtmek isterim. \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryUygulanması yerine enjekte etmelisiniz \Magento\Catalog\Model\ProductRepository $productRepository. Bu şekilde gelecekteki yükseltme yeteneğiniz için bir alanınız olacaktır. Sonuç olarak hizmet sözleşmelerini mümkün olduğunca kullanın.


0

Bunu api isteği ile yapabilirsiniz. Varsayılan m2 api'ye bir göz atın

daha iyi çekimin katalog olduğunu düşünür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.