Добавить в корзину ajax Commerce 2

Аватар пользователя Babich Babich 20 сентября в 7:55

Здравствуйте.
Drupal 9, Drupal Commerce 2. Установлен через Composer. Нужно сделать, чтобы кнопка добавления в корзину и блок корзины обновлялся по ajax (без перезагрузки страницы).
Нашел инструкцию http://xandeadx.ru/blog/drupal/962. Тоже добавил в тему код.
Не знаю как выполнить замечания.

Замечание 1 - кнопкам надо принудительно задавать атрибут #id, чтобы они не конфликтовали с другими формами на странице и чтобы сгенерировать нужный html атрибут data-drupal-selector.

Замечание 2 - в #ajax нужно указать параметр selector на основе атрибута data-drupal-selector, чтобы кнопки нормально работали если товар выводится на странице дважды.

Кнопки добавления в корзину пропали после добавления кода.

Лучший ответ

Аватар пользователя Babich Babich 20 сентября в 12:28

Пропатчил модуль commerce_addtocart_ajax. Установил, все работает и корзина обновляется ajax. Вот только хотел infiniti scroll как пейджер использовать. При нажатии на загрузить еще, вновь появившиеся товары не хотят добавляться в корзину.

Комментарии

Аватар пользователя OldWarrior OldWarrior 20 сентября в 9:24

Babich wrote: Не знаю как выполнить замечания.

Собственно, в примере андеда по вашей ссылке эти "замечания" уже реализованы. Он как раз и поясняет, зачем у него в коде заменяется #id и выставляется selector. Т.е. если вы использовали его код полностью, то ничего больше делать не нужно.

Babich wrote: Кнопки добавления в корзину пропали после добавления кода.

Вот это уже хуже. А кнопка вообще отсутствует в выходном HTML или просто скрыта (display: none и т.д.)?

Babich wrote: оже добавил в тему код.

Кстати, код предполагает его написание в модуле, а не в теме. Колбеки аякса в теме - это будет как-то странно по меньшей мере.

Аватар пользователя Babich Babich 20 сентября в 10:11

Сделал в модуле. Кнопка пропала вообще из кода.
Вот ссылка на сделанный модуль. Может я не так написал его? Или код нужно оптимизировать под Drupal 9?

