Magento 2: Zastosuj filtry widoczności i statusu w kolekcji produktów

11

Chcę zastosować filtr widoczności i statusu w kolekcji produktów. Podobnie jak w Magento 1:

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

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

Otrzymuję kolekcję produktów w Magento 2, ale nie mogę znaleźć funkcji do zastosowania powyżej filtrów.

Shaheer Ali
źródło

Odpowiedzi:

16

Aby uzyskać kolekcję produktów z włączonym statusem i widocznością:

musisz trzymać poniżej kodu w pliku bloku.

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

Powyższy kod działający dla typu widoczności dla:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH
Rakesh Jesadiya
źródło
Zaimplementowałem w podobny sposób @Rakesh, muszę uzyskać wyniki produktów zgodnie z zastosowanymi filtrami, ale produkty nie są renderowane zgodnie z filtrami ... potrzebuję pomocy tutaj ... magento.stackexchange.com/questions / 136959 /…
Sushivam
@Rakesh Jesadiya Czy jest jakiś sposób, aby wyświetlić „niewidoczne indywidualnie” Produkty na stronie listy produktów
amith lal
Jak dodać filtry SearchCriteriaBuilderpodczas korzystania ProductRepositoryInterface? (Patrz magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris
3

To powinno Ci pomóc:

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

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

Stosowane klasy to:

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

Przejrzyj te klasy, aby sprawdzić inne metody uzyskania możliwych wartości statusu lub widoczności.

Jednak przegląd koncepcji repozytoriów, o ile widziałem, Magento 2 zaleca używanie repozytorium do uzyskiwania dostępu do danych produktu zamiast korzystania z kolekcji. Na przykład:

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

$products = $this->productRepository->getList($searchCriteria)->getItems();
Wojtek Naruniec
źródło
Cześć, mogę sprawdzić, czy moje pytanie jest podobne do tego i muszę użyć searchCriteria? Też spróbowałem, ale wszystko się psuje. magento.stackexchange.com/questions/117112/…
ntzz
1

w przypadku kolekcji produktów z włączonym statusem i widocznością:

możesz spróbować z poniższym kodem

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

dla tego kodu działającego dla typu widoczności, takiego jak:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Anas Mansuri
źródło