Рецепт добавления поля в диалог регистрации пользователя

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

Постановка задачи: необходимо добавить в форму регистрации пользователя поле «Имя пользователя» из его, пользователя, профиля.
Задача решается последовательно в несколько шагов:
Шаг 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 комментария

avatar
Прекрасный мануал. Респект. Кто=то недавно тут искал, как вставить дополнительное поле в регистрацию. Вот хороший пример.
  • aex
  • 0
avatar
Угу автору огромнейшее спасибо…
avatar
поля в профиле так же можно добавлять?
avatar
Принцип везде один — взять данные из шаблона ввода, записать в базу, потом получить их оттуда и вывести в нужное место в шаблоне вывода.
avatar
Это понятно, но объясните новичкам, как правильно это сделать, чтобы сайт осался работоспособным… =)
avatar
andreyv спасибо огромное, вы просто супер!
Но, остался еще один нераскрытый вопрос… Как добавить дополнительное поле в настройки профиля, чтобы в конечном итоге при редактировании выводить это поле в профиле, что-то типо поля «О Себе»?.. Помогите, если не трудно
avatar
Так О себе там вроде уже есть такое поле. А чтобы сделать другое какое-то новое поле, так его сначала надо в таблицу user базы данных добавить, чтобы было куда значения записывать. Это надо идти в майданку и ручками его добавить в таблицу. Ну, а потом по-аналогии с вышеописанным.
avatar
Начнем с Базы данных
В таблицу базы данных добавляем нужное поле, пусть это будет: fishing_spot – любимое место рыбалки пользователя. Добавление поля реализуем любимым способом – через phpmyadmin или так (здесь нужно быть осторожным и делать это только на резервной базе…):
ALTER TABLE `prefix_user` ADD `user_profile_fishing_spot` TEXT NOT NULL


Далее маппер
В маппере пользователя User.mapper.class.php редактируем метод
Public  function Update(ModuleUser_EntityUser $oUser) {…..

так, что бы он работал и по полю user_fishing_spot, аналогично шагу 6 статьи. Здесь, для корректного исполнения необходимо использовать метод $oUser->getFishingSpot(), который еще не реализован.

Геттеры и сеттеры
Для сущности User.entity.class.php реализуем сеттеры и геттеры по полю, аналогичные методам работы по полю about:

public function setFishingSpot($data) {
    $this->_aData['user_fishing_spot'] = $data;
}
public function getFishingSpot() {
    return $this->_getDataOne('user_fishing_spot');
}


Настройки
В настройки actions/ActionSettings/profile.tpl добавим поле:
<label for="fishing_spot" style="margin-bottom: 7px">{$aLang.settings_profile_fishing_spot}:</label>
<textarea name="fishing_spot" id="fishing_spot" class="input-text input-width-full" rows="7">{$oUserCurrent->getFishingSpot()|escape:'html'}</textarea>


Профиль
В профиль actions/ActionProfile/whois.tpl добавим поле:
<h3>{$aLang.profile_fishing_spot}</h3>
    {if $oUserProfile->getFishingSpot()}
        <p>{$oUserProfile->getFishingSpot()}</p>
        {else}
        <p>{$aLang.profile_fishing_spot_empty}</p>
    {/if}


Текстовки
В файл текстовки, так же как и в шаге 1, добавим:
'settings_profile_fishing_spot' => 'Место рыбалки',
    'profile_fishing_spot' => 'Место рыбалки',
    'profile_fishing_spot_empty' => 'Не указано',


Обработка формы
Обработка формы реализуется в методе EventProfile() экшена settings в файле ActionSettings.php. там после проверки поля about добавим:
if (func_check(getRequest('fishing_spot'),'text',1,3000)) {
    $this->oUserCurrent->setFishingSpot($this->Text_Parser(getRequest('fishing_spot')));
} else {
    $this->oUserCurrent->setFishingSpot(null);
}


Результат
avatar
В самом начале в sql-запросе ошибка — должно быть так:
ALTER TABLE `prefix_user` ADD `user_fishing_spot` TEXT NOT NULL
avatar
Я бы все-таки посоветовал ему это сделать самому ручками в майданке, а не запросом, а то наломает дров :)
avatar
Да, с SQL-запросами так, не уверен не выполняй.)
avatar
сделать самому ручками в майданке — можно подробнее?
Понял так, что нужно зайти в пхпМАЙадмин, и ручками найти таблицу user и добавить? Простите за нубский разговор, я пока только начинаю )
avatar
Спасибо! Вы просто ЧУДО =)
Попробую — отпишусь…
avatar
Сделал все по инструкции, регистрация не работает, бегут «ползунки» и все…
Подскажите пожалуйста, что мне делать? =(
avatar
Не идет запись в базу данных. Ошибка в методе маппера (Шаг 6).
Может быть здесь: проверьте количество знаков? в VALUES(?, ?, ?, ?, ?, ?, ?, ?) — оно должно совпадать с количеством полей.
avatar
Урааа! Все заработало, вы прям экстрасенс, ей богу)))
По аналогии, можно создать поле «Ваша фамилия», вместо profile_name поставить везде profile_surname?
avatar
Это новое поле — его делать как в этом комментарии.
avatar
Понял шеф! Сейчас хочу добавить поле «Фамилия» и поле «Мои увлечения».
Буду пробовать, отпишусь о результатах…
avatar
Здравствуйте! У меня похожая ситуация, но данный метод не помог. Создал поле«Фамилия» по аналогии с именем, оно отображается.Создал в phpmyadmin поле surname. Вместо Name писал везде Surname. Количество знаков в VALUES(?, ?, ?, ?, ?, ?, ?, ?) правильное.
При заполнении всех полей когда нажимаеш регистрацию анимация идет бесконечно.

