Как cейчас сделать ajax блок корзины в Commerce?

Главные вкладки

Аватар пользователя VasyOK VasyOK 27 октября 2020 в 18:25

Специалисты по Commerce есть?
Как сделать ajax блок корзины? Сделал через dc_ajax_add_cart. Проблема - не работает кнопка удалить.
https://www.drupal.org/project/dc_ajax_add_cart/issues/2930926 - не помагает.

В D7 работало c
https://www.drupal.org/sandbox/xandeadx/2621602

А сейчас как?

Комментарии

Аватар пользователя VasyOK VasyOK 28 октября 2020 в 12:03

Да, я пробовал эти и другие модули. Но они аяксируют стандартный блок корзины Комерца. А как сделать, чтобы автообновление шло в блоке корзины сделанном через views? Можно как-то изменить вывод стандартного блока корзины на вьюху?

Аватар пользователя VasyOK VasyOK 29 октября 2020 в 3:36

Пока сделал так. Заменил стандартный блок корзины на вьюху:

mytheme.theme

function mytheme_preprocess_commerce_cart_block(&$variables) {
    $variables['featured'] = drupal_render(views_embed_view('mycartblock', 'block_1'));
}

commerce-cart-block.html.twig

{% if featured %}
    {{ featured }}  
{% endif %}

Тогда с модулем ajax_add_to_cart в блок корзины ajax-ом товар ложит.

Но вот в самом блоке остаются:
1) изменение количества
2) удаление позиции

И эти вещи не аяксируются Sad
Более того, оно вообще не работает, если быстро нажимать.

Аватар пользователя gun_dose gun_dose 29 октября 2020 в 10:08

Нужно юзать dc_ajax_add_cart. Затем нужно включить модуль dc_ajax_add_cart_views и в блочно-корзиночной вьюхе поля количества и удаления заменить на аналогичные аяксовые виджеты, предоставляемые указанным модулем.

Аватар пользователя VasyOK VasyOK 30 октября 2020 в 3:55

dc_ajax_add_cart - вот что-то совсем не задалась с ним работа на 8ке.
gun_dose, у тебя работает? С патчами какими-то?

1. В настройках отображения тип товара admin/commerce/config/product-types/default/edit/display
Вариации: Ajax add to cart form

2. Теперь товар выглядит так:

Товар в корзину ajax-ом ложит только если отмечено Override the unit price. Что это?

3. Попробовал переписать блок корзины своей вьюхой
Вьюха:

mytheme.theme

function mytheme_preprocess_commerce_cart_block(&$variables) {
    $variables['featured'] = drupal_render(views_embed_view('mycartblock', 'block_1'));
}

commerce-cart-block.html.twig

{% if featured %}
    {{ featured }}  
{% endif %}

После этой перезаписи - в корзину не ложит ajaxом Sad . Хотя с другими модулями ложило.

Кнопка Remove в этом блоке и обновление корзины - вызывают глюки в блоке.

Накатил патч https://www.drupal.org/project/dc_ajax_add_cart/issues/2930926
После этого кнопка Remove в блоке корзины никак не реагирует на нажатие Sad

Аватар пользователя gun_dose gun_dose 30 октября 2020 в 9:49

Во-первых, зачем тебе поле цены в форме корзины?
Во-вторых, чем не нравится вариант поменять вьюху через настройки?

Аватар пользователя VasyOK VasyOK 30 октября 2020 в 13:37

1. В отображениях вариации
admin/commerce/config/product-variation-types/default/edit/display
убрал все поля и все галочки с Расширенные параметры отображения.

Все равно на товаре выводится Override the unit price и поле ввода вариации. Откуда это? Возникает только если поставить в вариации Ajax add to cart form.

2. Поменять вьюху через настройки - это где?

Аватар пользователя gun_dose gun_dose 30 октября 2020 в 23:23

1. Это рулится в настройках отображения формы позиции заказа, а не в вариации.
2. Не помню))) возможно, в настройках типа заказа или в настройках магазина.

Аватар пользователя VasyOK VasyOK 31 октября 2020 в 1:23

