Magento 2: Aplique filtros de visibilidade e status na coleção de produtos

11

Quero aplicar o filtro de visibilidade e status na coleção de produtos. Como no Magento 1, fazemos:

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

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

Recebo a coleção de produtos no Magento 2, mas não encontro a função para aplicar os filtros acima.

Shaheer Ali
fonte

Respostas:

15

Para obter a coleção de produtos com status, habilite e visibilidade:

você deve manter o código abaixo no arquivo de bloco.

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

Código acima trabalhando para o tipo de visibilidade para:

  • VISIBILITY_IN_SEARCH
  • VISIBILITY_IN_CATALOG
  • VISIBILITY_BOTH
Rakesh Jesadiya
fonte
Eu implementei de maneira semelhante @Rakesh, preciso obter os resultados dos produtos conforme os filtros aplicados, mas os produtos não estão sendo processados ​​conforme os filtros ... preciso de ajuda aqui ... magento.stackexchange.com/questions / 136959 /…
Sushivam 19/09/16
@Rakesh Jesadiya Existe alguma maneira de exibição "não visível individualmente" produtos em página da lista de produtos
Amith lal
Como adiciono os filtros ao SearchCriteriaBuilderusar ProductRepositoryInterface? (Veja magento.stackexchange.com/a/84347/60128. ) #
319 Jānis Elmeris
3

Isso deve funcionar para você:

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

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

As classes usadas são:

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

Revise essas classes para verificar outros métodos para obter possíveis valores de status ou visibilidade.

No entanto, revise o conceito de repositórios, tanto quanto vi que o Magento 2 recomenda usar o repositório para acessar os dados do produto em vez de usar a coleção. Por exemplo:

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

$products = $this->productRepository->getList($searchCriteria)->getItems();
Wojtek Naruniec
fonte
Oi, poderia verificar se minha pergunta é semelhante a esta e eu tenho que usar o searchCriteria? Eu também tentei, mas isso quebra tudo. magento.stackexchange.com/questions/117112/…
ntzz
0

para coleta de produtos com status ativado e visibilidade:

você pode tentar com o código abaixo

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

para esse código trabalhando para o tipo de visibilidade, como:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Anas Mansuri
fonte