Может еще есть место где могла так повлиять ошибка?
avatar
скрины конечно не фонтан, но позволю предположить что уВас какието лишние символы в конце 38 строки.
avatar
Да, немного б пошире фото можно вставлять — было бы намного читабельнее. Скрин
avatar
38 строка знак равенства уберите
avatar
увы, не помогло
avatar
тогда смотрите что Вам говорит фаербаг
avatar
Не совсем понял, это же у тебя плагин расширенной регистрации, а ты какой маппер правишь?
avatar
этот classes\modules\user\mapper
avatar
Это ты поля добавил в расщиренную, поменял там все? А обычная тоже не срабатывает?
avatar
В плагин нечего не добавлял.
Отключил Extended registration, Профессии в профиле. При заполнении Имени и Фамилии всеравно пишет снизу что должно быть заполнено. Но галочка зеленая.
Нажимаю, анимация проходит очень быстро, но дальше нечего не происходит. Так и стоит, уже без анимации.
Установил Mozillу, подключил плагин. Мне там все непонятно)
avatar
Попытайся Имя и Фамилию латинскими буквами ввести.
avatar
так же само, закинул на видео vimeo, может немного лучше будет видно
avatar
Все пересмотрел — не нашел причину.Сначала сделал только поле «Имя» -работало полностью. Как добавил Фамилии — не хочет. Записал видео как все делал поэтапно.
На Yotube-e, отдельным файлом (качество лучше).
Может кто разбирается сможет увидет ошибку
avatar
Up. Все получилось!
Благодаря Andreyv
avatar
Все получается, добавил поле Фамилия, прописал ручками дополнительные поля в таблице _user (опции выставил по аналогии profile_name). Вообщем все работает, но у меня появились другие вопросы:

