Рецепт добавления поля в диалог регистрации пользователя
Сегодня ко мне обратились за помощью с вопросом добавления поля в диалог регистрации. Задача оказалась не тривиальна и показательна, так как хорошо показывает его архитектуру, поэтому хочу поделиться с сообществом процедурой ее решения.
Постановка задачи: необходимо добавить в форму регистрации пользователя поле «Имя пользователя» из его, пользователя, профиля.
Задача решается последовательно в несколько шагов:
Шаг 1. Добавление текстовки в языковой файл.
Шаг 2. Добавление поля в форму регистрации.
Шаг 3. Добавление правила валидации элемента.
Шаг 4. Обеспечение записи элемента при валидации.
Шаг 5. Доработка всплывающего окна с регистрацией.
Шаг 6. Доработка маппера.
Шаг 1.Добавление текстовки в языковой файл.
Языковой файл находиться в templates\language\, russian.php – для русского языка и English.php для английского. В файлы, в раздел текстовок регистрации внесем следующие строки:
Эти строки будут использоваться для указания заголовка поля на форме, всплывающей подсказки поля и текста ошибки, в случае неправильного его заполнения.
Шаг 2. Добавление поля в форму регистрации.
Для добавления поля в форму регистрации необходимо в файл templates/skin/ тема/actions/ActionRegistration/index.php в html-форму добавить следующий код поля:
В итоге получим:
Шаг 3.Добавление правила валидации элемента.
В список полей валидации метода EventAjaxValidateFields() в classes\actions\ actionRegistration.class.php добавляем:
Правила валидации элементов формы регистрации описаны в файле: user.entity.class.php в самом его начале добаляем еще правило:
и метод валидации:
Шаг 4. Обеспечение записи элемента при валидации.
В метод EventAjaxRegistration() в classes\actions\actionRegistration.class.php в раздел «Заполняем поля (данные)» добавляем:
Шаг 5. Доработка всплывающего окна с регистрацией.
Для того, что бы обеспечить регистрацию через всплывающее окно, а не только через страницу с регистрацией необходимо внести изменения в файл шаблона window_login.tpl. Повторите над этим файлом Шаг 2.
Шаг 6. Доработка маппера.
Если посмотреть на экшен регистрации – метод EventAjaxRegistration, то видно, что запись данных пользователя производиться в строке if ($this->User_Add($oUser))… методом объекта User. В этом методе добавление данных о пользователе производиться с помощью метода Add маппера модуля User. В маппере приведем запрос к виду:
Постановка задачи: необходимо добавить в форму регистрации пользователя поле «Имя пользователя» из его, пользователя, профиля.
Задача решается последовательно в несколько шагов:
Шаг 1. Добавление текстовки в языковой файл.
Шаг 2. Добавление поля в форму регистрации.
Шаг 3. Добавление правила валидации элемента.
Шаг 4. Обеспечение записи элемента при валидации.
Шаг 5. Доработка всплывающего окна с регистрацией.
Шаг 6. Доработка маппера.
Шаг 1.Добавление текстовки в языковой файл.
Языковой файл находиться в templates\language\, russian.php – для русского языка и English.php для английского. В файлы, в раздел текстовок регистрации внесем следующие строки:
'registration_profile_name' => 'Ваше имя',
'registration_profile_name_notice' => 'Введите Ваше настоящее имя',
'registration_profile_name_error_used' => 'Поле с именем должно быть заполнено',
Эти строки будут использоваться для указания заголовка поля на форме, всплывающей подсказки поля и текста ошибки, в случае неправильного его заполнения.
Шаг 2. Добавление поля в форму регистрации.
Для добавления поля в форму регистрации необходимо в файл templates/skin/ тема/actions/ActionRegistration/index.php в html-форму добавить следующий код поля:
<p><label for="popup-registration-profile-name">{$aLang.registration_profile_name}</label>
<input type="text" name="profile_name" id="popup-registration-profile-name" value="{$_aRequest.profile_name}"
class="input-text input-width-300 js-ajax-validate"/>
<i class="icon-ok-green validate-ok-field-login" style="display: none"></i>
<i class="icon-question-sign js-tip-help" title="{$aLang.registration_profile_name_notice}"></i>
<small class="validate-error-hide validate-error-field-profile_name"></small>
</p>
В итоге получим:
Шаг 3.Добавление правила валидации элемента.
В список полей валидации метода EventAjaxValidateFields() в classes\actions\ actionRegistration.class.php добавляем:
case 'username':
$oUser->setProfileName($sValue);
break;
Правила валидации элементов формы регистрации описаны в файле: user.entity.class.php в самом его начале добаляем еще правило:
array('profile_name', 'profile_name_exists','on'=>array('registration')),
и метод валидации:
public function ValidateProfileNameExists($sValue,$aParams) {
if (trim($sValue) != '') {
return true;
}
return $this->Lang_Get('registration_profile_name_error_used');
}
Шаг 4. Обеспечение записи элемента при валидации.
В метод EventAjaxRegistration() в classes\actions\actionRegistration.class.php в раздел «Заполняем поля (данные)» добавляем:
$oUser->setProfileName(getRequest('profile_name'));
Шаг 5. Доработка всплывающего окна с регистрацией.
Для того, что бы обеспечить регистрацию через всплывающее окно, а не только через страницу с регистрацией необходимо внести изменения в файл шаблона window_login.tpl. Повторите над этим файлом Шаг 2.
Шаг 6. Доработка маппера.
Если посмотреть на экшен регистрации – метод EventAjaxRegistration, то видно, что запись данных пользователя производиться в строке if ($this->User_Add($oUser))… методом объекта User. В этом методе добавление данных о пользователе производиться с помощью метода Add маппера модуля User. В маппере приведем запрос к виду:
public function Add(ModuleUser_EntityUser $oUser) {
$sql = "INSERT INTO " . Config::Get('db.table.user') . "
(user_login,
user_profile_name,
user_password,
user_mail,
user_date_register,
user_ip_register,
user_activate,
user_activate_key
)
VALUES(?, ?, ?, ?, ?, ?, ?, ?)
";
if ($iId = $this->oDb->query($sql, $oUser->getLogin(), $oUser->getProfileName(), $oUser->getPassword(),
$oUser->getMail(), $oUser->getDateRegister(), $oUser->getIpRegister(), $oUser->getActivate(),
$oUser->getActivateKey())) {
return $iId;
}
return false;
}
63 комментария
Но, остался еще один нераскрытый вопрос… Как добавить дополнительное поле в настройки профиля, чтобы в конечном итоге при редактировании выводить это поле в профиле, что-то типо поля «О Себе»?.. Помогите, если не трудно
В таблицу базы данных добавляем нужное поле, пусть это будет: fishing_spot – любимое место рыбалки пользователя. Добавление поля реализуем любимым способом – через phpmyadmin или так (здесь нужно быть осторожным и делать это только на резервной базе…):
Далее маппер
В маппере пользователя User.mapper.class.php редактируем метод
так, что бы он работал и по полю user_fishing_spot, аналогично шагу 6 статьи. Здесь, для корректного исполнения необходимо использовать метод $oUser->getFishingSpot(), который еще не реализован.
Геттеры и сеттеры
Для сущности User.entity.class.php реализуем сеттеры и геттеры по полю, аналогичные методам работы по полю about:
Настройки
В настройки actions/ActionSettings/profile.tpl добавим поле:
Профиль
В профиль actions/ActionProfile/whois.tpl добавим поле:
Текстовки
В файл текстовки, так же как и в шаге 1, добавим:
Обработка формы
Обработка формы реализуется в методе EventProfile() экшена settings в файле ActionSettings.php. там после проверки поля about добавим:
Результат
Понял так, что нужно зайти в пхпМАЙадмин, и ручками найти таблицу user и добавить? Простите за нубский разговор, я пока только начинаю )
Попробую — отпишусь…
Подскажите пожалуйста, что мне делать? =(
Может быть здесь: проверьте количество знаков? в VALUES(?, ?, ?, ?, ?, ?, ?, ?) — оно должно совпадать с количеством полей.
По аналогии, можно создать поле «Ваша фамилия», вместо profile_name поставить везде profile_surname?
Буду пробовать, отпишусь о результатах…
При заполнении всех полей когда нажимаеш регистрацию анимация идет бесконечно.
Может еще есть место где могла так повлиять ошибка?
Отключил Extended registration, Профессии в профиле. При заполнении Имени и Фамилии всеравно пишет снизу что должно быть заполнено. Но галочка зеленая.
Нажимаю, анимация проходит очень быстро, но дальше нечего не происходит. Так и стоит, уже без анимации.
Установил Mozillу, подключил плагин. Мне там все непонятно)
На Yotube-e, отдельным файлом (качество лучше).
Может кто разбирается сможет увидет ошибку
Благодаря Andreyv
1 — Для того, чтобы не делать поле обязательным, нужно просто пропустить 3 и 4 пункты?
2 — Могу ли я в базе данных по аналогии других полей создавать свои аналогичные? Например поле Пол, добавить поле по аналогии, прописать свои значения, включить в маппер и вывести в профиле?
3 — Есть плагин Профессии, могу ли я также дописать его, чтобы появились дополнительные поля, но уже в плагине? Действовать так же как вы описывали, т.е. создавать поля в таблице плагина? (если такова имеется)
4 — Таким же способом я могу создать дополнительное поле в топике, например «Ссылка на ситочник:»? Если да, то в как таблице добавлять дополнительные поля?
2 — Да, смотрите в комментариях выше, там подробно описано добавление произвольного поля. После его создания можно выносить в форму регистрации.
3 — Я не смотрел этот плагин, поэтому ничего определенного сказать не могу.
4 — Да, но работают другие объекты, мапперы, сущности, шаблоны, а ход работы такой же.
в языковом файле же есть три переменные: profile_sex, profile_sex_woman и profile_sex_man… к чему я это все? К тому, что хочу создать аналогичное поле типа ПОЛ, только вот не знаю, где привязать и обозвать эти переменные. К примеру, хочу сделать цвета: белый, черный, красный… в phpMyAdmin создаю новое поле со свойствами: enum('white', 'black', 'red'). А теперь, где мне этим названиям задать переменные color_red, color_black и color_red? В языковом файле можно задать перевод, а где привязать все это? Надеюсь вы меня правильно поняли =)
Хотя, спрашиваю я не у него лично, а у сообщества, получается знает это только andreyv , или другие просто не хотят в лишний раз помогать новичкам? :)
Там и задается вывод строк. Почитайте где нибудь про элементы формы: select это такой элемент, который содержит набор других html-элементов — option. Этот самый option содержит текстовку, отображаемый пользователю и атрибут value, который соответствует текстовке. На сервер, при отправке формы, попадает выбранное значение value, которое соответствует имени селекта. И все. остальное по мануалу. В шаге 2, в статье, Вы добавляете не input, а select.
После того как делаю второй пункт изменений не видно. «В итоге получим» все так же.
Странно, хотя у меня стандартный шаблон по адресу ActionRegistration/index.php файл с разрешением не .php а tpl, может из-за этого? Вот видео как делал. Подскажите пожалуйта!
Можеш мешают плагины Extended registration и Профессии в профиле? Хотя и их временно отключал. Уже совсем не знаю что делать
В «Шаге 6. Доработка маппера» непонятно куда добавить или что изменить…
Фото
Но кажется появилось в другом месте. Не помню, но вроде здесь раньше не было такого.
На фото показан Шаг 5.
andreyv, спасибо Вам!
andreyv, спасибо Вам за мануал — уверен, он мне пригодится чуть позже, когда решу какие поля сделать обязательными при регистрации. Но сегодня у меня стоит немного другая задача.
Подскажите — как добавить в форму регистрации текст «правил» или ссылку на «правила»?
при этом хотелось бы сделать обязательным отметку «галочки» о том что правила прочитаны.