1. Спасибо. Разбираюсь.
2. Это оно (?):
Администрирование - Торговля - Конфигурация - Order types
admin/commerce/config/order-types/default/edit

Если да, там нет вариантов для выбора.

Аватар пользователя VasyOK VasyOK 1 ноября 2020 в 11:42

Итак для того, чтобы использовать свою вьюху в качестве блока корзины, нужно отредактировать ее имя и указать Административные теги: commerce_cart_block - тогда в admin/commerce/config/order-types/default/edit появляется соотв. опция.

Но проблема остается.
dc_ajax_add_cart - в блок корзины ложит. А в самой корзине при ее AJAX обновлении происходит подмена контента корзины контентом страницы сайта.
Рис 1.

Рис 2.

После установки патча https://www.drupal.org/project/dc_ajax_add_cart/issues/2930926 обновление корзины не происходит нигде. Ни в блоке ни на странице /cart

Алексей, Василий, вы этим модулем точно пользуетесь? Или только Алексей?

Аватар пользователя gun_dose gun_dose 2 ноября 2020 в 7:38

Оказывается, самое важное я забыл. Я магазины делаю на своей сборке и у меня там есть один кастомный модуль, который делает эти волшебные кнопки. Например вот, как делается кнопка удаления:
https://github.com/wbxby/wbx_commerce/blob/master/src/Plugin/views/field...

Там приходится при сабмите из запроса вычищать лишнее из-за приколов с аяксом на восьмёрке.

Аватар пользователя VasyOK VasyOK 3 ноября 2020 в 7:45

Поставил модуль https://github.com/wbxby/wbx_commerce
добавил на вьюху корзины поле
(Order item) Позиция заказа: Remove button (WBX Ajax)

Не работает. При нажатии на кнопку удаления, в блок корзины копируется содержимое области контента. Как на скринах выше. На любой теме оформления.

Выпить яду?

Аватар пользователя VasyOK VasyOK 3 ноября 2020 в 8:37

В стандартную вьюху commerce_cart_block добавил поле
(order_items: Order Item) Позиция заказа: Remove button (WBX Ajax)
Нажимаю кнопку удаления. Троббер крутиться. Ничего не происходит. Позиция из корзины удалена, но видно, это только после перезагрузки страницы.

Аватар пользователя VasyOK VasyOK 4 ноября 2020 в 11:10

Развернул все это на чистой инсталяшке Друпала с Комерцем - все работает.
Значит проблема во мне. Отлаживаю.

Аватар пользователя VasyOK VasyOK 9 ноября 2020 в 10:31

gun_dose, можно вопрос: почему после установки модуля wbx_commerce не работает страница корзины /cart? После удаления модуля страница есть.

Аватар пользователя gun_dose gun_dose 9 ноября 2020 в 10:51

Потому что основная цель модуля - это избежать повторного ввода адресов для шипинга и биллинга, плюс вывести весь чекаут на одну страницу. Я этот модуль делал для своих нужд, чтобы использовать на своих проектах, которые я собираю обычно так, как удобно мне. Естественно, что в других условиях это всё может не работать или работать неправильно. Поэтому если тебе нужна только аяксовая кнопка удаления, то проще забрать себе только код плагина. Ну и там ещё в файле .module есть hook_views_data_alter, где эта кнопка регистрируется в список полей.

Аватар пользователя VasyOK VasyOK 9 ноября 2020 в 12:23

Вроде понял, что нужно сделать.

Скажи пожалуйста: а поле количества из твоего модуля, оно обновляет поля
Позиция заказа: Общая стоимость
и
Глобальный: Общая сумма заказа в подвале
?

Или нужно что-то для этого сделать?

Аватар пользователя gun_dose gun_dose 9 ноября 2020 в 12:43

Оно блок корзины обновляет полностью - всё пересчитывается. В теории, даже если есть какие-то правила, что при покупке двух бутылок кефира батон в подарок, то и батон прилетит)) Единственное, там при обновлении блока корзины, если блок был раскрыт, то он закрывается

