วิธีรับรายการผลิตภัณฑ์ทั้งหมดใน 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 มีผลิตภัณฑ์ใดบ้างเมื่อคุณลบตัวกรอง / เงื่อนไขทั้งหมด
Siarhey Uchukhlebau

จะรับแท็บ "ตัวแปร" นี้พร้อมกับแผนผังวัตถุในภาพหน้าจอของคุณได้อย่างไร
DevonDahon


คำตอบที่ดี @SiarheyUchukhlebau แต่คุณหมายถึงอะไร ถ้าคุณต้องการเพียงข้อมูลผลิตภัณฑ์ใช้ชั้นหนึ่ง หากคุณต้องการรับอินสแตนซ์ของผลิตภัณฑ์ - ใช้คลาสที่สอง
Yehia A.Salam

2

การใช้การเรียกใช้ REST API:

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

ดึงผลิตภัณฑ์ทั้งหมด "searchCriteria" เป็นพารามิเตอร์ที่จำเป็น แต่สามารถเว้นว่างไว้ด้านบนได้


2

คำตอบที่ upvoted ที่สุดใช้งานได้ แต่ฉันต้องการพูดถึงว่าที่นี่โดยการฉีดการใช้พื้นที่เก็บข้อมูลผลิตภัณฑ์โดยตรงจะทำให้เกิดการละเมิดหลักการสัญญาบริการและนั่นคือสิ่งที่วีโอไอพีต้องการให้นักพัฒนาแก้ไข คุณควรฉีดแทนของการดำเนินงานของมันซึ่งเป็น\Magento\Catalog\Api\ProductRepositoryInterface $productRepository \Magento\Catalog\Model\ProductRepository $productRepositoryด้วยวิธีนี้คุณจะมีพื้นที่สำหรับความสามารถในการอัพเกรดในอนาคต บรรทัดล่างคือการใช้สัญญาบริการให้ได้มากที่สุด


0

คุณสามารถทำได้ผ่านคำขอ API ลองดูค่าเริ่มต้น m2 api

คิดว่าการถ่ายที่ดีกว่าของคุณคือ catalogProductRepositoryV1

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.