1 — Для того, чтобы не делать поле обязательным, нужно просто пропустить 3 и 4 пункты?
2 — Могу ли я в базе данных по аналогии других полей создавать свои аналогичные? Например поле Пол, добавить поле по аналогии, прописать свои значения, включить в маппер и вывести в профиле?
3 — Есть плагин Профессии, могу ли я также дописать его, чтобы появились дополнительные поля, но уже в плагине? Действовать так же как вы описывали, т.е. создавать поля в таблице плагина? (если такова имеется)
4 — Таким же способом я могу создать дополнительное поле в топике, например «Ссылка на ситочник:»? Если да, то в как таблице добавлять дополнительные поля?
avatar
1 — Только шаг 3.
2 — Да, смотрите в комментариях выше, там подробно описано добавление произвольного поля. После его создания можно выносить в форму регистрации.
3 — Я не смотрел этот плагин, поэтому ничего определенного сказать не могу.
4 — Да, но работают другие объекты, мапперы, сущности, шаблоны, а ход работы такой же.
avatar
в phpMyAdmin поле profile_sex имеет такое свойство: enum('man', 'woman', 'other')
в языковом файле же есть три переменные: profile_sex, profile_sex_woman и profile_sex_man… к чему я это все? К тому, что хочу создать аналогичное поле типа ПОЛ, только вот не знаю, где привязать и обозвать эти переменные. К примеру, хочу сделать цвета: белый, черный, красный… в phpMyAdmin создаю новое поле со свойствами: enum('white', 'black', 'red'). А теперь, где мне этим названиям задать переменные color_red, color_black и color_red? В языковом файле можно задать перевод, а где привязать все это? Надеюсь вы меня правильно поняли =)
avatar
Як мэд, так и ложкою :) Скоро человек для тебя весь сайт перепишет, ты ему хотя бы донайт сделай за труды :)
avatar
Обязательно сделаю, он мне очень помог, и помогает… Думаю, не только мне :)
Хотя, спрашиваю я не у него лично, а у сообщества, получается знает это только andreyv , или другие просто не хотят в лишний раз помогать новичкам? :)
avatar
Переформулирую последнюю фразу:… другие просто не хотят в лишний раз бесплатно помогать новичкам? :) За любой труд нужно платить, с удовольствием купил бы готовый плагин, но его к сожалению нет, приходится искать бескорыстных людей для помощи, а таких очень мало…
avatar
Ты ж студент, а студиозы должны не лениться, а учиться, и постигать науку не только вопрошениями и просьбами, но и изучением мануалов и уже полученных типовых примеров и подсказок :)
avatar
Если сравнить мои познания месяц назад и сейчас — разница ощутимая, благодаря добрым дяденькам из сообщества, которые реально помогают. Для этого и существует этот сайт, чтобы помогать новичкам, повышать свою квалификацию и делиться опытом, а не только плагины продавать, ведь так? Мануалами тоже пользуюсь, не без этого, но без этого сайта мое изучение растянулось бы на несколько месяцев, за что ему огромное спасибо, а в частности добрым и отзывчивым людям. Тем более, я же не даю пароли от фтп и не прошу все сделать за меня, я получил правильное направление и двигаюсь по правильному пути, просто для того, кто знает, это кажется легким занятием, для меня же наоборот, нужно понимать нас, новичков, а не критиковать и не давать пустых советов… Мы немного отклонились от темы, если у тебя есть дельные советы, претензии или просто хочется поговорить, пиши в ЛС, обсудим, а эту тему засорять не надо, она создавалась для новичков с четкими рекомендациями, а давать советы почитать мануалы, это по крайней мере не серьезно от такого человека как ты… Думаю, для твоего уровня знания Лайфстрита, эта тема расплюнуть, мог бы и написать что да как, а пишет почему то один andreyv , за что ему еще раз спасибо! Настанет и мое время, когда я займу «ваше» место, буду лепить плагины, помогать новичкам, когда нибудь это настанет, и я вспомню себя самого, и буду стараться помогать, реально помогать… Вспомни себя, когда ты начинал этот путь? Или ты сразу все знал? Тему считаю больше не актуальной, если тебе не нужна публика, и ты не хочешь самоутвердиться за счет новичка при всех, пиши в ЛС, поговорим… а тут, пологаю, буду ждать ответ от andreyv , больше реально некому помочь…
avatar
Смотрите, как пример, файл /ВАШАТЕМА/actions/ActionSettings/profile.tpl — страница настроек пользователя, Там и описан список выбора вариантов поля «Пол». Это поле реализовано обычным select вот так:
<dl class="form-item">
    <dt><label for="profile_sex">{$aLang.settings_profile_sex}:</label></dt>
    <dd>
        <select name="profile_sex" id="profile_sex" class="input-width-250">
            <option value="man" {if $oUserCurrent->getProfileSex()=='man'}selected{/if}>{$aLang.settings_profile_sex_man}</option>
            <option value="woman" {if $oUserCurrent->getProfileSex()=='woman'}selected{/if}>{$aLang.settings_profile_sex_woman}</option>
            <option value="other" {if $oUserCurrent->getProfileSex()=='other'}selected{/if}>{$aLang.settings_profile_sex_other}</option>
        </select>
    </dd>
</dl>

Там и задается вывод строк. Почитайте где нибудь про элементы формы: select это такой элемент, который содержит набор других html-элементов — option. Этот самый option содержит текстовку, отображаемый пользователю и атрибут value, который соответствует текстовке. На сервер, при отправке формы, попадает выбранное значение value, которое соответствует имени селекта. И все. остальное по мануалу. В шаге 2, в статье, Вы добавляете не input, а select.
avatar
Спасибо за помощь, чтобы я без вас делал! Извините за примитивные вопросы. Теперь сам буду пробовать… Думаю ваши разъяснения помогут не только мне…
avatar
Здравствуйте!
После того как делаю второй пункт изменений не видно. «В итоге получим» все так же.
Странно, хотя у меня стандартный шаблон по адресу ActionRegistration/index.php файл с разрешением не .php а tpl, может из-за этого? Вот видео как делал. Подскажите пожалуйта!
avatar
Странно… попробуй почистить кеш браузера, и запиши файл еще раз на сервер
avatar
Возращал исходный файл, снова так делал как на видео.В Опере,IE,Chrome запускал. Не помогло.
Можеш мешают плагины Extended registration и Профессии в профиле? Хотя и их временно отключал. Уже совсем не знаю что делать
avatar
Дело не в кэше браузера, а в кэше шаблонов, который делает ls. Чистить кэш на клиенте ненужно. Ваш сервер отдает не исправленный шаблон, а закэшированный. Попробуйте посмотреть здесь и здесь.
avatar
Сделал как написано- не помогло
Да, все в конфиге и в конце.

