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.

Shaheer Ali
fuente

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
Rakesh Jesadiya
fuente
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();
Wojtek Naruniec
fuente
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
Anas Mansuri
fuente