Итак, дошел до работы с инвайтами и в данный момент занят их реализацией.
Итак. Сразу после включения я решил сделать инвайт, зашел в базу и увидел там следующие поля:
invite_id — ясно
invite_owner — вроде как владелец инвайта… ок
invite_grantee — вот это не ясно и я не нашел где используется
invite_added — время выдачи инвайта
invite_used — использован ли инвайт?
invite_code — Ну и собственно сам код инвайта
Этого вполне хватает для генерации инвайта.
Далее возникла сложность в том, что регистрация вообще не завершается. Вводишь инвайт, все заполняешь, но в результате снова получаешь форму, без какого либо результата. Пользователь так и не регистрируется. То есть даже не попадает в таблицу ожидания активации.
Ошибка кроется здесь похоже (
modules\registration\index.action.php (111)):
if (isset($_SESSION['is_grantee'])) {
$oUser->setId($_SESSION['is_grantee']);
$oUser->setActivateKey(md5($_POST['reg_login'].date('Y-m-d H:i:s').$_SESSION['is_grantee']));
}
$_SESSION['is_grantee'] содержит ID приглашения, но здесь происходит попытка задать ID пользователя равным ID приглашения… если я правильно понял. Более правильным будет задать номер приглашения по которыму пришел пользователь. Для этого меняем код на:
if (isset($_SESSION['is_grantee'])) {
$oUser->setInviteId($_SESSION['is_grantee']);
$oUser->setActivateKey(md5($_POST['reg_login'].date('Y-m-d H:i:s').$_SESSION['is_grantee']));
}
После этой замены пользователь таки проходит регистрацию и попадает в таблицу temp. То есть требуется активация. И письмо уходит. Но! Форма регистрации по прежнему показывается пользователю. Никаких сообщений нет. В коде по идее есть условие, что если письмо отправилось, то происходит переход на страницу
/registration/completed/, но похоже оно не выполняется…
UPD: Это происходит из-за небольшой ошибки в файле
completed.action.php. Там происходит проверка:
if (isset($_SESSION['grantee_registered'])) {
unset($_SESSION['grantee_registered']);
} else {
header('Location: '.System_Router::getPathWeb().'/registration/');
}
А нужно:
if (isset($_SESSION['registered'])) {
unset($_SESSION['registered']);
} else {
header('Location: '.System_Router::getPathWeb().'/registration/');
}
И все станет работать!
Второй косяк — приглашение так и остается активным. То есть по нему может зарегистрироваться еще туча посетителей.
Для исправления я поменял код:
if (isset($oUser)) {
$oSmarty->assign('registration_form_data', $aUser);
}
На следующий:
if (isset($oUser) and !$_SESSION['registered']) {
$oSmarty->assign('registration_form_data', $aUser);
} elseif($_SESSION['registered']) {
require_once('system/mappers/invites.mysql.mapper.php');
$oInvitesMapper = new Invites_MySQLMapper(System_Database::getInstance());
if ($oInvite = $oInvitesMapper->findById($_SESSION['is_grantee'])) {
$oInvite->setUsed(date('Y-m-d H:i:s'));
$oInvitesMapper->update($oInvite);
}
}
Так приглашения погашаются.
UPD: Еще один момент, у меня тут ошибки стали появляться при активации. Нужно исправить в файле
activation.action.php (46):$oInvitesMapper->save($oInvite);
на
$oInvitesMapper->update($oInvite);
Неужели больше никто не возился с этим?
еще вот такую ситуацию можно обыграть: человек прокачал рейтинг, заработал инвайтов, использовал их сам, прокачал им рейтинг, у него теперь целая армия по прокачке рейтинга))
а тут не проявил себя — не получил ни...))
в общем не поймите меня неправильно…
Правда там есть ошибка в том, что вызывается метод save, а не update. Я в сообщение добавил что и как исправлять. На фоне этого дела получается, что ошибка-то всего в одном месте — в файле completed.action.php. Я уже не буду это проверять, но рекомендую попробовать.
Выложу наверно скоро, выужу только все файлы. :)
Я вот в этой части что-то никак не могу придумать справедливый механизм.
Количество доступных приглашений равно карма — количество сгенеренных приглашений.
Админ может посылать любое число приглашений.
Вот так если коротко.
Отключить? Да, можно - удалив из меню и убив модуль community вместе со всеми маперами и сущностями, имена которых начинаются на community )
На деле не посмотрел еще вашего решения (www.artima.ru/invites.zip — битая ссылка). Как происходит отправка приглашения?
На деле было бы приятно видеть не список доступных инвайтов на соответствующей странице, а просто пару полей для имени приглашенного и его мыла. Человеку приходит сообщение от адресата==пользователю его пригласившего.
В письме ссылка на сайт с вбитым в нее (get'ом напр.) кодом приглашения. Новый пользователь регистрируется на интересном сайте, а тот, что его пригласил получает +1 к карме (или еще что-нидь, конфетку например).
спасибо за ответ.
Сожалею, но продолжать не буду это дело, так как перевел проект на ЛС :-)
Но решение рабочее вполне и должно до сих пор работать. Сейчас честно говоря могу и не найти уже. Последнюю версию я вроде SP давал.
Покажи свой проект, если он у тебя в сети, please.
Написать комментарий