Magento 2: ใช้ตัวกรองการเปิดเผยและสถานะในการรวบรวมผลิตภัณฑ์


11

ฉันต้องการใช้ตัวกรองการมองเห็นและสถานะในการรวบรวมผลิตภัณฑ์ เช่นเดียวกับ Magento 1 เราทำ:

Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);

Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

ฉันได้รับชุดผลิตภัณฑ์ใน Magento 2 แต่ไม่พบฟังก์ชันเพื่อใช้ตัวกรองด้านบน

คำตอบ:


16

สำหรับการรับชุดผลิตภัณฑ์ที่เปิดใช้งานสถานะและการมองเห็น:

คุณต้องเก็บรหัสด้านล่างในไฟล์บล็อก

protected $productCollectionFactory;
protected $productVisibility;
protected $productStatus;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,        
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility,
    array $data = []
)
{
    $this->productCollectionFactory = $productCollectionFactory;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;
    parent::__construct($context, $data);
}

public function getProductCollection()
{
    $collection = $this->productCollectionFactory->create();
    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());
    return $collection;
}

โค้ดด้านบนใช้งานได้กับประเภทการมองเห็นสำหรับ:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH

ฉันได้ดำเนินการในลักษณะที่คล้ายกัน @Rakesh ฉันต้องได้ผลลัพธ์ของผลิตภัณฑ์ตามตัวกรองที่ใช้ แต่ผลิตภัณฑ์ไม่ได้แสดงผลตามตัวกรอง ... ต้องการความช่วยเหลือที่นี่ ... magento.stackexchange.com/questions / 136959 / …
Sushivam

@Rakesh Jesadiya มีวิธีการแสดง "ไม่ปรากฏเป็นรายบุคคล" ในหน้ารายการผลิตภัณฑ์หรือไม่
amith lal

ฉันจะเพิ่มตัวกรองได้อย่างไรSearchCriteriaBuilderเมื่อใช้งานProductRepositoryInterface? (ดูmagento.stackexchange.com/a/84347/60128 )
Jānis Elmeris

3

สิ่งนี้น่าจะเหมาะกับคุณ:

    $collection = $this->collectionFactory->create();

    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());

คลาสที่ใช้คือ:

/**
 * @var \Magento\Catalog\Model\Resource\Product\CollectionFactory
 */
protected $collectionFactory;

/**
 * @var \Magento\Catalog\Model\Product\Attribute\Source\Status
 */
protected $productStatus;

/**
 * @var \Magento\Catalog\Model\Product\Visibility
 */
protected $productVisibility;

ตรวจสอบคลาสเหล่านี้เพื่อตรวจสอบวิธีอื่นเพื่อรับสถานะที่เป็นไปได้หรือค่าการมองเห็น

อย่างไรก็ตามทบทวนแนวคิดของที่เก็บเท่าที่ฉันเห็น Magento 2 แนะนำให้ใช้ที่เก็บเพื่อเข้าถึงข้อมูลผลิตภัณฑ์แทนที่จะใช้การรวบรวม ตัวอย่างเช่น:

$searchCriteria = $this->searchCriteriaBuilder->create();

$products = $this->productRepository->getList($searchCriteria)->getItems();

สวัสดีสามารถตรวจสอบว่าคำถามของฉันคล้ายกับสิ่งนี้และฉันต้องใช้ searchCriteria หรือไม่ ฉันก็ลองเหมือนกัน แต่มันก็แบ่งทั้งหมด magento.stackexchange.com/questions/117112/…
ntzz

1

สำหรับการรวบรวมผลิตภัณฑ์ที่มีสถานะเปิดใช้งานและการเปิดเผย:

คุณสามารถลองด้วยรหัสด้านล่าง

protected $productCollectionFactory;
protected $productVisibility;
protected $productStatus;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,        
    \Magento\Catalog\Model\ResourceModel\Product\CollectionFactory $productCollectionFactory,
    \Magento\Catalog\Model\Product\Attribute\Source\Status $productStatus,
    \Magento\Catalog\Model\Product\Visibility $productVisibility,
    array $data = []
)
{
    $this->productCollectionFactory = $productCollectionFactory;
    $this->productStatus = $productStatus;
    $this->productVisibility = $productVisibility;
    parent::__construct($context, $data);
}

public function getProductCollection()
{
    $collection = $this->productCollectionFactory->create();
    $collection->addAttributeToFilter('status', ['in' => $this->productStatus->getVisibleStatusIds()]);
    $collection->setVisibility($this->productVisibility->getVisibleInSiteIds());
    return $collection;
}

สำหรับรหัสนี้ใช้งานได้กับประเภทการมองเห็นเช่น:

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