Estoy trabajando para buscar navegación en capas en magento2 para una colección de productos personalizada. Ya estoy obteniendo una colección personalizada en la página personalizada, necesito mostrar navegación en capas. Intenté adaptar esta solución magento1 pero no pude llegar muy lejos.
Alguna idea de cómo podría lograrlo en magento2. Lo que he hecho hasta ahora es el siguiente:
Se extendió el bloque Catálogo de productos de lista para la lista de productos personalizados en mi página personalizada.
class View extends \Magento\Catalog\Block\Product\ListProduct
{
public function __construct(
\Magento\Catalog\Block\Product\Context $context,
\Magento\Framework\Data\Helper\PostHelper $postDataHelper,
\Magento\Catalog\Model\Layer\Resolver $layerResolver,
CategoryRepositoryInterface $categoryRepository,
\Magento\Framework\Url\Helper\Data $urlHelper,
array $data = [],
\Custom\LayerNavigation\Model\Layer $testlayerobj
) {
parent::__construct($context,$postDataHelper,$layerResolver,
$categoryRepository,$urlHelper,$data);
$this->_coreRegistry = $context->getRegistry();
$this->_testlayer = $testlayerobj;
}
protected function _getProductCollection()
{
if ($this->_productCollection === null) {
$this->_productCollection = $this->getLayer()->getProductCollection();
}
return $this->_productCollection;
}
public function getLayer()
{
$layer = $this->_coreRegistry->registry('current_layer');
if ($layer) {
return $layer;
}
return $this->_testlayer;
}
}
Usó el bloque de búsqueda principal para la navegación en capas en el archivo de diseño
<referenceContainer name="sidebar.main">
<block class="Magento\LayeredNavigation\Block\Navigation\Search" name="catalogsearch.leftnav" before="-" template="layer/view.phtml">
<block class="Magento\LayeredNavigation\Block\Navigation\State" name="catalogsearch.navigation.state" as="state" />
<block class="Magento\LayeredNavigation\Block\Navigation\FilterRenderer" name="catalogsearch.navigation.renderer" as="renderer" template="layer/filter.phtml"/>
</block>
</referenceContainer>
Modelo de capa Core extendido para modificar la colección.
class Layer extends \Magento\Catalog\Model\Layer
{
public function __construct(
optionStoreFactory $optionstoreFactory,
Attrhelper $attrhelper,
productCollectionFactory $productCollectionFactory,
AttributevalueFactory $attributevalueFactory,
CategoryRepositoryInterface $categoryRepository,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\App\Request\Http $request,
\Magento\Framework\Registry $registry,
\Magento\Catalog\Model\Layer\Search\CollectionFilter $filter,
array $data = []
) {
$this->optionstoreFactory = $optionstoreFactory;
$this->attributevalueFactory = $attributevalueFactory;
$this->_attrhelper = $attrhelper;
$this->request = $request;
$this->productCollectionFactory = $productCollectionFactory;
$this->categoryRepository = $categoryRepository;
$this->_storeManager = $storeManager;
$this->filter = $filter;
$this->registry = $registry;
}
public function getProductCollection()
{
$attributevalue = $this->getAttributeValue(); //eg: Manufacturer Attribute details
$attr_code = $attributevalue->getAttributeCode();
$attr_option_value = $attributevalue->getOptionId();
$collection = $this->productCollectionFactory->create();
$store_id = $this->request->getParam('store_id');
$collection->addAttributeToSelect('*')
->addAttributeToFilter($attr_code , ['finset'=>$attr_option_value ])
->addAttributeToFilter('visibility','4')
->setStore($store_id)
->addFieldToFilter('status', array('eq' => 1))
->setOrder('id', 'DESC');
$this->prepareProductCollection($collection);
return $collection;
}
public function prepareProductCollection($collection)
{
$this->filter->filter($collection, $this->getCurrentCategory());
return $this;
}
public function getCurrentCategory()
{
$category = $this->registry->registry('current_category');
if ($category) {
$this->setData('current_category', $category);
} else {
$category = $this->categoryRepository->get($this->getCurrentStore()->getRootCategoryId());
$this->setData('current_category', $category);
}
return $category;
}
public function getCurrentStore()
{
return $this->_storeManager->getStore();
}
}
A partir de ahora, se muestra la navegación de capa, pero no es específica de mi colección personalizada. Según mi depuración, la colección se filtra desde la categoría raíz (que contiene todo el catálogo de productos) y, de acuerdo con esto, está recuperando las capas.
Respuestas:
Pude lograr la navegación con los cambios a continuación, es posible que no esté completamente correcto con esta solución, por lo que los comentarios y sugerencias son bienvenidos.
fuente
Apliqué con éxito mi colección de productos personalizados en la barra de herramientas y navegación en capas de la página de categoría.
Por ejemplo, estoy buscando la colección de esos productos cuyo precio es inferior a 100.
Paso 1: agregue el fragmento de código a continuación
Paso 2: crear un complemento para la colección de productos
Paso 3: crear un complemento para la barra de herramientas
fuente
Pude obtener navegación en capas principalmente trabajando para una colección de productos personalizada en una página personalizada. Subí el código fuente de mi módulo aquí . Los únicos problemas son que el filtro de precios no muestra los recuentos de productos correctos. Debido a esto, modifiqué la vista de navegación en capas para ocultar el filtro de precios. Pero debido a que utilicé un archivo de vista personalizada, por alguna razón los filtros en la barra lateral ya no se pueden contraer.
Si alguien puede solucionar ese problema, no dude en hacer una solicitud de extracción. También estoy tratando de descubrir cómo implementar esto para una página CMS creada a través del backend de Magento 2, en lugar de para una página creada manualmente a través de xml.
fuente