Magento 2: applica i filtri di visibilità e stato sulla raccolta prodotti


11

Voglio applicare il filtro di visibilità e stato sulla raccolta dei prodotti. Come in Magento 1 facciamo:

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

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

Ottengo la raccolta di prodotti in Magento 2 ma non trovo la funzione per applicare i filtri sopra.

Risposte:


16

Per ottenere la raccolta di prodotti con abilitazione dello stato e visibilità:

devi tenere sotto il codice nel file di blocco.

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

Sopra il codice funziona per tipo di visibilità per:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH

Ho implementato in modo simile @Rakesh, devo ottenere i risultati dei prodotti secondo i filtri applicati, ma i prodotti non vengono visualizzati secondo i filtri ... ho
Sushivam,

@Rakesh Jesadiya Esiste un modo per visualizzare i prodotti "non visibili individualmente" nella pagina dell'elenco dei prodotti
amith lal,

Come aggiungo i filtri a SearchCriteriaBuilderquando utilizzo ProductRepositoryInterface? (Vedi magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris

3

Questo dovrebbe funzionare per te:

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

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

Le classi utilizzate sono:

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

Esamina queste classi per verificare altri metodi per ottenere possibili valori di stato o visibilità.

Tuttavia, rivedi il concetto di repository, per quanto ho visto Magento 2 consiglia di utilizzare il repository per accedere ai dati del prodotto anziché utilizzare la raccolta. Per esempio:

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

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

Ciao, posso verificare se la mia domanda è simile a questa e devo usare searchCriteria? Ci ho provato anche io ma si rompe tutto. magento.stackexchange.com/questions/117112/…
ntzz,

1

per la raccolta di prodotti con abilitazione dello stato e visibilità:

puoi provare con il codice qui sotto

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

per questo codice funziona per tipo di visibilità come:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.