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 атрибуты.

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

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

http://clip2net.com/s/ic370J

что это может быть?

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

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

Протестировал модуль, задумка отличная!.
У меня товар повторно не добавляется в корзину.
И не срабатывает диалоговое окно, тут наверно я туплю(, нужно ли что то включать для него ?

только опцию в настройках

А как вывести модальное окно которое по умолчанию в kickstarte?

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

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

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

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

Как по мне - для работы с комерсом надо использовать ядро комерса, переписав весь вывод. Начиная от добавления в корзину - то всех шагов оформления.
То есть использовать Drupal как фрейм, а не CMS.

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

Denis, jquery update стоит, попробуй отключить?

Здравствуйте, сделал вывод товаров вьюсом, при нажатии кнопки в корзину выдает вот такую ошибку http://clip2net.com/s/imSOwC . Не подскажете в какую сторону копать?

копать в сторону логов и отладки

Журнал пустой, ничего в нем нет после добавления товара в корзину. В консоли ошибок тоже нету. после нажатия клавиши ввод товар в корзину добавляется. может еще что подскажете?

Здравствуйте, сделал вывод товаров вьюсом, при нажатии кнопки в корзину выдает вот такую ошибку http://clip2net.com/s/imSOwC . Не подскажете в какую сторону копать?

У меня такая же ерунда, когда товар закончился на складе. Как-то надо исправлять.

Еще одна проблема. Когда добавил товар в корзину закрыл окно, далее выбираешь другой цвет товара и вместо выбора цвета происходит добавление товара в корзину.

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

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

При программном выводе товара через views периодически выскакивает ошибка, которую описал Дмитрий, отследить не получается. Нужна Ваша помощь.

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

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

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

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

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

Здравствуйте. Подскажите пожалуйста где поискать причину того что у меня перестает работать ajax-добавление в корзину (этот модуль) после того как список товаров обновляется с помощью ajax (в настройках представления использовать ajax:да). В этом случае после нажатия на кнопку "добавить в корзину" идет индикация ajax-загрузки, но более ничего не происходит, товар не добавляется. Добавлял в #commands ajax_command_alert - не срабатывает в этом случае. Если не обновлять список товаров с помощью ajax - всё работает.
Я подозреваю что это связано с тем что какой-то jquery обработчик не навешивается на динамически добавленные элементы, но где это искать ума не приложу. Подскажите пожалуйста где искать

Еще используется authcache

причину искать в модуле, обновляющем товары с помощью ajax

причину искать в модуле, обновляющем товары с помощью ajax

Но кроме стандартных возможностей views для этого модули не добавлялись.
Ну всё равно спасибо за модуль и ваш блог. Найду решение отпишусь

Я нашел промежуточную причину и может не самое лучшее но решение.
Промежуточная причина была в том что views подменял action формы добавления в корзину с ссылки на ту же страницу (/shop в моем случае) на страницу /views.
Почему он так делает при ajax загрузке, и почему ваш модуль у меня отказался при этом работать, я так и не нашел причины, друпал еще знаю не очень хорошо. Но именно в моем случае помогло добавление такого кода в commerce_fast_ajax_atc_form_commerce_cart_add_to_cart_form_alter:

global $language;
	$form['#action'] = "/".$language->language."/shop";

"shop" это адрес представления где выводятся товары. Ну и сайт мультиязычный.
Буду рад если кому-то пригодится

Немного подправил:

global $language;
	$path = "/".drupal_get_path_alias();
	if(drupal_multilingual()){
		$path = "/".$language->language.$path;
	}
	$form['#action'] = $path;

Простите за столько сообщений подряд, если бы можно было изменял бы предыдущие

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

Использовал для страницы представления фасеты 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? Ну или хотя бы с какого места начать копать...

Посмотрел статью, у меня конечно у товаров есть много полей, но ни одно поле не помечено как "Enable this field to function as an attribute field on Add to Cart forms". Тот выпадающий список что видно на странице http://caramba-shop.ru/product/predlozhenie - это просто к одной node привязано несколько commerce_product и при выводе я туда подсовываю наличие, цену и другую инфу через hook_form_commerce_cart_add_to_cart_form_alter

А будьте добры прямую ссылку на модуль?

В целом модуль отличный, если у тебя бесконечное количество товаров.
Если использовать Commerce Stock, товара у нас одна штука, и при добавлении в корзину второй раз AJAX HTTP ошибка.

гадит в cache_form

Если в списке товаров нет кнопки "Купить" - все будет ок?

Извините, а где можно сам модуль то скачать

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

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

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

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

hook_commerce_fast_ajax_atc_commands_alter

Не понял как ней пользоваться?

я знаю что такое хуки, только ваша функция мне ничего не возвращает.

Все что мне нужно это каким-то образом сделать refresh div элемента при добавлении товара.

Я не использую drupal блок, по-этому функция ajax_command_replace мне не походит

это не функция, это хук, он не должен ничего возвращать

Сделал скриншот чтобы было понятней

Выпадающая корзина обновляется, но как мне обновить div id="custom-cart"?

добавьте ajax_command_replace в hook_commerce_fast_ajax_atc_commands_alter

Все получилось. Спасибо. Сорри за тупняк

Сделал дополнение для модуля, которое позволяет картинкам товара "улетать" в корзину. Может быть кому-то будет полезно: http://borodiny.ru/blog/tovar-uletaet-v-korzinu-dopolnenie-dlya-modulya-...

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

Andead, спасибо за модуль. Подскажи, возможно ли его подружить с Commerce Stock, если да, то в какую сторону смотреть?

Не в курсе что там надо дружить.

Если на складе товара меньше, чем пользователь добавляет в корзину, возникает ошибка:
An AJAX HTTP error occurred. HTTP Result Code: 200 ...

добавил корректную обработку ошибок

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

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

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