Je travaille à récupérer la navigation en couches dans magento2 pour une collection de produits personnalisée. Je reçois déjà une collection personnalisée sur la page personnalisée pour montrer la navigation en couches. J'ai essayé d'adapter cette solution magento1 mais je n'ai pas pu aller loin.
Toute idée comment pourrais-je y arriver dans magento2. Ce que j'ai fait jusqu'à présent est le suivant:
Extension du bloc Catalog ListProduct pour la liste de produits personnalisée sur ma page personnalisée.
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;
}
}
Utilisé le bloc de recherche principal pour la navigation en couches dans le fichier de disposition
<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>
Modèle de couche Core étendu pour modifier la collection.
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();
}
}
À partir de maintenant, la navigation des calques s'affiche, mais elle n'est pas spécifique à ma collection personnalisée. Selon mon débogage, la collection est filtrée de la catégorie racine (qui contient le catalogue de produits complet) et, selon elle, récupère les couches.
Réponses:
J'ai pu réaliser la navigation avec les modifications ci-dessous, je ne suis peut-être pas complètement correct avec cette solution, donc les commentaires et suggestions sont les bienvenus.
la source
J'ai appliqué avec succès ma collection de produits personnalisés sur la navigation en couches et la barre d'outils de la page de catégorie.
Par exemple, je récupère la collection de ces produits dont le prix est inférieur à 100.
Étape 1: ajouter l'extrait de code ci-dessous
Étape 2: créer un plugin pour la collection de produits
Étape 3: créer un plugin pour la barre d'outils
la source
J'ai pu obtenir une navigation en couches fonctionnant principalement pour une collection de produits personnalisée sur une page personnalisée. J'ai téléchargé le code source de mon module ici . Le seul problème est que le filtre Prix n'affiche pas le nombre de produits correct. Pour cette raison, j'ai modifié la vue de navigation en couches pour masquer le filtre Prix. Mais parce que j'ai utilisé un fichier d'affichage personnalisé, pour une raison quelconque, les filtres de la barre latérale ne peuvent plus être réduits.
Si quelqu'un peut résoudre ce problème, n'hésitez pas à faire une demande d'extraction. J'essaie également de comprendre comment implémenter cela pour une page CMS créée via le backend Magento 2, plutôt que pour une page créée manuellement via xml.
la source