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

Комментарии

а что с 5.2 PHP не работает???

В коде используется синтаксис 5.3.

Подправил. Но на 5.2 не тестировал.

Спасибо за модуль. Давно ждал.

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

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

Внешний вид корзины настраивается в файле ее шаблона theme/nodebasket-block-display.tpl.php.

Я выше писал про ноду, если ответ мне был.

Касаемо ноды планов нет).

Не появляется цена, общая сумма за выбранные товары в корзине. Цена колонка появляется а самой цены нет.

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

Все сделано по описанной выше схеме 3 раза. на разных хостингах и доменах.

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

Скажи что требо предъявить. Все что не делает модуль я написал.

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

Не ясно как замылить. Но, почему вы не верите что на голый Друпал 7 20 устанавливая ваш модуль не выводятся цены как в корзине (на просмотре) таки в блоке...

У нод типов, что выбраны в настройках, как товары, точно заполнены поля с ценой?

ну я для пробы задал цену паре нод.

В корзину добавляется только эта пара нод?

Попробуй следующее.
В файле nodebasket.module строка 483, замени:
[$node->language]
на
[LANGUAGE_NONE]

Данке шон!

Сработало?

Да, спасибо, разобрались, а то скриншоты скриншоты. =)

) ок

Файлы модуля обновил.

А еще когда оформляешь заказ, текст во вкладках вертикальных больше чем, при создании других нод... это тут css подправить? .vertical-tabs ul.vertical-tabs-list. может дефолтные значения оставлять?

Модуль на вертикальные вкладки никоим образом не воздействует. Проверял на дефолтовом Бартике. Если изменился вид, то, скорее всего, в самом шаблоне подсоединяется какой-то файл, завязанный на текущий адрес.

Может отличаться видом заголовок страницы. Он динамически изменяется, в зависимости от текущей страницы, из тех, что связаны с корзиной.

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

Уверен, что не стоит.)

А если требуется по сайту выводить все формы в другой теме... как поступить в этом случае?

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

Так в модуле же оформление заказа - нода... мы ее создаем... поэтому я и предполагаю что созданеи ноды должно таки открыватсяа на странице редактирования в др теме если она задана.

Создание/Редактирование ноды - административная задача. Т.е., изначально предполагается, что страницу в "другой теме" будут видеть только те, кто наделен некоторыми редакторскими полномочиями. И данный функционал(назначение административных тем) существует не для того, что бы просто изменить вид страницы, а для ее облегчения от ненужных элементов. Менять тему для страницы только ради изменения вида форм - есть очень бестолковая затея.

Если на озвученные выше положения пофигу, то можешь добавить в код файла nodebasket.module, в функцию nodebasket_menu(), например после строки 63, следующие строки:

   
 'theme callback' => 'variable_get',
 'theme arguments' => array('admin_theme'),

И после очистки кэша будет тебе счастье.
В модуль я этого, понятно, добавлять не буду.

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

/**
* Implements hook_menu_alter().
*/

function MODULENAME_menu_alter(&$items) {
  $items['basket']['theme callback'] = 'variable_get';
  $items['basket']['theme arguments'] = array('admin_theme');
}

Норм, вроде. Но все таки жаль что оформление заказа не на той же странице... basket

=) наберусь наглости и спрошу, а на basket/order сложно пусть изменить? пользователям?

Ответ дан выше.

У вас же корзина и оформление на одно же странице? У меня вопрос был по разделению... в хуке меню альтером делается?

Достаточно указать только для 'basket', будет применяться на всех от нее производных. Почему было не попробовать, прежде, чем спрашивать?

То ли я не так объясняю то ли меня не понимать. С выводом в темах разных все ясно еще 5 постов назад. Я о создание корзины по адресу basket а по клику на оформить заказ, чтобы это было уже на basket/order

Давай, Олег, уже досвиданья. Спасибо за общение.

При отправке заказа, говорит следующие:
-------------------------------------------------------------------------
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 500
Следует отладочная информация.
Путь: /nodebasket/ajax
СтатусТекстом
ОтветТекстом: PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'dvresurs.nodebasket_order' doesn't exist: INSERT INTO {nodebasket_order} (nid, uid, mail, items, code) VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2, :db_insert_placeholder_3, :db_insert_placeholder_4); Array
(
[:db_insert_placeholder_0] => 28
[:db_insert_placeholder_1] => 1
[:db_insert_placeholder_2] => office@goodwork-studio.com
[:db_insert_placeholder_3] => a:1:{s:5:"items";a:2:{i:10;a:2:{s:5:"title";s:12:"Сельдь";s:3:"qty";i:1;}i:9;a:2:{s:5:"title";s:48:"Красная икра (малосоленая)";s:3:"qty";i:1;}}}
[:db_insert_placeholder_4] => 08ab879c
)
в функции drupal_write_record() (строка 7106 в файле /home/ivan/sites/dv-resurs/www/includes/common.inc).
----------------------------------------------------------------

Как бороться, куда копать?

P.S. Работает с настройками "Без цен", drupal 7, php 5.4

С 5.4 никаких гарантий никто Вам не даст, касательно семерки.

Ответ в коде: Table 'dvresurs.nodebasket_order' doesn't exist

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

Думается, семерка на php 5.4 преподнесет вам еще немало удивительных и неожиданных сюрпризов.

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

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

Нет, я ставил эту версию впервый раз на чистый drupal.