Magento 2 में सभी उत्पादों की सूची कैसे प्राप्त करें?


11

मैं Magento 2 में सभी उपलब्ध उत्पादों की सूची कैसे प्राप्त कर सकता हूं?


मेरे उत्तर ने आपकी मदद नहीं की?
सियारि उचुकलेबाउ

1
अब निशान @SiarheyUchukhlebau उत्तर को सही
मानें

जवाबों:


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

परिणाम:

संग्रह


hi @siarhey, मुझे आपके कोड के साथ एक खाली परिणाम मिल रहा है। क्या आपके पास इसके बारे में कोई सुझाव है? क्या ऐसा हो सकता है क्योंकि मैं एक क्रोन कार्य से सूची को पुनः प्राप्त करने की कोशिश कर रहा हूं?
लोरेंजो एस

@ लोरेंजो हाय, जो उदाहरण आप 1 या 2 का उपयोग कर रहे हैं? क्या कोई उत्पाद मौजूद है जब आप सभी फ़िल्टर / शर्तों को हटा देते हैं?
सियारि उचुकलेबौ

अपने स्क्रीनशॉट में ऑब्जेक्ट ट्री के साथ यह "चर" टैब कैसे प्राप्त करें?
डेवोनडाहोन


महान जवाब, @SiarheyUchukhlebau लेकिन क्या मतलब है अगर आप की जरूरत है सिर्फ उत्पाद डेटा प्रथम श्रेणी का उपयोग करें। यदि आपको उत्पाद उदाहरण प्राप्त करने की आवश्यकता है - द्वितीय श्रेणी का उपयोग करें।
येहिया ए सलम

2

REST API कॉल का उपयोग करना:

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

सभी उत्पादों को पुनः प्राप्त करता है। "सर्चक्रिटेरिया" एक आवश्यक परम है, लेकिन ऊपर के रूप में खाली छोड़ा जा सकता है।


2

सबसे अधिक उत्तोलित उत्तर काम कर रहा है, लेकिन मैं यह उल्लेख करना चाहूंगा कि यहां एक उत्पाद रिपॉजिटरी कार्यान्वयन को सीधे इंजेक्ट करके सेवा अनुबंध सिद्धांत के उल्लंघन का कारण बन जाएगा और कुछ ऐसा है जो Magento डेवलपर्स को सही करना चाहता है। आपको \Magento\Catalog\Api\ProductRepositoryInterface $productRepositoryइसे लागू करने के बजाय इंजेक्ट करना चाहिए जो कि है \Magento\Catalog\Model\ProductRepository $productRepository। इस तरह से आपके पास भविष्य की अपग्रेड क्षमता के लिए एक स्थान होगा। निचला रेखा सेवा अनुबंधों का यथासंभव उपयोग करती है।


0

आप यह आपी अनुरोध के माध्यम से कर सकते हैं। डिफ़ॉल्ट एम 2 एपीआई पर एक नज़र डालें

लगता है कि आपका बेहतर शूट कैटलॉगप्रोडर रिपोसिटरी वी 1 है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.