Извлечение второе, или ПРАВИЛьный подход

09.12.2012

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

То есть, более подробно, процесс выглядит следующим образом.

Для пользователя:

  1.     Аноним пишет на сайте объявление.
  2.     Сразу оно в списке не появляется, он должен подтвердить подлинность указанного e-mail.
  3.     На этот e-mail ему приходит письмо со ссылкой, пройдя по которой, он тем самым опубликовывает объявление.

Для админа сайта:

  1.     Аноним создает объявление, оно не публикуется.
  2.     Создаём нового юзера с именем user[Номер_ноды]. Если такой e-mail уже присутствовал в списке пользователей, юзер не создаётся.
  3.     На e-mail юзера отправляется письмо с персональной спецссылкой на синоним благодарственной страницы. По номеру в этой ссылке определяется номер ноды, которую нужно опубликовать.
  4.     Нода опубликовывается в тот момент, когда посещается эта ссылка. После использования синоним удаляется и ссылка больше недействительна.

    
Теперь опишем реализацию этой модели. Построена она, естественно, на основе предыдущей статьи, использует тип ноды "Объявление", которое описано там. Помимо введенного правила advert_rule появляется новое правило confirm_rule, проверяющего заход на станицу со специальным синонимом. И само advert_rule усложняется, теперь оно выглядит так:

Правило по прежнему имеет тип "После сохранения нового контента", его условная часть не изменилась и срабатывает, если создаётся новая нода типа "Объявление" анонимным пользователем. А вот исполнительная часть значительно усложнилась.


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


Под номером 2 идёт создание строковой переменной username, в ней будет храниться логин пользователя, поместившего объявление. Изначально присваиваем ей значение "none", в данном случает этот текст не имеет значения.


Номером третьим идет ключевой момент нашего действия - "Выполнение PHP-кода". Этот код ищет в таблице users пользователя, имеющего такой же e-mail, как и указанный при заполнении объявления. Если это новый пользователь, то к этому моменту он уже присутствует в таблице, благодаря первому пункту исполнительной части. Если такой пользователь уже ранее оставлял объявления (и, соответственно, свой e-mail), то первый пункт не сработает, а имя будет найдено в users. Так или иначе, найденный логин помещается в созданную во втором шаге переменную username. Для того, чтобы значение переменной сохранилось в скрипте, необходимо использовать не простое присваивание, а "Intelligent saving", т.е.
    return array("variable" => $variable);


Четвёртым шагом загружаем объект пользователя по найденному логину.


Пятый шаг - устанавливаем автора вновь созданного объявления на загруженного на предыдущем шаге.


На шестом шаге создаём для объявления персональный синоним. Я выбрал confirm/advert[node:nid]. Идея в том, чтобы внутри синонима обязательно присутствовал номер ноды, остальные компоненты можно выбирать по собственному вкусу.


Отправляем письмо пользователю на седьмом шаге. Внутри помещаем только ссылку на созданный специальный синоним.


Последним, восьмым, шагом переадресовываем пользователя на страницу с пояснениями о том, что дальнейшие инструкции высланы ему на e-mail. Без переадресации он автоматически попадёт на своё неопубликованное объявление, к которому у него, как у анонима, нет доступа.

Второе правило


Второе правило предназначено для опубликования объявления. Для этого нужно проверить - пришёл ли пользователь по ссылке-синониму и если да, то определить из неё номер ноды, которую нужно опубликовать.


Первое условие - проверяем URL, на который пришёл пользователь. Эту возможность даёт дополнительный модуль Path Rules, который нужно установить и включить. Нужно, чтобы URL начинался с "confirm/advert".


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


Первым шагом в действиях создаём числовую переменную, в которую при помощи substr "выкусываем" из синонима номер ноды.


Загружаем объект ноды по найденному номеру...


...и опубликовываем.


И напоследок удаляем отработавший синоним.

Не стоит забывать, что указанный алгоритм разработан для Drupal 6.x, для семёрки даже php-скрипт, выбирающий логин пользователя из таблицы users будет другим. Можно было бы ещё усовершенствовать работу по администрированию, добавив правило, удаляющее неопубликованные объявления, если их возраст, к примеру, больше недели. Ну, это не сложно, в случае чего добавим.



Комментарии

женя
23.09.2013

Здравствуйте, я извиняюсь за немножко наглый вопрос, но вы не подскажите, какой PHP код нужно использовать в drupal 7.

kwoqer
25.09.2013

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

женя
28.09.2013

Rules я настроил(регистрировать пользователя мне не надо), нужен лишь код для этого действия: "Первым шагом в действиях создаём числовую переменную, в которую при помощи substr "выкусываем" из синонима номер ноды"

буду признателен за помощь.

kwoqer
28.09.2013

Я думал, вы имеете в виду скрипт, выбирающий имя юзера по его е-мэйлу. Там для 7-ки отличаются названия функций работы с БД, насколько я помню. В этом же случае всё должно работать, это простые функции PHP. Задача этого кода - получить на входе строку "confirm/advertNNN", где NNN - номер созданной ноды-объявления и получить этот номер NNN, сохранив его в переменной. Этот код должен работать в любой версии. Мне чтобы ответить предметно, нужно разворачивать 7-ку,  настраивать Rules и всё остальное - это целое дело. Если хотите - давайте координаты сайта и админки, могу посмотреть. Пишите на kwoqer ( собака ) gmail.com

Добавить комментарий