Magento 2: Wenden Sie Sichtbarkeits- und Statusfilter auf die Produktsammlung an

11

Ich möchte Sichtbarkeits- und Statusfilter auf die Produktsammlung anwenden. Wie in Magento 1 machen wir:

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

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

Ich erhalte die Produktkollektion in Magento 2, finde jedoch keine Funktion zum Anwenden der obigen Filter.

Shaheer Ali
quelle

Antworten:

15

So erhalten Sie eine Produktkollektion mit Statusaktivierung und Sichtbarkeit:

Sie müssen den folgenden Code in der Blockdatei behalten.

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

Der obige Code funktioniert für den Sichtbarkeitstyp für:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH
Rakesh Jesadiya
quelle
Ich habe @Rakesh auf ähnliche Weise implementiert. Ich muss die Ergebnisse der Produkte gemäß den angewendeten Filtern abrufen
Sushivam
@ Rakesh Jesadiya Gibt es eine Möglichkeit, "nicht einzeln sichtbar" Produkte in der Produktlistenseite
anzuzeigen
Wie füge ich die Filter hinzu, SearchCriteriaBuilderwenn ich sie verwende ProductRepositoryInterface? (Siehe magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris
3

Dies sollte für Sie funktionieren:

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

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

Verwendete Klassen sind:

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

Überprüfen Sie diese Klassen, um andere Methoden zu überprüfen, um mögliche Status- oder Sichtbarkeitswerte zu erhalten.

Wenn Sie jedoch das Konzept der Repositorys überprüfen, empfiehlt Magento 2 meines Erachtens die Verwendung des Repositorys für den Zugriff auf Produktdaten anstelle der Erfassung. Zum Beispiel:

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

$products = $this->productRepository->getList($searchCriteria)->getItems();
Wojtek Naruniec
quelle
Hallo, könnte ich überprüfen, ob meine Frage ähnlich ist und ich die searchCriteria verwenden muss? Ich hatte es auch versucht, aber es bricht alles. magento.stackexchange.com/questions/117112/…
ntzz
0

für die Produktkollektion mit Statusfreigabe und Sichtbarkeit:

Sie können es mit dem folgenden Code versuchen

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

für diesen Code, der für den Sichtbarkeitstyp arbeitet, wie:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Anas Mansuri
quelle