Ajaxify Node Basket. Новая версия модуля корзины для нод

Наконец-таки добрались мои руки до модуля Node Basket. Напомню кратко, что модуль данный добавляет функционал корзинки для отбора в нее нод определенных типов. С последующим оформлением заказа на отобранное, и отправки оного на заданный настройками почтовый адрес.

Первоначальной целью было решить уже наконец проблему взаимодействия Node Basket с «политикой» кэширования Drupal'ом страниц для анонимных посетителей. Методом решения сей задачи было выбрано использование технологии ajax для подгрузки актуального содержимого корзины. Отныне данный метод включается в работу модуля автоматически для посетителей-анонимов при отдаче им «закэшированных» в БД версий страниц.

Обновленный функционал

Лишь решением «темы» с кэшем дело не обошлось. Попутно был «перелопачен» весь код Node Basket. В результате - пересмотрены и переправлены почти что все принципы работы модуля. Ключевые моменты распишу по пунктам:

1. Добавление нод в корзину и удаление их из нее было «аяксифировано» и происходит ныне без перезагрузки страницы.

Добавление ноды в корзину на AJAX.

2. Настройки корзины убраны из форм редактирования типов контента, и перенесены на страницу настроек самого модуля (/admin/settings/nodebasket). Был упразднен пункт настроек, где выбирался режим работы модуля с каждым определенным типом материала(добавлять ноду в корзину или по ссылке «добавить» переходить сразу к оформлению заказа). Посчитал, что сие большого смысла не имеет.

Страница настроек модуля.

3. Добавлена кнопка/ссылка для полной очистки корзины от имеющегося там содержимого.

Добавлена новая кнопка очистки корзины.

4. Добавлена возможность указывать количество для каждой «нодо-единицы», отобранной в корзину. Управление количеством происходит на странице корзины пользователя. Функционал этот в данной версии «неотключаем».

Страница корзины посетителя.

5. Для изменения отображения содержимого корзины отныне не нужно будет править код самого модуля. Теперь за это отвечает функция темы theme_nodebasket_basketview(). Она же подгружает и «дефолтовый» файл стилей с базовыми настройками отображения.

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

Нет, еще кое-что...

Ajaxify Node Basket и Views

Для добавления кнопки Node Basket в ваш Вид/Представление используйте Views Custom Field. Код вызова кнопки добавления в корзину будет выглядеть следующим образом:

<?php
print drupal_get_form('nodebasket_nodeviewform', $data); // В параметрах функции вызова формы вместо обьекта $node должен быть указан обьект $data.
?>

Форма добавления кнопки корзины в Views (с помощью Views Custom Field)

Важно!!!

Если у вас была установлена более ранняя версия модуля Node Basket, то от нее обязательно надо будет избавиться:

  • отключите «старый» модуль на странице управления модулями на странице /admin/build/modules;
  • деинсталируйте модуль (/admin/build/modules/uninstall);
  • во избежание возможных недоразумений удалите все файлы ранней версии из папки модуля на сервере;

Демонстрация работы модуля.

Скачать модуль

Dalay
Комментирование закрыто

Комментарии

огромное человеческое спасибо))

Радует, что руки дошли и даже очень неплохо доработано.

Жаль, конечно, что не настраивается заказ и корзина...

Спасибо за отклики.

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

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

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

Файлы обновлены.

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

Добавляйте, как php-код:

<?php
print drupal_get_form('nodebasket_nodeviewform', $node);
?>

Дело в том что я формирую каталог в виде таблицы,использую CCK и Views хотелось бы для каждого товара баблицы выводить кнопку.

Ну и? Чем не устраивает предложенный выше вариант?

не совсем понимаю куда всталять код.

Два варианта.
1 (ручной и геморный, но простой) - создаете текстовое поле(cck) с возможностью выбора при его редактировании формата ввода, затем при редактировании вставляете кнопку вышеописанным кодом и выбираете формат ввода для поля: PHP.
2 (автоматом) - скачиваете соответствующий виджет для cck(на вскидку, например Dynamic Field, но думаю, что подобных по функциям есть еще), далее забиваете в него все тот же php-код с выводом кнопки.