Аватар пользователя Babich Babich 20 сентября в 10:30
TypeError: Argument 2 passed to ajax_button_cart_dc_form_commerce_order_item_add_to_cart_form_alter() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given, called in /home/mobidiks/public_html/web/core/lib/Drupal/Core/Extension/ModuleHandler.php on line 539 в ajax_button_cart_dc_form_commerce_order_item_add_to_cart_form_alter() (строка 7 из /home/mobidiks/public_html/web/modules/custom/ajax_button_cart_dc/ajax_button_cart_dc.module)
#0 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Extension/ModuleHandler.php(539): ajax_button_cart_dc_form_commerce_order_item_add_to_cart_form_alter(Array, Object(Drupal\Core\Form\FormState), 'commerce_order_...')
#1 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/FormBuilder.php(836): Drupal\Core\Extension\ModuleHandler->alter('form', Array, Object(Drupal\Core\Form\FormState), 'commerce_order_...')
#2 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/FormBuilder.php(279): Drupal\Core\Form\FormBuilder->prepareForm('commerce_order_...', Array, Object(Drupal\Core\Form\FormState))
#3 /home/mobidiks/public_html/web/modules/contrib/commerce/modules/product/src/ProductLazyBuilders.php(97): Drupal\Core\Form\FormBuilder->buildForm(Object(Drupal\commerce_cart\Form\AddToCartForm), Object(Drupal\Core\Form\FormState))
#4 [internal function]: Drupal\commerce_product\ProductLazyBuilders->addToCartForm('12', 'views', true, 'ru')
#5 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php(101): call_user_func_array(Array, Array)
#6 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(786): Drupal\Core\Render\Renderer->doTrustedCallback(Array, Array, 'Render #lazy_bu...', 'exception', 'Drupal\\Core\\Ren...')
#7 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(356): Drupal\Core\Render\Renderer->doCallback('#lazy_builder', Array, Array)
#8 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(449): Drupal\Core\Render\Renderer->doRender(Array)
#9 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(201): Drupal\Core\Render\Renderer->doRender(Array, false)
#10 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Template/TwigExtension.php(450): Drupal\Core\Render\Renderer->render(Array)
#11 /home/mobidiks/public_html/web/sites/default/files/php/twig/614832ee6fc8c_field.html.twig_MnRGQ0a3N2vlFgbmlDwKgN92p/GTagXnHSKuNLIfcmP7thrYkwcLlLhYqEElIQfRTmqx8.php(62): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#12 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(405): __TwigTemplate_900b1bacf4609958db0dc7d8940d7eac1c4bb4563b7ce7e9b1e4a7fa57fc78cf->doDisplay(Array, Array)
#13 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(378): Twig\Template->displayWithErrorHandling(Array, Array)
#14 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(390): Twig\Template->display(Array)
#15 /home/mobidiks/public_html/web/core/themes/engines/twig/twig.engine(65): Twig\Template->render(Array)
#16 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('core/modules/sy...', Array)
#17 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(436): Drupal\Core\Theme\ThemeManager->render('field', Array)
#18 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(449): Drupal\Core\Render\Renderer->doRender(Array)
#19 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(201): Drupal\Core\Render\Renderer->doRender(Array, false)
#20 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Template/TwigExtension.php(450): Drupal\Core\Render\Renderer->render(Array)
#21 /home/mobidiks/public_html/web/sites/default/files/php/twig/614832ee6fc8c_commerce-product.html.twi_U_oT7WRuaYkx5jBQpgabEzVah/Sf0vouLNL4p38lR0RsZZshCXGX9_RCo29gc_Gom1eZA.php(42): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#22 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(405): __TwigTemplate_f945ee68b3c93ee9aa114738854ddecdb77c67e0ce60c29bc5c00fff615413d3->doDisplay(Array, Array)
#23 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(378): Twig\Template->displayWithErrorHandling(Array, Array)
#24 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(390): Twig\Template->display(Array)
#25 /home/mobidiks/public_html/web/core/themes/engines/twig/twig.engine(65): Twig\Template->render(Array)
#26 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/mobidik/...', Array)
#27 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(436): Drupal\Core\Theme\ThemeManager->render('commerce_produc...', Array)
#28 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(201): Drupal\Core\Render\Renderer->doRender(Array, false)
#29 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Template/TwigExtension.php(550): Drupal\Core\Render\Renderer->render(Array)
#30 /home/mobidiks/public_html/web/sites/default/files/php/twig/614832ee6fc8c_views-view-grid.html.twig_b-1yPfdKd3Kp3AbyN9bV4K0fI/yCQ7HcIodCoGV-zsCzLIng5CzpM7s8yaGs8YDHPvI70.php(136): Drupal\Core\Template\TwigExtension->renderVar(Array)
#31 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(405): __TwigTemplate_132d0f1d4d0f6f171db82041acde2328409508e5379c793741df29c6db7e1d02->doDisplay(Array, Array)
#32 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(378): Twig\Template->displayWithErrorHandling(Array, Array)
#33 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(390): Twig\Template->display(Array)
#34 /home/mobidiks/public_html/web/core/themes/engines/twig/twig.engine(65): Twig\Template->render(Array)
#35 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/mobidik/...', Array)
#36 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(436): Drupal\Core\Theme\ThemeManager->render('views_view_grid', Array)
#37 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(449): Drupal\Core\Render\Renderer->doRender(Array)
#38 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(201): Drupal\Core\Render\Renderer->doRender(Array, false)
#39 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Template/TwigExtension.php(450): Drupal\Core\Render\Renderer->render(Array)
#40 /home/mobidiks/public_html/web/sites/default/files/php/twig/614832ee6fc8c_views-view.html.twig_e07VwDwjTqYpbkHLZ258sekdP/gpZu9__2aN1yjZeFOL5xMIO3_2xCwRgGFVsLcd_ZqQk.php(110): Drupal\Core\Template\TwigExtension->escapeFilter(Object(Drupal\Core\Template\TwigEnvironment), Array, 'html', NULL, true)
#41 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(405): __TwigTemplate_da1e6c600d4e6a3d9f6d17bb21eeba3d77570ae7e0021c7e817abf14f530466a->doDisplay(Array, Array)
#42 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(378): Twig\Template->displayWithErrorHandling(Array, Array)
#43 /home/mobidiks/public_html/vendor/twig/twig/src/Template.php(390): Twig\Template->display(Array)
#44 /home/mobidiks/public_html/web/core/themes/engines/twig/twig.engine(65): Twig\Template->render(Array)
#45 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Theme/ThemeManager.php(384): twig_render_template('themes/mobidik/...', Array)
#46 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(436): Drupal\Core\Theme\ThemeManager->render('views_view', Array)
#47 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(201): Drupal\Core\Render\Renderer->doRender(Array, true)
#48 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(145): Drupal\Core\Render\Renderer->render(Array, true)
#49 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(578): Drupal\Core\Render\Renderer->Drupal\Core\Render\{closure}()
#50 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(146): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#51 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Ajax/CommandWithAttachedAssetsTrait.php(36): Drupal\Core\Render\Renderer->renderRoot(Array)
#52 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Ajax/ReplaceCommand.php(31): Drupal\Core\Ajax\InsertCommand->getRenderedContent()
#53 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Ajax/AjaxResponse.php(43): Drupal\Core\Ajax\ReplaceCommand->render()
#54 /home/mobidiks/public_html/web/core/modules/views/src/Controller/ViewAjaxController.php(202): Drupal\Core\Ajax\AjaxResponse->addCommand(Object(Drupal\Core\Ajax\ReplaceCommand))
#55 [internal function]: Drupal\views\Controller\ViewAjaxController->ajaxView(Object(Symfony\Component\HttpFoundation\Request))
#56 /home/mobidiks/public_html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(123): call_user_func_array(Array, Array)
#57 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Render/Renderer.php(578): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#58 /home/mobidiks/public_html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(124): Drupal\Core\Render\Renderer->executeInRenderContext(Object(Drupal\Core\Render\RenderContext), Object(Closure))
#59 /home/mobidiks/public_html/web/core/lib/Drupal/Core/EventSubscriber/EarlyRenderingControllerWrapperSubscriber.php(97): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array)
#60 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(158): Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}()
#61 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(80): Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object(Symfony\Component\HttpFoundation\Request), 1)
#62 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#63 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#64 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#65 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#66 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#67 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#68 /home/mobidiks/public_html/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#69 /home/mobidiks/public_html/web/core/lib/Drupal/Core/DrupalKernel.php(717): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#70 /home/mobidiks/public_html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#71 {main}
Аватар пользователя OldWarrior OldWarrior 20 сентября в 10:57

