Ajaxify Node Basket 7.2: релиз модуля легкого и простого магазина на AJAX для Drupal 7

Таки свершилось. Конечная версия модуля под "семерку", с новым функционалом и возможностями, успешно допилена.

Краткий экскурс в ключевые обновленные возможности

  • Добавление нод в корзину происходит так же, как и в ранних версиях. По крайней мере внешне. Внутренняя же жизнь сего процесса отличается от былого чрезмерно. Вся JavaScript`овая динамика ныне исполняется исключительно через Drupal Ajax API. В свете чего отпала надобность использования модулем своих собственных js-файлов.
  • У блока корзины появился свой темплейт-файл. Дефолтно, "нарисованное" в нем отображает свернутый список отложенного в корзину, где ссылка на "развернуть" информирует так же и о количестве находящихся в корзине товарных позиций. Если у товаров есть цена, то под списком появляется строка с общей суммой заказа. Ну и в самом низу - ссылка на страницу корзины.
  • Заказы. Они теперь сохраняются, как ноды соответствующего типа. Со всеми вытекающими из этого радостями.
  • Уведомления о создании новых заказов ныне умеренно настраиваемы. Помимо администрации сайта письмо о создании заказа отправляется и пользователю, автору заказа. Если данная опция включена в настройках. Отдельный шаблон письма место быть имеет, но как theme-функция, в отдельный файл выводить его посчитал лишним.

Подробное описание настроек и принципов работы модуля

Первоначальные настройки

На странице модулей найти Node Basket можно будет в группе "Коммерция"(или "Node Commerce" в иноземном варианте).

После установки модуля в меню конфигурации сайта появится новый пункт - "Node Basket" (/admin/config/nodebasket).

Ссылка на страницу настроек модул Node Basket

На вкладке основных настроек отмечаем типы нод из всех созданных на сайте. За исключением типа "заказ", естественно.

Далее, включаем/отключаем опции отображения в корзине полей "количество" и "стоимость". При включении отображения стоимости, и наличия в выбранных типах подходящих полей, будет предложено выбрать поле цены и суффикс, добавляемый к значению этого поля.

Модуль Node Basket: настройка полей для типа товар.

После сохранения основных настроек, вас автоматом перекинет на страницу настройки почтовых уведомлений. Где можно выбрать поля заказа, данные которых будут отправляться на адрес электронной почты сайта и пользователя(если включена соответствующая опция). Подробнее о полях заказа будет написано ниже.

Модуль Node Basket: настройка почтовых уведомлений.

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

Модуль Node Basket: настройки доступа для ролей пользователей.

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

Модуль Node Basket: включение отображения блока с содержимым корзины.

Настройка заказа

Как уже было сказано ранее, заказ у нас теперь есть ни что иное, как рядовая нодо-единица.

Тип материала "Заказ" будет автоматически создан при установке модуля. С двумя, лишь, "вшитыми" экстра-полями с настраиваемым отображением в теле заказа:

  • "E-mail пользователя" - почтовый адрес организма, сотворившего заказ;
  • "Содержимое заказа" - собственно, означает то, что означает;

Страница настроек отображения полей типа материала 'Заказ' модуля Node Basket.

Остальные, необходимые в вашем конкретном случае поля, создавать придется самолично. Как обычные поля обычной ноды. Что есть большущий плюс, согласитесь.

Работа модуля. Добавление товаров/нод в корзину

Модуль настроен, права на его использование обозначены, и блок корзины находиться в нужном месте. Что видит пользователь(которому видеть разрешено)?

У типов нод, что нами выбраны, как товары, теперь есть кнопка "Отложить в корзину". По нажатии на оную в блоке с содержимым корзины происходят соответствующие метаморфозы, а текст на кнопке меняется на "В корзине". Все изменения при манипуляции с данными корзины, и при ее редактировании в том числе, происходят без перезагрузки страниц, путем ajax-запросов.

Ajax-корзина с обновленными данными после добавление в нее нового товара.

Редактирование содержимого корзины и оформление заказа

После того, как пользователем набрано в корзину все ему необходимое, он по ссылке в блоке переходит на страницу управления своей корзиной. Тут ему предоставляется возможность подправить ее содержимое(удалить, изменить количество). А если все устраивает, то приступить к завершающей стадии - оформлению заказа. Путем нажатия на кнопку с неожиданной надписью "Оформление заказа".

Страница редактирования содержимого корзины.

На странице оформления пользователь заполняет обязательное "вшитое" поле контактного e-mail`а, и все другие поля, что мы посчитали нужным включить в заказ. И отправляет заполненную форму на сохранение и исполнение.

