[Решено] D7/DC: Шифрованные url'ы для анонимного просмотра заказов

Тип материала: 
Версия Drupal: 
Ключевые слова: 
Модули и темы: 
Чт, 08/08/2013 - 20:23

Дано: D7, DC. Анонимные пользователи могут оформлять заказы, аккаунты для них не создаются.
Задача: отдавать уникальный секретный url для просмотра заказа на сайте, по завершению оформления заказа и в письме. При этом, доступа к просмотру заказов по обычным url'ам (вида user/*/orders/*) у анонимов быть не должно.
Как я себе это представляю: специальная страничка (например order/*), которая берет аргумент (например 45874935), ищет соответствующий ему заказ и выводит в обход прав доступа. Еще нужно протащить токен url'а в сообщение о завершении заказа и шаблон письма.
Подcкажите, пожалуйста, куда копать?
В идеале, конечно, было бы скрутить такой функционал каким нибудь готовым модулем(ями), но, похоже, понадобится и бубен и рашпиль. Так же рассматриваю вариант проспонсировать написание модуля.

Еще пришла мысль делать сами номера заказов 6-значными, рандомно, и дать анонимам право просмотра всех заказов. Все же секьюрнее, чем по порядку. Нагуглил хук для этого - hook_commerce_order_insert(). В принципе тоже приемлемый вариант, но не повлечет ли это за собой других негативных последствий?

0 Спасибо

Комментарии

Аватар пользователя sas@drupal.org
3 года 7 months назад sas@drupal.org #

Можно сделать страничку в своем модуле, которая будет показывать заказ, на нее передовать номер заказа как token, token скручивать например через base64_encode. А почему не подходит авторегистрация - у юзверя намного больше удобства и уже все работает ?!

0 Спасибо
Аватар пользователя multpix
3 года 7 months назад multpix #

плохая идея имхо
сделать можно, но не приживется.

0 Спасибо
Аватар пользователя imarat
3 года 7 months назад imarat #

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

0 Спасибо
Аватар пользователя paulanders
3 года 7 months назад paulanders #

Спасибо за ответы.
Понравились оба варианта, но решение с вьюхой, по-моему, элегантнее. Попробую сначала его.

"А почему не подходит авторегистрация..."
Авторегистрация не проблема, авторизация - вот проблема. Для этого проекта это просто лишний шаг, так как тут она нужна только, чтоб посмотреть страницу с заказом. Вот я и подумал, что процесс идентификации пользователя можно свести к переходу по ссылке на эту самую страницу.
Кстати похожим образом работает мобильный посадочный талон, при самостоятельной регистрации на рейс, или электронный билет на Аэроэкспресс в Москве. Это шифрованная ссылка на страничку с QR кодом. Нет особой надобности всех подряд регистрировать. И в моем случае тоже. Так что может и прижился бы такой модуль.

0 Спасибо
Аватар пользователя paulanders
3 года 7 months назад paulanders #

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

  1. В поле Commerce Order: Line items, список товаров для анонима все равно не показывается (пишет "Позиции заказа не найдены."). Все остальные поля выводятся. Для админа список выводится как надо.
  2. Не нашел как переопределить заголовок страницы, чтоб там писался еще и номер заказа.
  3. В крошках зачем-то создается ссылка order/all, на ней выводятся все товары, не пойму как ее убрать.

Ну и конечно же с меня пиво, если будете на DrupalCamp CIS в Москве, то с удовольствием вас отблагодарю.

0 Спасибо
Аватар пользователя PVasili
5 дней 16 часов назад PVasili #

Андрей, для  Computed Field вроде есть сниппет, который генерирует правильный рандом. Но там какое-то шаманство нерабочее :).
Я прописал проще, чтобы не отключать нотисы:

<?php
if(!isset($entity_field[0]['value'])) {
  
$entity_field[0]['value'] = rand(1000000099999999);
}
?>

1) Анонимам в Order -> "Просматривать любой Заказ заказ" дай разрешение. Вроде как оно больше ни где не даст ломиться к чужим.
В Views, заказы, с хитрым URLом для анонима, можно выводить только со статусом в "В ожидании", чтобы вечно они не висели..
Я Views лепил от Заказ рефер. Поле заказа рефер. Товар рефер Материал. Ну а админу красиво можно в верхний колонтитул ещё блочный views от шапки заказа добавить.

2. Сделай URL c 2-мя аргументами адрес/номер_заказа/рандом_число по %1 получай и используй номер заказа. Дополнительно ещё защита будет.

3)  Path Breadcrumbs - сделай всё правильно им.

[#1]1[/#] [##1]1[/##]

1 Спасибо
Аватар пользователя paulanders
6 дней 5 мин. назад paulanders #

Что-то подобное я в итоге и сделал. Вот более полная статья https://iamdroid.net/blog/anonymous-orders
Тогда 3,5 года назад просто было мало опыта, впоследствие же я не раз применял этот навык на многих проектах.

0 Спасибо
Аватар пользователя Andruxa
5 дней 13 часов назад Andruxa #

А теперь читаем, думаем.

0 Спасибо