Babich wrote: _cart_dc_form_commerce_order_item_add_to_cart_form_alter() must be an instance of FormStateInterface, instance of Drupal\Core\Form\FormState given, called in /ho

Вы не указали пространство имён для класса  FormStateInterface .

В начале файла добавьте:

<?php
use \Drupal\Core\Form\FormStateInterface;

// код...
?>
Аватар пользователя Babich Babich 20 сентября в 11:03

Теперь заработало. Спасибо большое. Только вот количество товаров в блоке корзины не обновляется ajax. И я так понимаю всплывающее окно должно появляться, что товар в корзину добавлен.

Аватар пользователя OldWarrior OldWarrior 20 сентября в 11:08

Babich wrote: Только вот количество товаров в блоке корзины не обновляется ajax.

А в журнале есть что-то интересное? ©

Babich wrote: И я так понимаю всплывающее окно должно появляться, что товар в корзину добавлен.

Не факт. Всякие всплывашки наруливаются отдельными модулями.
Либо можете в $response добавить AlertCommand (гуглите) для вывода типичного alert().

Аватар пользователя Babich Babich 20 сентября в 11:22

Error: Class 'MessengerInterface' not found в ajax_button_cart_dc_add_to_cart_ajax() (строка 26 из /home/mobidiks/public_html/web/modules/custom/ajax_button_cart_dc/ajax_button_cart_dc.module)
#0 [internal function]: ajax_button_cart_dc_add_to_cart_ajax(Array, Object(Drupal\Core\Form\FormState), Object(Symfony\Component\HttpFoundation\Request))
#1 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/FormAjaxResponseBuilder.php(69): call_user_func_array('ajax_button_car...', Array)
#2 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php(109): Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse(Object(Symfony\Component\HttpFoundation\Request), Array, Object(Drupal\Core\Form\FormState), Array)
#3 [internal function]: Drupal\Core\Form\EventSubscriber\FormAjaxSubscriber->onException(Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#4 /home/mobidiks/public_html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(142): call_user_func(Array, Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#5 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(219): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...')
#6 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(91): Symfony\Component\HttpKernel\HttpKernel->handleThrowable(Object(Drupal\Core\Form\FormAjaxException), Object(Symfony\Component\HttpFoundation\Request), 1)
#7 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#8 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#9 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#10 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#11 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#12 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#13 /home/mobidiks/public_html/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /home/mobidiks/public_html/web/core/lib/Drupal/Core/DrupalKernel.php(717): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#15 /home/mobidiks/public_html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#16 {main}

