Magento 2: Ürün koleksiyonuna görünürlük ve durum filtreleri uygulayın


11

Görünürlük ve durum filtresini ürün koleksiyonuna uygulamak istiyorum. Magento 1'de olduğu gibi:

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

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

Magento 2'de ürün koleksiyonunu alıyorum, ancak yukarıdaki filtrelere uygulanacak işlevi bulamıyorum.

Yanıtlar:


16

Durum etkinleştirme ve görünürlük özelliklerine sahip ürün koleksiyonu almak için:

blok dosyasında kodun altında kalmanız gerekir.

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

Aşağıdakiler için görünürlük türü için çalışan kod:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH

@Rakesh'e benzer bir şekilde uyguladım, uygulanan filtrelere göre ürünlerin sonuçlarını almam gerekiyor, ancak ürünler filtrelere göre oluşturulmuyor ... burada yardıma ihtiyacım var ... magento.stackexchange.com/questions / 136959 /…
Sushivam

@Rakesh Jesadiya Ürün listesi sayfasındaki "tek tek görünür değil" ürünlerini görüntülemenin herhangi bir yolu var mı
amith lal 20:17

Filtreleri SearchCriteriaBuilderkullanırken nasıl eklerim ProductRepositoryInterface? (Bkz. Magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris

3

Bunun sizin için çalışması gerekir:

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

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

Kullanılan sınıflar:

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

Olası durum veya görünürlük değerlerini almak için başka yöntemleri kontrol etmek için bu sınıfları gözden geçirin.

Bununla birlikte, Magento 2'yi gördüğüm kadarıyla depolar kavramını gözden geçirin, koleksiyon kullanmak yerine ürün verilerine erişmek için havuz kullanılmasını önerir. Örneğin:

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

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

Merhaba, sorum buna benzer olup olmadığını kontrol edebilir ve ben searchCriteria kullanmak zorunda? Ben de denedim ama hepsi kırıyor. magento.stackexchange.com/questions/117112/…
ntzz

1

durum etkinleştirme ve görünürlüğe sahip ürün toplama için:

aşağıdaki kodu deneyebilirsiniz

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

aşağıdaki gibi görünürlük türü için çalışan bu kod için:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
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.