Magento 2: Terapkan filter visibilitas dan status pada koleksi produk

11

Saya ingin menerapkan visibilitas dan filter status pada koleksi produk. Seperti di Magento 1, kami melakukannya:

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

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

Saya mendapatkan koleksi produk di Magento 2 tetapi tidak menemukan fungsi untuk menerapkan filter di atas.

Shaheer Ali
sumber

Jawaban:

16

Untuk mendapatkan koleksi produk dengan status aktif dan visibilitas:

Anda harus menyimpan kode di bawah ini dalam file blok.

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

Kode di atas berfungsi untuk jenis visibilitas untuk:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH
Rakesh Jesadiya
sumber
Saya telah menerapkan @Rakesh dengan cara yang sama, saya perlu mendapatkan hasil dari produk sesuai dengan filter yang diterapkan, tetapi produk tidak merender sesuai dengan filter ... butuh bantuan di sini ... magento.stackexchange.com/questions / 136959 / ...
Sushivam
@Rakesh Jesadiya Apakah ada cara untuk menampilkan "tidak terlihat secara individual" Produk di halaman daftar produk
amith lal
Bagaimana cara menambahkan filter SearchCriteriaBuildersaat menggunakan ProductRepositoryInterface? (Lihat magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris
3

Ini seharusnya bekerja untuk Anda:

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

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

Kelas yang digunakan adalah:

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

Tinjau kelas ini untuk memeriksa metode lain untuk mendapatkan kemungkinan status atau nilai visibilitas.

Namun, tinjau konsep repositori, sejauh yang saya lihat Magento 2 merekomendasikan menggunakan repositori untuk mengakses data produk daripada menggunakan koleksi. Sebagai contoh:

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

$products = $this->productRepository->getList($searchCriteria)->getItems();
Wojtek Naruniec
sumber
Hai, dapat memeriksa apakah pertanyaan saya mirip dengan ini dan saya harus menggunakan kriteriaCariC? Saya sudah mencobanya juga tetapi itu merusak semua. magento.stackexchange.com/questions/117112/...
ntzz
1

untuk pengumpulan produk dengan status aktif dan visibilitas:

Anda dapat mencoba dengan kode di bawah ini

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

untuk kode ini berfungsi untuk jenis visibilitas seperti:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Anas Mansuri
sumber