$config['sys']['cache']['use'] = false;
$config['compress']['css']['merge'] = false;
$config['compress']['js']['merge'] = false;
Может дело в том что не совсем понял — эти параметры нужно отключать до изменений или как?
avatar
Папку cache перед отключением параметров что выше чистил (хотя их было несколько, некоторые назывались cache 7,cache 9). Папку compiled чистил то же, но даже с отключенными параметрами в ней появляються файлы. Запутался
avatar
Второй пункт уже позади.
В «Шаге 6. Доработка маппера» непонятно куда добавить или что изменить…
Фото
avatar
В статье оЧепятка. Должно быть именно tpl.
avatar
Подскажите пожалуйста кто знает
avatar
Нет, Вы ищете не там. Вам нужен файл маппера модуля User. Файл этот здесь «classes/modules/user/mapper/User.mapper.class.php» в этом файле есть метод Add, его измененный вид и приведен в шаге 6.
avatar
Начинаются танцы с бубном. Нашел, заменил. При регистрации не появилось окошко ввода имени.
Но кажется появилось в другом месте. Не помню, но вроде здесь раньше не было такого.
avatar
Внимательней смотрите где размещаете код. В файле шаблона окна, того, которое на рисунке, есть три блока: вход, регистрация, восстановление. Вы размещаете новое поле в конце файла шаблона, а нужно внутри блока регистрации. Посмотрите шаблон лучше, там практически чистый html.
avatar
Ура! Получилось! На первое время осталось фамилию добавить и сделать чтоб эти поля были то же обязательными. Может кому пригодится
На фото показан Шаг 5.
andreyv, спасибо Вам!
avatar
Доброго дня!
andreyv, спасибо Вам за мануал — уверен, он мне пригодится чуть позже, когда решу какие поля сделать обязательными при регистрации. Но сегодня у меня стоит немного другая задача.

Подскажите — как добавить в форму регистрации текст «правил» или ссылку на «правила»?
при этом хотелось бы сделать обязательным отметку «галочки» о том что правила прочитаны.
  • ASA
  • 0
avatar
Былоб интересней тоже самое но на хуках и делегатах и наследованиях для реализации плагина :)
avatar
Да еще добавить кастомизированные поля, но как я понял при данной архитектуре это невозможно. Значит проще сохранение реализовать во внешней таблице и указать на внешний ключ.
avatar
Сделал по инструкции тоже самое для экшена Blog — не работает… Проверил 50 раз каждую буковку, геттеры, сеттеры и мапер поправил, ActionBlog.class.php тоже, таблицу создал, при заполнении нажимаю кнопку Схранить, и ничего не происходит, поле остается пустым — данные не записываются в таблицу, почему? Может я что-то упустил, помогите пожалуйста
avatar
Может быть я ошибся с переменными в шаблоне? Посмотрите, сделал по аналогии поля Описание блога:

<p><label for="blog_description">{$aLang.blog_create_description}:</label>
	<textarea name="blog_description" id="blog_description" rows="15" class="input-width-full mce-editor markitup-editor input-width-full">{$_aRequest.blog_description}</textarea>
	<small class="note">{$aLang.blog_create_description_notice}</small></p>
	
	<p><label for="blog_adsbar">{$aLang.blog_create_adsbar}:</label>
	<textarea name="blog_adsbar" id="blog_adsbar" rows="15" class="input-width-full mce-editor markitup-editor input-width-full">{$_aRequest.blog_adsbar}</textarea>
	<small class="note">{$aLang.blog_create_adsbar_notice}</small></p>
avatar
Спасибо вам за инструкцию, благодаря которой мне удалось сделать дополнительное поле в Настройках пользователя. Но вслед за этой задачей встала задача сделать так, чтобы дополнительные поля отображались в Информации о пользователе — чтобы их видели другие пользователи. Как это сделать?
avatar
Спасибо огромное за статью. Все работает даже в альтосмс ( с небольшими изменениями)
avatar
Превосходный рецепт!!! Спасибо тебе Автор!!! и пусть тебе прибудет!!!
  • fmty
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.