Magento 2: appliquer des filtres de visibilité et de statut sur la collection de produits

11

Je souhaite appliquer un filtre de visibilité et de statut sur la collection de produits. Comme dans Magento 1, nous faisons:

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

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

J'obtiens la collection de produits dans Magento 2 mais je ne trouve pas de fonction pour appliquer les filtres ci-dessus.

Shaheer Ali
la source

Réponses:

16

Pour obtenir la collection de produits avec l'activation du statut et la visibilité:

vous devez conserver le code ci-dessous dans le fichier de blocage.

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

Code ci-dessus fonctionnant pour le type de visibilité pour:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH
Rakesh Jesadiya
la source
J'ai implémenté de manière similaire @Rakesh, j'ai besoin d'obtenir les résultats des produits selon les filtres appliqués, mais les produits ne sont pas rendus selon les filtres ... besoin d'aide ici ... magento.stackexchange.com/questions / 136959 /…
Sushivam
@Rakesh Jesadiya Existe-t-il un moyen d'afficher les produits "non visibles individuellement" dans la page de liste des produits
amith lal
Comment ajouter les filtres SearchCriteriaBuilderlors de l'utilisation ProductRepositoryInterface? (Voir magento.stackexchange.com/a/84347/60128. )
Jānis Elmeris
3

Cela devrait fonctionner pour vous:

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

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

Les classes utilisées sont:

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

Passez en revue ces classes pour vérifier d'autres méthodes afin d'obtenir des valeurs d'état ou de visibilité possibles.

Cependant, passez en revue le concept de référentiels, pour autant que je sache, Magento 2 recommande d'utiliser le référentiel pour accéder aux données produit au lieu d'utiliser la collecte. Par exemple:

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

$products = $this->productRepository->getList($searchCriteria)->getItems();
Wojtek Naruniec
la source
Salut, pourrait vérifier si ma question est similaire à celle-ci et je dois utiliser les critères de recherche? J'avais essayé aussi mais ça casse tout. magento.stackexchange.com/questions/117112/…
ntzz
1

pour la collecte de produits avec statut activé et visibilité:

vous pouvez essayer avec le code ci-dessous

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

pour ce code fonctionnant pour le type de visibilité comme:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Anas Mansuri
la source