Аватар пользователя VasyOK VasyOK 9 ноября 2020 в 12:59

У меня почему-то обноление при изменеии количества не работает

Вьюха, commerce_cart_block:

Результат:

Я что-то упустил?

Аватар пользователя VasyOK VasyOK 15 ноября 2020 в 12:25

А как в popup окне корзины dc_ajax_add_cart вывести вьюху этой корзины?

Попробовал так:
mytheme.theme

function mytheme_preprocess_commerce_cart_block(&$variables) {
    $variables['featured'] = drupal_render(views_embed_view('commerce_cart_form ', 'default'));
}

dc-ajax-add-cart-popup.html.twig

{% if featured %}
    {{ featured }}  
{% endif %}

не работает Sad

Аватар пользователя VasyOK VasyOK 15 ноября 2020 в 14:46
function mytheme_preprocess_commerce_cart_block(&$variables) {
    $variables['featured'] = views_embed_view('commerce_cart_form ', 'default');
}

все равно не работает.

Аватар пользователя VasyOK VasyOK 16 ноября 2020 в 17:11

И даже если использовать twig_tweak - все равно конструкции типа

{{ drupal_view('commerce_cart_form') }}
{{ drupal_view_result('commerce_cart_form') }}

в dc-ajax-add-cart-popup.html.twig не дают результатов

Аватар пользователя VasyOK VasyOK 16 ноября 2020 в 17:36

Так, я понял. Вьюха commerce_cart_form не выводится, т.к. ей нужен аргумент. А какой у нее аргумент? Почему в предпросмотре вьюхи не выводится ничего? Я вижу, что там "Order: ID - Фиксированный". А как это понять? Какой токен аргумента?

Аватар пользователя VasyOK VasyOK 17 ноября 2020 в 12:12

Не получается order_id.

Хорошо упрощаем задачу. Специалисты по Комерц, подскажите: как вывести стандартные вьюхи commerce_cart_form и commerce_cart_block в page.html.twig?

Аватар пользователя vlucas vlucas 17 ноября 2020 в 12:14

может с доступом есть проблемы, у вьюхи есть проверка доступа? Ведь не каждый же может посмотреть заказ, тем более не свой

Аватар пользователя VasyOK VasyOK 17 ноября 2020 в 12:17

Я говорю о стандартных вьюхах корзины. Как их програмно вывести? Если анонимус совершает заказ, он же их видит как-то?

Аватар пользователя vlucas vlucas 17 ноября 2020 в 12:48

Причем тут рендер корзины?
Вам же надо вьюс определенный вывести.
Значит что-то не так пишите просто, или не учитываете чего-то.
Сам не пробовал, будет время - попробую.

Аватар пользователя VasyOK VasyOK 17 ноября 2020 в 15:30

Василий Сергеевич, если есть проблема, ее нужно разбить на подпроблемы. Я уже не надеюсь выведать как вывести кастомную вьюху в окне кастомного модуля.

Что я хочу узнать сейчас: как программно вывести стандартные вьюхи корзины в page.html.twig. Другие вьюхи у меня получается вывести. Эти нет.

Аватар пользователя VasyOK VasyOK 19 ноября 2020 в 17:09

Кто весел, тот смеется, кто хочет, тот напьется! Yahoo

Итак, для того, чтобы программно вывести вьюху корзины (и даже в popup окне модуля dc_ajax_add_cart), нужно наложить патч отсюда https://www.drupal.org/project/commerce/issues/2852363 и указать во вьюхе аргумент Order ID - Значение по умолчанию: Cart ID from current user

Кто нибудь этим пользуется?

Аватар пользователя VasyOK VasyOK 26 ноября 2020 в 16:46

Нашел еще одну неприятную особенность модуля dc_ajax_add_cart.

При обновлении корзины AJAX-ом создаются новые контейнеры

<div class="cart cart-form">
 <div class="views-element-container">
    <div class="js-view-dom-...">

Это так и должно быть? В смысле такое поведение аяксирования в модуле нормально вообще?