EmicoEcommerce / Magento2Tweakwise-archived

Magento 2 module for Tweakwise integration
Other
9 stars 25 forks source link

Wrong filters are displayed with Magento 2.3.2 #80

Closed davekleijnkega closed 5 years ago

davekleijnkega commented 5 years ago

Issue Brief

The product list page is giving an critical error. The page is rendered but all filters are visible. It seems that the page sorting does not work either.

Environment

Steps to reproduce

  1. Use Magento version 2.3.2 (There seems to be no problems in version 2.3.1)
  2. Visit a random product list page with filters set up in Tweakwise

Actual result

Page is rendered, but all filters are visible.

In system.log the following error occurs:

[2019-07-03 13:13:57] report.CRITICAL: [TweakWise] Emico\Tweakwise\Exception\RuntimeException: Navigation context not set, initialize a version of Emico\Tweakwise\Model\Catalog\Layer\NavigationContext first. in /Volumes/data/websites/website/vendor/emico/tweakwise/src/Model/Catalog/Layer/NavigationContext/CurrentContext.php:41
Stack trace:
#0 /Volumes/data/websites/website/vendor/emico/tweakwise/src/Model/Catalog/Layer/NavigationContext/CurrentContext.php(51): Emico\Tweakwise\Model\Catalog\Layer\NavigationContext\CurrentContext->getContext()
#1 /Volumes/data/websites/website/vendor/emico/tweakwise/src/Model/Catalog/Layer/FilterList/Tweakwise.php(73): Emico\Tweakwise\Model\Catalog\Layer\NavigationContext\CurrentContext->getRequest()
#2 /Volumes/data/websites/website/vendor/emico/tweakwise/src/Model/Catalog/Layer/FilterList/Tweakwise.php(61): Emico\Tweakwise\Model\Catalog\Layer\FilterList\Tweakwise->initFilters(Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#3 /Volumes/data/websites/website/generated/code/Emico/Tweakwise/Model/Catalog/Layer/FilterList/Tweakwise/Proxy.php(95): Emico\Tweakwise\Model\Catalog\Layer\FilterList\Tweakwise->getFilters(Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#4 /Volumes/data/websites/website/vendor/emico/tweakwise/src/Model/Catalog/Layer/FilterList/Plugin.php(63): Emico\Tweakwise\Model\Catalog\Layer\FilterList\Tweakwise\Proxy->getFilters(Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#5 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(135): Emico\Tweakwise\Model\Catalog\Layer\FilterList\Plugin->aroundGetFilters(Object(Magento\Catalog\Model\Layer\FilterList\Interceptor), Object(Closure), Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#6 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Catalog\Model\Layer\FilterList\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#7 /Volumes/data/websites/website/generated/code/Magento/Catalog/Model/Layer/FilterList/Interceptor.php(26): Magento\Catalog\Model\Layer\FilterList\Interceptor->___callPlugins('getFilters', Array, Array)
#8 /Volumes/data/websites/website/vendor/magento/module-layered-navigation/Block/Navigation.php(66): Magento\Catalog\Model\Layer\FilterList\Interceptor->getFilters(Object(Magento\Catalog\Model\Layer\Category\Interceptor))
#9 /Volumes/data/websites/website/vendor/magento/framework/View/Element/AbstractBlock.php(283): Magento\LayeredNavigation\Block\Navigation->_prepareLayout()
#10 /Volumes/data/websites/website/vendor/magento/framework/View/Layout/Generator/Block.php(149): Magento\Framework\View\Element\AbstractBlock->setLayout(Object(Magento\Framework\View\Layout\Interceptor))
#11 /Volumes/data/websites/website/vendor/magento/framework/View/Layout/GeneratorPool.php(81): Magento\Framework\View\Layout\Generator\Block->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
#12 /Volumes/data/websites/website/vendor/magento/framework/View/Layout.php(343): Magento\Framework\View\Layout\GeneratorPool->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
#13 /Volumes/data/websites/website/generated/code/Magento/Framework/View/Layout/Interceptor.php(89): Magento\Framework\View\Layout->generateElements()
#14 /Volumes/data/websites/website/vendor/magento/framework/View/Layout/Builder.php(129): Magento\Framework\View\Layout\Interceptor->generateElements()
#15 /Volumes/data/websites/website/vendor/magento/framework/View/Page/Builder.php(55): Magento\Framework\View\Layout\Builder->generateLayoutBlocks()
#16 /Volumes/data/websites/website/vendor/magento/framework/View/Layout/Builder.php(65): Magento\Framework\View\Page\Builder->generateLayoutBlocks()
#17 /Volumes/data/websites/website/vendor/magento/framework/View/Page/Config.php(212): Magento\Framework\View\Layout\Builder->build()
#18 /Volumes/data/websites/website/vendor/magento/framework/View/Page/Config.php(575): Magento\Framework\View\Page\Config->build()
#19 /Volumes/data/websites/website/vendor/magento/framework/View/Page/Config.php(533): Magento\Framework\View\Page\Config->getElementAttribute('body', 'class')
#20 /Volumes/data/websites/website/vendor/magento/module-catalog/Controller/Category/View.php(217): Magento\Framework\View\Page\Config->addBodyClass('page-products')
#21 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Catalog\Controller\Category\View->execute()
#22 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Catalog\Controller\Category\View\Interceptor->___callParent('execute', Array)
#23 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Catalog\Controller\Category\View\Interceptor->Magento\Framework\Interception\{closure}()
#24 /Volumes/data/websites/website/generated/code/Magento/Catalog/Controller/Category/View/Interceptor.php(26): Magento\Catalog\Controller\Category\View\Interceptor->___callPlugins('execute', Array, Array)
#25 /Volumes/data/websites/website/vendor/magento/framework/App/Action/Action.php(108): Magento\Catalog\Controller\Category\View\Interceptor->execute()
#26 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\App\Action\Action->dispatch(Object(Magento\Framework\App\Request\Http))
#27 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Catalog\Controller\Category\View\Interceptor->___callParent('dispatch', Array)
#28 /Volumes/data/websites/website/vendor/magento/module-customer-segment/Model/App/Action/ContextPlugin.php(81): Magento\Catalog\Controller\Category\View\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#29 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(135): Magento\CustomerSegment\Model\App\Action\ContextPlugin->aroundDispatch(Object(Magento\Catalog\Controller\Category\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#30 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Catalog\Controller\Category\View\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#31 /Volumes/data/websites/website/generated/code/Magento/Catalog/Controller/Category/View/Interceptor.php(39): Magento\Catalog\Controller\Category\View\Interceptor->___callPlugins('dispatch', Array, NULL)
#32 /Volumes/data/websites/website/vendor/magento/framework/App/FrontController.php(159): Magento\Catalog\Controller\Category\View\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#33 /Volumes/data/websites/website/vendor/magento/framework/App/FrontController.php(99): Magento\Framework\App\FrontController->processRequest(Object(Magento\Framework\App\Request\Http), Object(Magento\Catalog\Controller\Category\View\Interceptor))
#34 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(58): Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
#35 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(138): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
#36 /Volumes/data/websites/website/vendor/magento/module-store/App/FrontController/Plugin/RequestPreprocessor.php(94): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#37 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(135): Magento\Store\App\FrontController\Plugin\RequestPreprocessor->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#38 /Volumes/data/websites/website/vendor/fastly/magento2/Model/FrontControllerPlugin.php(120): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#39 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(135): Fastly\Cdn\Model\FrontControllerPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#40 /Volumes/data/websites/website/vendor/magento/module-page-cache/Model/App/FrontController/BuiltinPlugin.php(69): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#41 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(135): Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#42 /Volumes/data/websites/website/vendor/magento/framework/Interception/Interceptor.php(153): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#43 /Volumes/data/websites/website/generated/code/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, NULL)
#44 /Volumes/data/websites/website/vendor/magento/framework/App/Http.php(137): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#45 /Volumes/data/websites/website/generated/code/Magento/Framework/App/Http/Interceptor.php(24): Magento\Framework\App\Http->launch()
#46 /Volumes/data/websites/website/vendor/magento/framework/App/Bootstrap.php(261): Magento\Framework\App\Http\Interceptor->launch()
#47 /Volumes/data/websites/website/pub/index.php(40): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http\Interceptor))

