5 июня 2013 | MODx
Активация пользователя (подтверждение регистрации) в MODx
Доброго всем времени. Создавал достаточно крупный магазин на MODx и встала передо мной задача организовать активацию пользователя после регистрации. Очень уж необходимо было, чтобы пользователь сначала зарегистрировался на сайте и ему пришло письмо на почту со ссылкой активации. И пока он не перейдет по этой ссылке, личный кабинет оставался бы не активированным. К большому сожалению в modx вообще никак не предусмотрена подобная возможность. Хотя и можно понять разработчиков, в большинстве случаев владельцы сайтов предпочитают избегать излишне сложной процедуры регистрации на сайте (разве что за исключением форумов), а тут вот принципиальная задача. Никаких средств в самом MODx нет для этого, но спасает то, что есть галочка блокировки — ее то как раз и можно использовать по полной программе для реализации. Вообще в целом для MODx Evolution есть два основных и очень подходящих сниппета личного кабинета — это WebSignup (WebLogin) и WebLoginPE. В сети к большому сожалению нет ни одного полноценного решения данной задачи. Есть только предложения использовать встроенную активацию (точней это восстановление пароля) WebLoginPE, что мне кажется совершенно неправильным. Единственное худо-бедное решение описано здесь. Но к сожалению оно совершенно не годится, так как самописные сниппеты применяют блокировки и разблокировку для всех пользователей, у которых не было еще ни одной авторизации, а таких одновременно может быть много и то, что они друг друга будут разблокировать — это совершенно не по-хозяйски)
Поэтому я решил на основе этого решения разработать свою версию решения проблемы, теперь уже полноценного решения, где каждый пользователь будет подтверждать (блокировать и разблокировать) только сам себя и никого больше.
Итак за основу я беру сниппет WebLoginPE и его чуть допилю + создадим еще 1 сниппет (вместо двух, предложенных автором ссылки). Имеется страница Регистрация, на ней вызван сниппет:
[!WebLoginPE? &type=`register` ®isterSuccessTpl=`LoginFormTpl` &groups=`Registered Users` &lang=`ru` ®Required=`email,username,fullname,password` ®isterTpl=`RegisterInstantFormTpl`!]
При регистрации нового пользователя нам необходимо сразу заблокировать пользователя, для этого придется влезть в запрос базы данных сниппета /assets/snippets/webloginpe/webloginpe.class.php и заменить код (у меня строчка 613-616):
$newUserAttr = "INSERT INTO ".$web_user_attributes. " (internalKey, fullname, email, phone, mobilephone, dob, gender, country, state, zip, fax, photo, comment) VALUES". " ('".$key."', '".$fullname."', '".$email."', '".$phone."', '".$mobilephone."', '".$dob."', '".$gender."', '".$country."', '".$state."', '".$zip."', '".$fax."', '".$photo."', '".$comment."')"; $insertUserAttr = $modx->db->query($newUserAttr);
следующим кодом:
$newUserAttr = "INSERT INTO ".$web_user_attributes. " (internalKey, fullname, blocked, email, phone, mobilephone, dob, gender, country, state, zip, fax, photo, comment) VALUES". " ('".$key."', '".$fullname."', '1', '".$email."', '".$phone."', '".$mobilephone."', '".$dob."', '".$gender."', '".$country."', '".$state."', '".$zip."', '".$fax."', '".$photo."', '".$comment."')"; $insertUserAttr = $modx->db->query($newUserAttr);
то есть добавляем новое изменение для только что зарегистрировавшегося пользователя. Проверяем. Вуаля! Работает, при регистрации пользователю сразу же ставится блокировка и авторизоваться он не может, не смотря на то, что зарегистрирован.
Теперь не менее сложная задачка, нужно заставить пользователя активировать именно его личный кабинет по ссылке или, другими словами, по ссылке снять блокировку. Для этого в любом случае потребуется создать новую страницу Активация, у которой для большего подобия делаем url в виде «/jnc892ey7gt5kv920yhf». В содержимое необходимо вставить сниппет [!activate!] со следующим содержимым:
<?php $table = $modx->getFullTableName("web_user_attributes"); $id = $_GET['id']; $resultq = $modx->db->update("blocked=0", $table, "id=$id"); echo $name; ?>
Это и есть тот самый волшебный запрос, который будет снимать блокировку у конкретного пользователя. Запрос GET нужен, чтобы взять id пользователя из url. Но в url у нас ведь пока совершенно ничего нет. Но ничего страшного, сейчас мы его сделаем в отправляемое при регистрации письмо. Заходим в инструменты-конфигурацию-вкладка «пользователи», ищем пункт «Регистрация веб-пользователя: » и вставляем там нашу волшебную ссылку активации
Для активации своего аккаунта пройдите по ссылке [+surl+]/jnc892ey7gt5kv920yhf?id=[+id+]
Вот он тот самый ID пользователя, который при клике по ссылке передастся в GET. Но опять беда, такого плейсхолдера просто нет. Что ж, придется еще раз допились сниппет WebLoginPE. В файле /assets/snippets/webloginpe/webloginpe.class.php после строчки (№672):
$siteURL = $modx->config['site_url'];
добавим
$usId = $modx->db->getInsertId();
Теперь еще 3 вставки для создания плейсходера нового. После строчки (№680):
$message = str_replace('[+surl+]', $siteURL, $message);
добавляем
$message = str_replace("[+id+]", $usId, $message);
После строчки (№714):
$notification = str_replace('[+uem+]', $email, $notification);
добавляем
$notification = str_replace("[+id+]", $usId, $notification);
И последнее, после строчки (№1657):
$message = str_replace("[+surl+]", $url, $message);
добавляем:
$message = str_replace("[+id+]", $usId, $message);
А вот и всё. Теперь все работает. Ссылка присылается в виде сайт.ру/jnc892ey7gt5kv920yhf?id=24, где 24 — это id пользователя в базе данных. После перехода по ссылке блокировка пользователя снимается и он может свободно заходить в свой кабинет. Не считаю себя очень уж программистом, но этот метод работает безупречно. Если будут какие-то дополнения/комментарии обязательно пишите. Думаю, точно по такому же принципу можно организовать активацию пользователя (подтверждение регистрации) в MODx и через сниппет WebLogin. Всем удачи!)