пс
По уму же добавлять кнопку для последующего ее отображение полем в Views логичней самим Views`ом. Гляньте в сторону Views Custom Field или Views Embed Form.

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

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

И еще такой баг- каталог работает только для зарегестрированных пользователей.Для анонимных выдает "warning: Invalid argument supplied for foreach()" и ругается на строку "foreach ($header as $field => $label):" в файле views-view-table.tpl.php

Не встречались?

Не встречался.

При включении в настройках для каких типов материала будет использоваться корзина, появляется кнопка "Добавить в корзину" абсолютно на всех типах. Новости тоже покупать можно :) Когда установки по умолчанию делаю, тогда нигде нет кнопки.

Пофиксил, спасибо за отлов. Файлы в архиве аттача обновлены.

В архив с модулем добавлены файлы перевода на русский язык.

супер! спасибо!

Радует, что дошли руки :)

Дядьки, публикация датирована 5-м августа, хорош тормозить.

Добрый день.
Большое спасибо за разработку этого модуля.
Скачал поставил. Но есть проблемы.
В пункте 4. "4. Добавлена возможность указывать количество для каждой «нодо-единицы»"
Почему то не отображаются действия (Добавить, отнять, удалить.)
Подскажите плиз в каком направлении рыть, чтоб исправить эту ошибку.
Заранее большое спасибо

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

Да. В коде есть кнопки. Может CSS перекрывает?
Буду копать, спасибо за направление

Странно, по коду ничего странного не нашел....

покажи сайт, я найду

Нашел в чем причина.
Модуль когда устанавливается, неправильно определяет путь для кнопок и скриптов если сайт лежит не в корне хостинга. В моем случае это - www/gz/...
то есть друпал лежит в папке gz

Еще попутно нашел одну мелочь. Тайтлы для кнопок в корзине одинаковые "Remove this item from basket"

Тайтлы пофиксил. Формирование адресов к иконкам изменил: вместо слэша перед определением пути к папке имаджей модуля теперь base_path():

<img src="'. base_path() . drupal_get_path('module', 'nodebasket') .'/img/картинко.gif">

Файлы аттача обновлены.

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

Переписав/подправив модуль под свои нужды, как же еще.

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

Нашел такой вот не приятный моментик:
Для анонимного юзера кнопочка добавить в корзину не отрабатывает.
Собственно запрос от кнопки уходит а товар в корзине не появляется.
Может подскажете где поискать чтоб исправить?

Сори нашел, свою оплошность.
Но есть другой момент.
У меня не отображалась корзина для анонимных пользователей потому, что в настройках блока корзины была галочка - отображать только для зарегистрированных.
Но тогда есть баг - если анонимный пользователь не видит козины, тогда по идее модуль должен отрабатывать: Либо скрывая и кнопку заказать и отображение корзины для анонимного пользователя. Либо выводить при нажатии на кнопку предложение для регистрации на сайте.

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

Корзина отображается с помощью блока.
В настройках блока:

Показывать блок только для указанных ролей:
anonymous user
authenticated user

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

А что мешает настройки доступа указать соответствующие?

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

в ксс-стилях

Пробовал z-index утяжелять не помогло...

http://htmlbook.ru/css/
http://getfirebug.com/

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

$block = module_invoke('nodebasket', 'block', 'view', '0');
print $block['content'];

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

Все проще:

print theme('nodebasket_basketview', 1);

Да разницы нету... все равно ничего не выводится в нужном месте темы.

Чем так не устраивает стандартный друпаловский вариант с объявлением региона в «нужном месте темы» и последующего вывода блока с корзиной в нем?

Анонимам не кажет, потому как кэширование включено. В блок подгружается аяксом(для анонимов), если уж так надо, то печатайте вывод в контейнере:

print '<div id="nodebasket-ajax-content">'. theme('nodebasket_basketview', 1) .'</div>'; //ID контейнера служит «опознавательной меткой» для js.

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

Нет, такого ничего не задумывалось. Обработка вышеназванных действий в том и другом случае предполагалась быть одинаковой(на известных мне сайтах, где используется модуль именно так все и происходит, ищите причину «у себя»).

Да, у меня тоже только после перезагрузки страницы. ХЗ, что делать, как наиболее примитивный вариант навесить на кнопки + и - действие перезагрузки страницы.

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

Еще вопросы:
1. Насколько сложно переделать модуль так, чтобы содержимое корзины оставалось у пользователя и после окончания сессии? Это незначительные доработки или придется переписывать весь модуль?
2. Работа с ценами (если цена товара указана в CCK поле). Реально? Много ли потребуется доработки?
3. Реально ли данные, получаемые при заказе (наименование ноды, количество, логин заказчика) вытягивать с помощью views?

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

)) Что брать за единицу измерения сложности и значительности? Рубли, баксы, евро? Все реально, почему ж нет.