Expected result

  1. Only filters that are set up inside Tweakwise should be visible.
  2. No error messages inside the error logs.

What I did so far

After some debugging I found out that the order of methods setContext and getContext are incorrect in Emico\Tweakwise\Model\Catalog\Layer\NavigationContext\CurrentContext. getContext is triggered first and setContext after that.

After that I have changed the following code in vendor/emico/tweakwise/src/etc/frontend/events.xml on line 3:

From <event name="controller_action_postdispatch_catalog_category_view"> To <event name="controller_action_predispatch_catalog_category_view">

After this change, the error message is gone, but I still cannot see the correct filters on a product list page. I see two category filters, while they are not set up in Tweakwise. It seems that the other filters are correct.

Update:

I found out that all categories use the template filter that is configured on root level.

edwinljacobs commented 5 years ago

Thanks for your report,

Weird that all works fine on 2.3.1 but not on 2.3.2 ill update my dev installation and take a look.

With kind regards

davekleijnkega commented 5 years ago

Update:

"I found out that all categories use the template filter that is configured on root level."

This is caused by changing the events.xml, so this is not a solution.

edwinljacobs commented 5 years ago

Hello,

This is indeed an issue.

After some debugging I came to the following conclusion. The view controller asks the layer resolver to create a category layer object on: vendor/magento/module-catalog/Controller/Category/View.php:188 This layer object takes a context parameter, this context parameter which is of type: Magento\Catalog\Model\Layer\ContextInterface