Страница оформления заказа

В случае успешного сохранения заказа(и правильного заполнения полей) на месте формы появляется торжественное статусное сообщение о сим событии. И письма о новом заказе, с настроенными ранее для него данными, разлетаются по ящикам получателей. При обратном раскладе - пользователь видит сообщение об ошибке.

Сообщение об успешном сохранении нового заказа.

Скачать и примечания

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

В планах: более основательный рефакторинг, оптимизация и документирование кода.

ВАЖНО!!!
При обновлении модуля с версии 7.1 прежде всего необходимо отключить и полностью деинсталлировать "старую" версию. Это два совершенно разных модуля.
Dalay

Комментарии

Отсутствует.

Подскажите где нужно переделать код что бы вместо блока с выводом корзины, в шаблоне темы задать корзину вида ВАша корзина, количество товаров и через тире стоимость. И потом впихуть ее вывод в шаблон страницы...

в комерце делал так

В молекуле ДНК.

Так есть возможность сделать корзину в одну строчку с ссылкой на просмотр корзины и дальнейшее оформление заказа то?

lightshop-block-display.tpl.php, block_load() (или module_invoke()).

Здравствуйте. Сообщите пожалуйста, каким образом я могу передать значение общей цены в отдельную форму? Вообще хотелось бы понять каким образом я могу на страницу оформления заказа добавить свою форму с возможностью передачи ей данных из существующего заказа. Например, что бы после оформления заказа, человек мог оплатить его, автоматически. Есть например форма:



, как мне передать произвольное значение вместо 100?

Значение(просто число, неформатированое) общей суммы хранится в $_SESSION['basket']['total_sum'].

Хорошо. За какую сумму Вы написали бы дополнительный модуль, специально для меня, расширяющий функционал LightShop'a до приема платежей, а именно нужно сделать это для платежной системы W1 - Единая касса.
Суть в чем - 1. Формирование заказа пользователем. 2. Оформление заказа, с указанием данных. (всё как есть сейчас) 3. Оплата заказа пользователем через платежку w1, и после успешной оплаты - удаление данных в корзине из сессии.

Либо просто скажите как вывести код php на странице оформления заказа, причем так, что бы при нажатии на кнопку, - method post , отправлялись данные о заказе на почту (+ все тоже базовое создание ноды с типом материала - заказ), и отправлялись post данные агрегаттору посреднику.

Ок, "рассказываю просто". Открываете файлы модуля, и вникаете в логику кода. Далее, используя api друпала и php, вносите в эту логику коррективы в соответствии со своими потребностями.

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

Автор, выражаю благодарность на такой подарок друпалерам!
Скажите, где находит участок кода, который отвечает за вывод кнопки - отправить заказ, после нажатия которой создается материал типа оформленный заказ, и уведомления приходят. Не могу найти, хочу ещё одно действие добавить что бы выполнялось при нажатии этой кнопки. Заранее спасибо!

lightshop.module >> lightshop_node_form_submit()

Свои действия лучше добавлять через hook_form_alter(). Пример:

function MODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == LIGHTSHOP_ORDER_NODETYPE . '_node_form') {
    $form['actions']['submit']['#submit'][] = 'ваш_обработчик';
  }

Здравствуйте, спасибо за плагин, но есть один вопросик.

Можно ли программно вывести кнопку добавление таблицы. Собственно хочется на странице представления вставлять, когда ноды по категориям выводятся.

Какой таблицы?

Извиняюсь. Кнопочки add_to_basket. Той самой которая к ноде товара добавляется.

Так есть она для Views, смотрите внимательней.

Вау, просто супер. Огромное вам спасибо.

Кстати, в теме ноды вывел так:  print ($content['lightshop_add2basket']['#markup']);
Надеюсь никаких подводных камней не несет такой способ.

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

Для шаблона ноды правильнее будет так:

// Сперва убираете кнопку из общего массива $content.
hide($content['lightshop_add2basket']);

// Затем выводите ее в нужном месте.
print render($content['lightshop_add2basket']);

Спасибо.

Еще проблеммка возникла. В настройках не отключается галочка "Показать редактируемые поля с количеством для выбранных товаров."