Аватар пользователя OldWarrior OldWarrior 20 сентября в 11:22

Только сообразил, что в примере андеда действительно выводится всплывающее окно.

В общем, видимо, опять же причина в пространствах имён. К вышеуказанному коду добавьте ещё два определения:

<?php
use \Drupal\Core\Ajax\AjaxResponse;
use \
Drupal\Core\Ajax\OpenModalDialogCommand;
?>
Аватар пользователя Babich Babich 20 сентября в 11:26

Добавил
Вот запись журнала:

Error: Class 'MessengerInterface' not found в ajax_button_cart_dc_add_to_cart_ajax() (строка 28 из /home/mobidiks/public_html/web/modules/custom/ajax_button_cart_dc/ajax_button_cart_dc.module)
#0 [internal function]: ajax_button_cart_dc_add_to_cart_ajax(Array, Object(Drupal\Core\Form\FormState), Object(Symfony\Component\HttpFoundation\Request))
#1 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/FormAjaxResponseBuilder.php(69): call_user_func_array('ajax_button_car...', Array)
#2 /home/mobidiks/public_html/web/core/lib/Drupal/Core/Form/EventSubscriber/FormAjaxSubscriber.php(109): Drupal\Core\Form\FormAjaxResponseBuilder->buildResponse(Object(Symfony\Component\HttpFoundation\Request), Array, Object(Drupal\Core\Form\FormState), Array)
#3 [internal function]: Drupal\Core\Form\EventSubscriber\FormAjaxSubscriber->onException(Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#4 /home/mobidiks/public_html/web/core/lib/Drupal/Component/EventDispatcher/ContainerAwareEventDispatcher.php(142): call_user_func(Array, Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...', Object(Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher))
#5 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(219): Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher->dispatch(Object(Symfony\Component\HttpKernel\Event\ExceptionEvent), 'kernel.exceptio...')
#6 /home/mobidiks/public_html/vendor/symfony/http-kernel/HttpKernel.php(91): Symfony\Component\HttpKernel\HttpKernel->handleThrowable(Object(Drupal\Core\Form\FormAjaxException), Object(Symfony\Component\HttpFoundation\Request), 1)
#7 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/Session.php(57): Symfony\Component\HttpKernel\HttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#8 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/KernelPreHandle.php(47): Drupal\Core\StackMiddleware\Session->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#9 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(106): Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#10 /home/mobidiks/public_html/web/core/modules/page_cache/src/StackMiddleware/PageCache.php(85): Drupal\page_cache\StackMiddleware\PageCache->pass(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#11 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/ReverseProxyMiddleware.php(47): Drupal\page_cache\StackMiddleware\PageCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#12 /home/mobidiks/public_html/web/core/lib/Drupal/Core/StackMiddleware/NegotiationMiddleware.php(52): Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#13 /home/mobidiks/public_html/vendor/stack/builder/src/Stack/StackedHttpKernel.php(23): Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#14 /home/mobidiks/public_html/web/core/lib/Drupal/Core/DrupalKernel.php(717): Stack\StackedHttpKernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#15 /home/mobidiks/public_html/web/index.php(19): Drupal\Core\DrupalKernel->handle(Object(Symfony\Component\HttpFoundation\Request))
#16 {main}

