Pracuję nad pobieraniem warstwowej nawigacji w magento2 na potrzeby niestandardowej kolekcji produktów. Dostaję kolekcję niestandardową już na niestandardowej stronie, aby wyświetlić nawigację warstwową. Próbowałem zaadaptować to rozwiązanie magento1, ale nie mogłem za daleko.
Każdy pomysł, jak mogę to osiągnąć w Magento2. Jak dotąd zrobiłem:
Rozszerzyłem blok Lista produktów Lista produktów niestandardowych na mojej stronie niestandardowej.
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;
}
}
Wykorzystano podstawowy blok wyszukiwania do nawigacji warstwowej w pliku układu
<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>
Rozszerzony model warstwy rdzenia do modyfikacji kolekcji.
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();
}
}
W tej chwili wyświetla się nawigacja warstwy, ale nie jest ona specyficzna dla mojej kolekcji niestandardowej. Zgodnie z moim debugowaniem kolekcja jest filtrowana od kategorii root (która zawiera cały katalog produktów) i zgodnie z nią pobiera warstwy.
Odpowiedzi:
Nawigacja była możliwa dzięki poniższym zmianom, być może nie w pełni poprawiłem to rozwiązanie, więc komentarze i sugestie są mile widziane.
źródło
Z powodzeniem zastosowałem własną kolekcję produktów na warstwowej nawigacji i pasku narzędzi strony kategorii.
Na przykład pobieram kolekcję tych produktów, których cena jest mniejsza niż 100.
Krok 1: Dodaj poniższy fragment kodu
Krok 2: Utwórz wtyczkę do kolekcji produktów
Krok 3: Utwórz wtyczkę do paska narzędzi
źródło
Udało mi się uzyskać nawigację warstwową, która głównie działa w przypadku niestandardowej kolekcji produktów na niestandardowej stronie. Wysłałem kod źródłowy dla mojego modułu tutaj . Jedynym problemem jest to, że filtr cen nie wyświetla prawidłowych liczb produktów. Z tego powodu zmodyfikowałem warstwowy widok nawigacji, aby ukryć filtr cen. Ale ponieważ użyłem niestandardowego pliku widoku, z jakiegoś powodu filtrów na pasku bocznym nie można już zwinąć.
Jeśli ktoś może rozwiązać ten problem, możesz poprosić o pobranie. Próbuję również dowiedzieć się, jak to zaimplementować dla strony CMS utworzonej za pomocą backendu Magento 2, zamiast dla strony utworzonej ręcznie za pomocą xml.
źródło