Если в вашем интернет-магазине, после оформления заказа, от пользователя уже ничего не зависит, то регистрация пользователей не нужна, а иногда, даже вредна.
Классический пример — продажа футболок. Если вы не предоставляете скидки постоянным клиентам, не даете возможности изменения заказа после оформления, и не оказываете других специфических услуг, требующих надежной идентификации покупателя, то обязательная регистрация будет только дополнительным геморроем фактором отказа.
Чем меньше вы будете требовать от пользователя ненужных действий (к ним же относится необходимость заполнения избыточной для оформления заказа информации), тем выше будет его лояльность = конверсия = ваша прибыль.
Я думаю, что такой воркфлоу, при котором не потребуется регистрации пользователей, в принципе, возможно реализовать на всех популярных фреймворках для электронной торговли на Drupal. Я буду приводить примеры для Drupal Commerce, но для Ubercart отличия будут небольшие.
Основываясь на стандартном поведении этих двух "школ" организации интернет магазинов, в общем случае, нам потребуется произвести следующие манипуляции:
- Дать анонимам все необходимые права;
- Убрать формы авторизации;
- Отключить создание пользователей;
- Настроить информирование пользователей.
Настройка процесса оформления
В случае с Drupal Commerce достаточно дать анонимам право оформления заказа (Access checkout):
И отключить два правила:
Создание новой учётной записи для анонимного заказа (Create a new account for an anonymous order)
и
Связать анонимный заказ с существующим пользователем (Assign an anonymous order to a pre-existing user):
Информирование пользователей
Тут все будет сильно зависеть от специфики продаж. Для магазина футболок, я бы, например, определил такие задачи:
- по завершению оформления заказа, на странице подтверждения показывать покупателю уникальную секретную ссылку для отслеживания статуса заказа на сайте;
- так же отправлять эту ссылку на e-mail или в SMS;
- при этом, доступа к просмотру заказов по обычным URL'ам (вида
user/*/orders/*
) у анонимов быть не должно.
Как обычно в Drupal, задачу можно решить разными способами:
- написать свой хитроумный модуль;
- переопределить функцию генерации URL или номера заказа;
- попытаться реализовать такой функционал готовыми модулями.
И совершенно гениальную идею предложил уважаемый imarat в соответствующей ветке на drupal.ru:
- сделать для заказа скрытое поле со случайным значением;
- через токен подставить это значение в ссылку, выдаваемую пользователю;
- сделать вьюху заказов, с контекстным фильтром по этому полю (и отключить проверку прав).
Для добавления поля в заказ потребуется включить модуль Order UI, а для самого поля я использовал модуль Computed Field. Этот модуль позволяет вычислять значение с помощью PHP. Я посчитал, что оптимальным балансом между надежностью и удобочитаемостью будет случайное число из 8 цифр:
if (!$entity_field[0]['value']) {
$entity_field[0]['value'] = mt_rand(10000000, 99999999);
}
Условие нужно, чтобы значение не пересчитывалось при каждом обновлении заказа. Так же надо убедиться что отмечена опция:
Хранить значение в базе данных (Store value in the database)
в противном случае, его нельзя будет использовать во вьюхе. Не забудьте скрыть метку и само поле во вкладке Управление отображением.
Теперь мы можем использовать токен со значением этого поля в сообщении о завершении заказа (должен быть включен модуль Token):
Your order number is [commerce-order:order-number]. You can view your order by this <a href="[site:url]order/[commerce-order:field_order_code]">link</a>.
И в шаблоне письма:
Thanks for your order [commerce-order:order-number] at [site:name].
You can find the status of your current order at this <a href="[site:url]order/[commerce-order:field_order_code]">page</a>.
Please contact us if you have any questions about your order.
Страница просмотра заказа
Самое время сделать вьюху, на которую будет вести наша секьюрная ссылка.
Добавляем новое представление для Commerce Order типа Заказ (Order).
Путь (Path): order/%
(такой же адрес должен быть в шаблонах сообщений).
Формат отображения (Display format):
Неформатированный список с полями (Unformatted list of Fields), хотя это не принципиально.
Добавляем контекстный фильтр по нашему полю:
Commerce Order: Order code.
В настройках этого фильтра, при отсутствии значения надо выбрать:
Вывести текст Ничего не найдено (Display contents of "No results found")
и убрать Значение исключения (Exception value), чтобы пользователь не смог смотреть все заказы. При желании, можно добавить соответствующее сообщение в раздел Поведение при отсутствии результатов.
Добавляем необходимые поля, у меня это были:
Commerce Order: Order status, Commerce Order: Line items и Commerce Order: Order total.
Поле Commerce Order: Order ID уже было по умолчанию.
Чтобы игнорировать проверку прав нужно в настройках запроса (Query options) выключить перезапись SQL (Disable SQL rewriting). Если вы добавляли поле Commerce Order: Line items, то такое же действие надо будет сделать для представления Line items.
В результате получилась довольно информативная страница. К сожалению, в "крошках" все равно остается лишний пункт от значения исключения. Но, так как, в моем случае, у меня был установлен модуль Path Breadcrumbs, избавиться от этого пункта было несложно.
Итог
Вот так, в несколько тычков, и практически без кода, мы облегчили жизнь пользователям магазина. А сами еще раз убедились, что вьюхи — это сила, да прибудет с вами она!
Сделал так все работает, но при добавлении товара в корзину появляется нотис:
Notice: Undefined offset: 0 в функции eval() (строка 1 в файле /home/user/public_html/shop/sites/all/modules/computed_field/computed_field.module(394) : eval()'d code)
. В какую сторону копать хзЕсли мне не изменяет память, то такой нотис был и у меня, но решения я так и не нашел, а просто убрал отображение нотисов на боевом сайте.
Хотя у модуля Computed Field много похожих issues, можно поискать решение там.
да я тоже остановился на скрытом нотисе, по багтрекеру не нашел решения. Там в настройках поля есть галка связанная с индексом, но она заблокирована после наполнения таблиц. Так что пусть так будет
Вот вопросик. Сайт мультиязычный. Хочу после завершения оформления заказа анонимным пользователем с помощью правила слать письмо с подтверждением заказа. Но логично чтобы письмо приходило на языке пользователя, а где его взять у анонимного пользователя?
Думаю, что логично было взять текущий язык странички оформления заказа. Но как именно это сделать сходу не скажу. Возможно в заказе он уже и так присутствует.
Здравствуйте! Очень интересно, хочу попробовать сделать у себя, только вот не пойму а в каком месте покупатель вводит свой имейл? Тоесть это какое-то специальное поле на прикрутить в форму заказа?
Да, к сущности "Заказ" надо добавить поле типа E-mail (модуль Email Field).
Возможно, в зависимости от движка магазина, оно уже будет в том или ином виде, точно не помню. Главное, чтобы поле было у заказа, а не у пользователя.
Спасибо за статью! Подскажите, пожалуйста, а как вернуть пользователя на страницу с инфой о заказе после оплаты? У меня работает ваш метод до момента пока не внедряется система оплаты. В системе оплаты нельзя загнать ссылку с динамическими токенами.
Рад, что статья оказалась полезной.
Обычно, при переходе к оплате, системе оплаты отправляется адрес "колбэк" страницы, и по завершении процесса система оплаты перенаправляет туда пользователя, при этом, тем или иным образом, еще и передается информация о статусе оплаты.
Если система оплаты интегрирована с помощью модуля интеграции, то об этой страничке, как правило, заботится сам модуль.
Если переход к оплате осуществляется каким-то иным способом, то такую страничку можно создать самому. В общих чертах действия могли бы быть такими:
Возможно, я смог бы подсказать конкретнее, если бы представлял как работает взаимодействие с системой оплаты.
Ого!!! я не ожидал получить ответ, так как статья от 13го года)) Спасибо вам за оперативный ответ и за исчерпывающее решение!
В 13-м году ответ, скорее всего, был бы другой :) В Drupal 7 не было контроллеров в том виде, в котором они есть в актуальных версиях. И это существенно упрощает задачу.
Удачи!
Вы - супер человек! Спасибо что отвечаете! Не подскажите, где можно почитать про контролеры у D7?
В Drupal 7 нет контроллеров, вместо них
hook_menu
+hook_page
. Если честно, погружение в бэкэнд для меня началось с Drupal 8, так что в этом я могу ошибаться, но я бы начал с этого.