Аватар пользователя OldWarrior OldWarrior 20 сентября в 11:30

Babich wrote: Добавил
Вот запись журнала:

Error: Class 'MessengerInterface' not found

Слушайте, ну так не годится Smile
Вы же уже поняли, что нужно указывать путь к пространству имён класса. Поищите на drupal.org хотя бы ради интереса имя класса MessengerInterface и также добавьте для него пространство имён.

Аватар пользователя Babich Babich 20 сентября в 11:40

Спасибо) Теперь понял.
Добавил use \Drupal\Core\Messenger\MessengerInterface; и окно начало появляться.

Но вот количество в корзине в аяксе не обновляется((( Ошибок тоже в журнале нет.

Аватар пользователя OldWarrior OldWarrior 20 сентября в 11:50

Ещё раз посмотрел код андеда.
Корзина и не должна обновляться. Всё, что он делает - просто не уходит с текущей страницы (т.е. добавляет товар аяксово), но не обновляет ни страницу, ни блок.

Можете попробовать допилить $response, чтобы программно получать/грузить блок корзины, рендерить его и результат рендеринга менять через (например) ReplaceCommand(). Или если это проще, то полностью обновлять текущую страницу, но по-моему для этого нужно ещё писать кастомный метод jQuery.

Аватар пользователя VasyOK VasyOK 20 сентября в 11:40

Поклад в корзину товара сделал модулями:
commerce_addtocart_ajax
dc_ajax_add_cart
да, 2мя сразу Diablo

Удаление позиции в корзине - тоже через dc_ajax_add_cart (работает, но медленно)

Удалось побороть:

  • Если товар с вариациями - в корзину ложилась только 1я из них.
  • Один и тот же товар не ложился в корзину 2 раза. 2й раз только после перезагрузки страницы.
    Хотя на некоторых сайтах на товаре надпись "В корзине" - пока не дошел до этого.

Не удалось:

  • вывести попап корзины сразу по нажатию кнопки купить
  • заяксить изменение количества

Сайт на продакшене пока отсутствует.
Если я неудачно вклинился в вашу беседу о программировании - извините.
Кому мои методы интересны - пишите в личку.

Аватар пользователя VasyOK VasyOK 20 сентября в 12:05

Делал под 8ку. Не знаю насколько эти модули совместимы с 9.
Вроде есть патчи.
У вас с вариациями работает? Повторно в корзину ложит?

Аватар пользователя Babich Babich 20 сентября в 12:11

С вариациями не пробовал. У меня товары без них. А повторно в корзину кладет. Вот только количество не обновляется. Патчи посмотрел. А под Commerce 2 будет работать? Есть у них разница Commerce 1 версии и 2?

Аватар пользователя Babich Babich 20 сентября в 12:28

Пропатчил модуль commerce_addtocart_ajax. Установил, все работает и корзина обновляется ajax. Вот только хотел infiniti scroll как пейджер использовать. При нажатии на загрузить еще, вновь появившиеся товары не хотят добавляться в корзину.