In 2.3.1 module magento-catalog-search defines that the implementation class of this interface should be:

<type name="Magento\Catalog\Model\Layer\Category">
        <arguments>
            <argument name="context" xsi:type="object">Magento\CatalogSearch\Model\Layer\Category\Context</argument>
        </arguments>
    </type>

(This can be found in module-catalog-search di.xml file line 208)

So the implementation class of contextInterface is: Magento\CatalogSearch\Model\Layer\Category\Context

In our plugin we add config so that this implementation class uses a differen collectionProvider (this provider will call tweakwise etc)

However in 2.3.2 The context interface resolves to a different class, namely:

<type name="Magento\Catalog\Model\Layer\Category">
        <arguments>
            <argument name="context" xsi:type="object">Magento\Elasticsearch\Model\Layer\Category\Context</argument>
        </arguments>
    </type>

You can see this in magento-elasticsearch di.xml line 41, this module depends on search and thus this implementation will take priority over the "normal" implementation The same holds for the Search layer. In our plugin we have not defined the collectionProvider against these types.

Most likely we will add our collectionProvider class to these implementations as well. The collectionProvider updates context and all should work. I will add that and test if this works as expected

With kind regards

edwinljacobs commented 5 years ago

We created Branch 1.X where the required entries are added.

Could you verify if this resolves the issue?

With kind regards

davekleijnkega commented 5 years ago

I have tested 1.X branch. This indeed resolves the issue.

Thanks!

edwinljacobs commented 5 years ago

Ok nice to hear, I will include this in a release soon.

WIth kind regards

edwinljacobs commented 5 years ago

Hello,

We released as fix for this in v1.4.12 (https://github.com/EmicoEcommerce/Magento2Tweakwise/releases/tag/v1.4.12) The fix will also be available in first stable 2.X release.

With kind regards