Node Basket: Модуль корзины для нод. Drupal 6

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

О модуле

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

За основу был взять модуль Acart Андрея Постникова, который он выкладывал под «пятый» Друпал на drupal.ru пару лет назад.

Под проект авторского фотобанка Node Basket был дополнительно «заточен» под совместную работу с модулем Image. В варианте, что предложен для скачивания эта специфичность отсутствует. Посчитал более полезным предоставить базовый набор функционала, не отягощенный моими предпочтениями и надобностями.

Возможности и настройки модуля

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

Для включения модуля на странице /admin/build/menu ищите его в наборе «Другой» (или «Other», если не переведено).

Модуль Node Basket на странице списка модуле Drupal.

После включения можно указать для Node Basket e-mail, на который будут отсылаться оформленные заказы (/admin/settings/nodebasket). Если не указывать, то используется основной почтовый адрес сайта из глобальных настроек.

Страница настроек почтового адреса для модуля Node Basket.

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

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

Настройка Node Basket для работы с разными типами материалов.

У материалов, которым корзина или оформление заказа разрешены, в массиве $links появляются соответствующие ссылки.

Блоки, создаваемые модулем

Node Basket создаст два новых блока. По умолчанию, естественно, отключены.

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

Блок с корзиной модуля Node Basket.

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

Ограничение доступа к корзине

На странице настроек доступа для разных пользовательских групп (admin/user/permissions) отмечаем для Node Basket правила доступа к использованию корзины. Если забудете это сделать, то пользоваться корзиной сможет только Юзер № 1, изначально все настройки доступа обнулены.

Примечания

Тестирование модуля проводилось на серверах с PHP 5.2. В этом случае все работает без ошибок и недоразумений. Как будет вести себя модуль с другими версиями PHP прогнозировать не берусь.

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

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

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

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

Комментарии

Что-то я не нашел в данной реализации проверок на кеширование страницы и очистку кеша для блока и страниц...

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

Воплотить очистку кеша нужных страниц при добавлении в корзину и запретить кеширование страниц корзины оказалось делом не сложным. Но вот что бы ссылки на «добавить» и «изьять» в массиве $links ноды отображались по-разному для анонимов, тут я впал в ступор. У когонить есть идеи по сабжу?

количество нельзя указать

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

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

Обьясните популярней, не понял о чем вы.

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

Таблицей выводится, а еще точнее функцией theme_table.

Отвечает за вывод страницы корзины функция nodebasket_list_basket() (файл nodebasket.pages.inc, строка 25). Собственно табличный вывод в функции формируется этим куском кода:

$rows = array();
  $destination = drupal_get_destination();
  foreach ($_SESSION['basket'] as $k => $v) {
    $rows[] = array(
      'name' => l($v, 'node/'. $k),
      'delete' => l(t('Remove from basket'), 'basket/'. $k, array('query' => $destination))
    );
  }  
  if (count($rows)) {
    $output = theme('table', $header, $rows, array('id' => 'basket_list'));
    $output .= '<p>'. l(t('Ordering'), 'basket/order', array('query' => $destination)) .'</p>';
  }  

Изменяйте и будет вам счастье.

огромное спасибо))
я почему то уперся в themt() и там пытался вывести списком...

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

В направлении theme_item_list().

что нужно завернуть в див, чтобы так вывести?

Разберитесь с функциями theme_table() и theme_item_list(), тогда все подобные вопросы отпадут.

спасибо, буду читать)

Ленту нод замаскировал под таблицу, где
колонки:
-наименование ($title),
-примечание (поле CCK),
-фото (imagecache + imagefield + lightbox2) поле CCK,
-цена(поле CCK),
-добавить в корзину ($links);
строки - ноды.

Красиво и работает! Модули магазинов отдыхают.

Вот бы еще $links отображалась в Views...

Да вот тоже думаю как с view связать "Добавить в корзину"

Иеще очень интересно как указать количество товара

"Добавить в корзину" реализовано через hook_links с коллбэком обработчика. Перепишите этот момент под Виевс, думаю, что только так.

та там черт голову скрутит с обработчиком View. Если б я писал просто в файле PHP всегото делов вывести текст в табличке а не под материалом.

Вобщем воротить кода 1мб ради простой перестановки вывода. из мухи слона сделать

Вот очень правильные слова.

хорошо что придумали стили зделаю позиционирование absolute если что, а заказчик и не догадается бугагагага

Про косяки с кэшем у анонимов заказчику тоже рассказывать не станете или нашли решение это обойти?

вот с количеством товара я не знаю что делать, я поковырял модуль и там ну негде прикрутить, залез бы в "оформление заказа" вместо ссылки "Ordering" сделать форму и передать через массив $_POST количество товаров ?

