Magento 2: aplique filtros de visibilidad y estado en la colección de productos


11

Quiero aplicar visibilidad y filtro de estado en la colección de productos. Como en Magento 1 hacemos:

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

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

Obtengo la colección de productos en Magento 2 pero no encuentro la función para aplicar los filtros anteriores.

Respuestas:


16

Para obtener una colección de productos con habilitación de estado y visibilidad:

tienes que mantener el siguiente código en el archivo de bloque.

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

El código anterior funciona para el tipo de visibilidad para:

  • VISIBILITY_IN_SEARCH
  • VISIBILIDAD_ EN_CATÁLOGO
  • VISIBILIDAD_ AMBOS

He implementado de manera similar a @Rakesh, necesito obtener los resultados de los productos según los filtros aplicados, pero los productos no se procesan según los filtros ... necesito ayuda aquí ... magento.stackexchange.com/questions / 136959 / ...
— Sushivam

@Rakesh Jesadiya ¿Hay alguna manera de pantalla "no es visible de forma individual" Productos en la página la lista de productos
— amith lal

¿Cómo agrego los filtros SearchCriteriaBuilderal usar ProductRepositoryInterface? (Ver magento.stackexchange.com/a/84347/60128. )
— Jānis Elmeris

3

Esto debería funcionar para usted:

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

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

Las clases utilizadas son:

/**
 * @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 estas clases para verificar otros métodos para obtener posibles valores de estado o visibilidad.

Sin embargo, revise el concepto de repositorios, por lo que vi, Magento 2 recomienda usar el repositorio para acceder a los datos del producto en lugar de usar la recopilación. Por ejemplo:

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

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

Hola, ¿podría verificar si mi pregunta es similar a esta y tengo que usar los criterios de búsqueda? También lo intenté pero lo rompe todo. magento.stackexchange.com/questions/117112/…
— ntzz

0

para la colección de productos con habilitación de estado y visibilidad:

puedes probar con el siguiente código

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 este código que funciona para el tipo de visibilidad como:

VISIBILITY_IN_SEARCH
VISIBILITY_IN_CATALOG
VISIBILITY_BOTH
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.