В ходе тестирования создал пару заказов с количеством.

Удалил все заказы, удалил модуль, очистил кэш, установил по новой. Но не сработало. Может, что-то упустил?

И еще вопрос. Чем делали перевод модулю. Нужно изменить некоторые термины.

По "галочке" ничего сказать не могу. Проверил, все ок.

Вопрос про "чем делали перевод модулю" мне не ясен в принципе. Как не понятно и то, что Вам мешает изменить переведенный текст с помощью стандартных средств (admin/config/regional/translate/translate).

Еще раз здравствуйте.

Через свой модуль, добавил к форме "Оформления заявки" новое поле. По причине того, что нужно было сделать зависимый ajax-список.

Все отлично работает, модули не конфликтуют. Только не могу понять одного, как теперь значение новых полей записать в базу. Никак не могу найти эту функцию в вашем модуле. Подскажите, пожалуйста, какой хук за это отвечает или куда капать?

Функции работы с базой данных известны, не могу понять друпаолвские ajax-функции, а точнее куда форма post-запрос передает и где он обрабатывается.

Пришлось костыль на jQuery написать.

А эти секретные страницы я уже начитался за эту неделю, ajax список ведь таки сделал, но полное осознание по ним думаю придет позже, тогда может быть и по нормальному переделаю.

Здравствуйте,
Решил отменить ajax только для страницы оформления заказа.
Сделал вот так.

function mymodule_form_lightshop_basket_form_alter(&$form, &$form_state) {
if(isset($form['checkout']['#ajax'])){unset($form['checkout']['#ajax']);}
}

Подскажите пожалуйста, ничего ли не нарушит такой вариант?

Не нарушит, модуль и без JS замечательно работает. В IF оборачивать незачем.

Извиняюсь, что продолжаю мучить вас вопросами, но никак не могу побороть проблему. Если у Вас нет времени в этом разбираться, то можете пропустить вопрос, не обижусь.
Вот ссылка на вопрос в форуме друпал.ру /node/111640

Николай, вопрос - это когда о чем-то спрашивают.

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

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

Чем не устроил предыдущий ответ? Других у меня нет.

Как бы можно бы обойти корзину, уменьшить количество итераций для покупки. т.е добавить в корзину поменять сразу на оформление, подскажите где смотреть

Смотрите в репозитории drupal.org. Вам явно нужен другой модуль.

Можно через сочетание uc_optional_checkout_review и uc_acar.

а что с релизом ветки 7.2.х.? На друпал.орг только .1.х и там явно не все фичи имеются.

Light Shop 7.1.x == Node Basket 7.2.x

Привет, я уже понял, что поле e-mail поменять в рамках модуля сложно. А можно ли сделать (автозаполнение чуть не то), т.е. значение по умолчанию, которое бы уже было в том поле? Где это прописать? А потом скрыть через css, это уже понятно.

на предидущей странице я предлагал такой вариант:
Можно добавить поле chekbox с текстом типа "У меня нет мыла", и написать скриптик jQuery строчек на 5, если чекбокс выбран, то скрыть поле Email и задать ему value со своим дефолтным ящиком.

А если просто по умолчанию мыло нужно, то тоже самое, но еще проще.

Спасибо, чел. Уже со своим вариантом сделал, к сожалению - не селен ни в бэкэнде, ни во фронтэнде. Сделал дефолтный ящик и скрыл его, через css. Еще бы как-то весь заказ все уместить на 1 страницу. На commerce уже это делал, сейчас задача обойтись модулем и обычным друпалом, сделав корзину максимально удобной.

*силен

А можно как то добавить кнопку «Удалить из корзины», чтобы после добавления появлялась именно она вместо кнопки «добавлено»?

Нет.

Добрый день, есть ли возможность добавления стоимости доставки, что-то типа такого:

1) Положили 2 товара в корзину
2) Перешли в саму корзину
3) На странице корзины, где находится перечень товаров показывать чекбокс - доставка, при нажатии на которую будет добавляться определенная сумма.

Есть ли такая возможность?

Спасибо за отличный модуль. Возникла одна проблемка. Модуль без проблем работает с любой темой, кроме Bootstrap 3. Точнее не работает блок - он остается пустым при добавлении нод в корзину, хотя счетчик работает.

Думается, с темой этой много чего еще не работает. Адаптировать модуль под конкретно ее особенности я точно не стану.