Да как же негде, ковыряйте еще.

Кстати, о Views. На друпалорге пару лет валяется без обновлений микро-магаз, сделанный полностью на виевсах. EZShop называется. Думаю посмотреть его принципы будет полезно тем, кто без Views полноценным Друпал не считает.

Вот заменил функцию, должно заработать. не знаю насколько надежно, если разберетесь, то оцените.

Файл nodebasket.pages.inc

function nodebasket_list_basket() {
  $header = array(t('Title'),t('Count'), t('Operations'));
  $rows = array();
  $destination = drupal_get_destination();
 
  foreach ($_SESSION['basket'] as $k => $v) {
    $rows[] = array(
      'name' => l($v, 'node/'. $k),
      'count'=> t('<input type=text size=4 name=count-'.$k.' value=1></input>'),
      'delete' => l(t('Remove from basket'), 'basket/'. $k, array('query' => $destination))
    );
  }  
  if (count($rows)) {
    $output  = '<form method=post action='.URL( 'basket/order', array('query' => $destination)).'>';
    $output .= theme('table', $header, $rows, array('id' => 'basket_list'));
    $output .= '<input type=submit></input></form>';
    //$output .= '<p>'. l(t('Ordering'), 'basket/order', array('query' => $destination)) .'</p>';
  }  
  else {
  $output = t('You basket is empty.');
}

 if (isset($_SESSION['history'])) {
    $output .= '<p>'. l(t('Basket Ordering History'), 'basket/history') .'</p>';
  }
  return $output;
}

Чет сомнительно мне, что это работать будет. А не проще(точней не правильней ли) заюзать форм-апи двига?

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

Form API было б правильнее

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

Это напомнило фильм про 12 стулье "... и Васюки автоматически стают центром мира ... "

:) ну а че, правильный кин, у каждого центра мира есть тот, кто его таким выдумал и назначил

А потом еще сделать Popup Form

http://api.drupal.ru/api/group/form_api/6

t('')

Никогда такого не делайте!

 t('<input type=text size=4 name=count-'.$k.' value=1></input>')

Никогда такого не делайте!

http:\//drupal.ru/files/nodebasket_with_count.zip

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

Родина вас не забудет, респект, овации и вечный огонь на Марсовом поле.

если все по чуть-чуть сделают, то можно и на дорге разместить
0) надо по солиднее сдлеать текст письма (возможно в настройке модуля сделать текстарея для формы письма) и предпросмотр содержания письма перед отправкой заказа.
1) Ajax скрипт для добавлния в корзину
2) Подсчитать стоимость покупки = sum(количество*цена)
3) всетаки добавить в модуль опцию (сохранять покупки в базу данных), всетаки для анализа спроса может понадобится.
4) Надо встаки информировать (обнадежить) покупателя о сотсаяни транзакции покупка-продажа. Тоесть в каком состоянии (в очереди, уже в пути, осуществленна)
5) успользовать апи форм для отправки.
6) гибкое добавление полей в просмотр корзины (хотябы по названию поля добавлять в вид корзины)

Если все это сделаете, то Родина действительно вас не забудет))

Свжитесь со мной пожалуйста icq: 248268755

С кэшем корзина так и не подружилась?

Нет, давно уже не занимался

Я бы занялся сохранением заказов в базу данных, да стимула нет. )

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

упс, а сессии эти останутся если кеш очистить ? Я думал тому человеку Очень и Срочно интересно всего лишь.

о остаються ) правда если зайти с другого браузера, то нет ) и что делать ) привязать всех к IE6 ?

Сессии актуальны еще n-ное время, заданное настройками Друпала. С другого браузера, естессно, новая сессия откроется.

Какая, по вашим наблюдениям, доля процента посетителей пользуется одновременно несколькими браузерами? При чем сдесь IE6?

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

Ну допустим каждый заказ не привязывать к пользователю а к e-mail. И сделать поле обязательным. Тогда будет логичная таблица id|e-mail|nid|count|. В такую таблицу можно внести примитивный заказ. Эту таблоицу можно использовать для других анализирующих модулей. Вот как узнать какой товар пользуеться спросом сейчас ? Ну оно конечно можно запустить sql скрипт, но не будет ли это двойной работой. Порядочный модуль должен иметь *входы* и *выходы*. Он должен использовать данные одного модуля и иметь возможность предоставлять данные другому модулю

)) что бы сделать этот модуль «порядочным», имеющим *входы* и *выходы*, дополнения его своими таблицами(что воплощается, как вы понимаете, элементарно) ну совсем не достаточно. Это как на одной ноге носить рваный кед, а для другой прикупить сверкающий бот из бутика.