xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Модуль Commerce Fast Ajax Add to Cart — ajax кнопка "Добавить в корзину"

Как выяснилось, стандартный способ добавления товаров в корзину через #ajax довольно прожорлив. Например при выводе 30 товаров на одной странице, мы получим 60 новых записей в таблице cache_form на один хит. Каждая запись это 10-20 kb данных. В сумме выходит многовато — у меня на рабочем проекте #ajax даёт оверхеда на 200-300 ms к времени загрузки страницы.

Пришлось искать пути решения проблемы. Самым простым показался отказ от #ajax и ручная ajax-ификация кнопки "Добавить в корзину". Родился модуль — Commerce Fast Ajax Add to Cart.

Модуль не гадит в cache_form, но работает по прежнему через ajax-команды.

Модуль умеет выводить диалоговое окно после добавления товара в корзину. Включается на странице admin/commerce/config/commerce-fast-ajax-atc. По умолчанию в окне выводится текст "Товар добавлен в корзину" и три ссылки — В корзину, Оформить заказ, Продолжить покупки. Шаблон можно переопределить и вывести там например вьюху.

Ajax-команды можно альтерить в hook_commerce_fast_ajax_atc_commands_alter(&$commands).

Модуль не будет работать с формами, в которых есть commerce атрибуты.
Модуль не мешает работе ajax атрибутов комерца.

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Большое спасибо! Я правильно понимаю, что вы хотите довести модуль до релиза? Или он так и останется в "песочнице"?

как получится

Спасибо за модуль, все отлично работает.
Не подскажите каким способом можно обновить блок корзины при помощи AJAX , при добавлении товара в корзину при помощи вашего модуля

модуль самостоятельно обновляет блок корзины

Посмотрел модуль изнутри, корзина должна обновляться, что может мешать этому? Использую page manager, panels, panels everywere. Блок корзины вывел через page manager, в site template

может селектор корзины другой

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

в hook_form_FORM_ID_alter удалите у кнопки класс use-ajax-submit

глючит! в товаре с атрибутами если нажать сначала "добавить в корзину", а потом выбрать какой нибудь из атрибутов, то товар так же автоматически добавляется, как если бы я еще раз нажал на добавить в корзину!

написано же "Модуль не будет работать с формами, в которых есть commerce атрибуты"

Да, действительно. Невнимательно читал. i'm sorry!
А решение данной проблемы где нибудь есть?

Спасибо, отлично все работает. Но не подскажешь как сделать чтобы выводилось обычное системное сообщение вместо модульного confirmation dialog? Буду оч признателен, спасибо.

Ajax-команды можно альтерить в hook_commerce_fast_ajax_atc_commands_alter(&$commands).

Добрый день. Понравилась идея, но почему модуль нельзя скачать с друпал.орг?

Использовал для страницы представления фасеты Search API, т.к. стандартный раскрытый фильтр невозможно разделить на разные блоки. При изменении фильтра, как и у Станислава, перестает работать ajax добавление в корзину в виду изменения у формы "action". Помогло добавления кода в commerce_fast_ajax_atc_form_commerce_cart_add_to_cart_form_alter:

$view = views_get_current_view();
  $path = $view->display['page']->display_options['path'];
  $form['#action'] = $path;

Расим, есть модуль для разделения раскрытых фильтров на несколько блоков.
MEFIBS - More exposed forms in blocks
Хоть и dev версия, но вроде багов у себя не заметил при ее использовании

Подправил предыдущий код

if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
        && !empty($_SERVER['HTTP_X_REQUESTED_WITH'])
        && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  $path = $_SERVER['HTTP_REFERER']; 
  $form['#action'] = $path;
  };

Если несложно, расскажите пожалуйста про этот момент:

// Remove cart block id from drupal_html_id() static cache
 $drupal_html_ids = &drupal_static('drupal_html_id');
 unset($drupal_html_ids['block-commerce-cart-cart']);

Спасибо за статью.

Спасибо за модуль, работает хорошо, но вот по поводу "не гадит в cache_form" - что-то не сильно помогло...

После очистки таблица через некоторое время загаживается до нескольких тысяч записей, пример одной записи: http://pastebin.com/UZwywATk

Пример страницы на которой есть кнопка: http://caramba-shop.ru/product/predlozhenie

Скажите пожалуйста, что-то не так в настройках или все же от загаживания cache_form избавиться полностью не получится?

цитата:

Модуль не будет работать с формами, в которых есть commerce атрибуты.

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

У меня вроде как вполне работает он на сайте caramba-shop.ru - добавляет правильные товары в корзину через AJAX, жалоб от клиентов вроде бы не было. Проблема пока только с cache_form замечена.

в смысле не будет выполнять своих основных обязанностей — не засорять cache_form

И ещё уточнение: что имеется в виду под атрибутами?

Модуль Commerce Product Attributes у меня не установлен, включены только вот такие модули:
Commerce
Commerce ad hoc payment
Commerce Custom Order Status
Commerce Fast Ajax Add to Cart
Commerce Price Decimals for All
Commerce Price Decimals Formatter
Commerce Shipping RussianPost
Commerce UI

И может тогда подскажете, что ещё можно допилить в модуле, чтобы он на моем сайте работал не засоряя cache_form? Ну или хотя бы с какого места начать копать...

А как можно обновить div-блок который я вручную вывожу в page.tpl

Например я вывожу в page.tpl

Товаров в корзине: <?=$cart_quantity?>

Мне нужно обновить блок с идентификатором custom-cart. Чем можно заменить ajax_command_replace?

hook_commerce_fast_ajax_atc_commands_alter

Добрый день. Спасибо за модуль, но обнаружилась проблема. Вы пишите, что модуль не будет работать с атрибутами. У меня используется модуль https://www.drupal.org/project/commerce_option. С ним работает модуль, если выбрать опцию, а вот если поле для выбора опции обязательное, но пользователь ничего не указал, то вылазит ajax-ошибка. Подскажите, как её избежать?

Добрый день. Подскажите почему то не добавляется в корзину через AJAX, идет обычная перезагрузка страницы. Хотя в button есть class="use-fast-ajax-submit btn btn-default form-submit"

В чем может быть проблема?

Проблема, возможно схожая с предыдущим комментарием. При использовании Infinite Scroll, а также ajax_facets, кнопка перестает добавлять в корзину

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании