Ich arbeite daran, eine geschichtete Navigation in magento2 für eine benutzerdefinierte Produktkollektion abzurufen. Ich erhalte eine benutzerdefinierte Sammlung, die bereits auf der benutzerdefinierten Seite angezeigt werden muss, damit die geschichtete Navigation angezeigt wird. Versuchte, diese magento1-Lösung anzupassen, kam aber nicht weit.
Irgendeine Idee, wie ich es in magento2 erreichen könnte. Was ich bisher getan habe, ist wie folgt:
Erweitert den Katalog ListProduct Block für benutzerdefinierte Produktliste auf meiner benutzerdefinierten Seite.
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;
}
}
Verwendet den zentralen Suchblock für die mehrschichtige Navigation in der Layoutdatei
<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>
Erweitertes Core-Layer-Modell zum Ändern der Sammlung.
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();
}
}
Ab sofort wird die Ebenennavigation angezeigt, die jedoch nicht für meine benutzerdefinierte Sammlung spezifisch ist. Gemäß meinem Debugging wird die Sammlung vollständig aus der Stammkategorie herausgefiltert (die den gesamten Produktkatalog enthält) und dementsprechend werden die Ebenen abgerufen.
Antworten:
Ich konnte die Navigation mit den folgenden Änderungen erreichen. Mit dieser Lösung bin ich möglicherweise nicht ganz korrekt. Kommentare und Vorschläge sind daher sehr willkommen.
quelle
Ich habe meine benutzerdefinierte Produktsammlung erfolgreich auf die mehrschichtige Navigation und Symbolleiste der Kategorieseite angewendet.
Ich hole zum Beispiel die Sammlung der Produkte ab, deren Preis unter 100 liegt.
Schritt 1: Fügen Sie das folgende Code-Snippet hinzu
Schritt 2: Plugin für die Produktabholung erstellen
Schritt 3: Plugin für Symbolleiste erstellen
quelle
Ich war in der Lage, eine geschichtete Navigation zu erhalten, die hauptsächlich für eine benutzerdefinierte Produktkollektion auf einer benutzerdefinierten Seite funktioniert. Ich habe den Quellcode für mein Modul hier hochgeladen . Die einzigen Probleme sind, dass der Preisfilter nicht die richtigen Produktzählungen anzeigt. Aus diesem Grund habe ich die Ebenen-Navigationsansicht geändert, um den Preisfilter auszublenden. Da ich jedoch eine benutzerdefinierte Ansichtsdatei verwendet habe, können die Filter in der Seitenleiste aus irgendeinem Grund nicht mehr ausgeblendet werden.
Wenn jemand das Problem beheben kann, können Sie eine Pull-Anfrage stellen. Ich versuche auch herauszufinden, wie dies für eine CMS-Seite implementiert werden kann, die über das Magento 2-Backend erstellt wurde, anstatt für eine Seite, die manuell über XML erstellt wurde.
quelle