Обязательные поля профиля (модификация)

Некоторым администраторам может понадобиться требовать с пользователя не только логин, адрес электронной почты и пароль, а другую информацию. Для моего проекта потребовалось «спрашивать» с (пока ещё) анонимуса фамилию и имя. Предлагаю вниманию простое решение данной задачи.

Итак, предположим, что нужные поля уже созданы (Как добавить дополнительные поля в профиль?), мы используем традиционную регистрацию (с приглашениями не тестировал), и нам осталось лишь сделать поля обязательными.

1. Правим файл ./classes/actions/ActionRegistration.class.php
Добавляем проверку полей «Фамилия» и «Имя».
Я считаю, для фамилии достаточно 100 симолов, а для имени 50.

/**
 * Проверка фамилии
 */
if (!func_check(getRequest('surname'),'text',2,100)) {
	$this->Message_AddError($this->Lang_Get('registration_surname_error'),$this->Lang_Get('error'));
	$bError=true;
}		
/**
 * Проверка имени
 */
if (!func_check(getRequest('name'),'text',2,50)) {
	$this->Message_AddError($this->Lang_Get('registration_name_error'),$this->Lang_Get('error'));
	$bError=true;
}

Для добавления полей в базу данных изменим этот блок:

/**
 * Создаем юзера
 */
$oUser=new UserEntity_User();
$oUser->setLogin(getRequest('login'));
$oUser->setMail(getRequest('mail'));
$oUser->setPassword(func_encrypt(getRequest('password')));
$oUser->setDateRegister(date("Y-m-d H:i:s"));
$oUser->setIpRegister(func_getIp());

Добавив:

// Добавляем имя
$oUser->setProfileName(getRequest('name'));
// Добавляем фамилию
$oUser->setProfileSurname(getRequest('surname'));

Опять же, вспомним допущение: поля в базе данных уже есть и функции для работы дополнительных полей (setProfileName, getProfileName, setProfileSurname, getProfileSurname) уже описаны в ./classes/modules/user/entity/User.entity.class.php.

2. Изменяем ./classes/modules/user/mapper/User.mapper.class.php
Находим функцию Add. Вместо:

public function Add(UserEntity_User $oUser) {
	$sql = "INSERT INTO ".DB_TABLE_USER." 
		(user_login,
		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->getPassword(),$oUser->getMail(),$oUser->getDateRegister(),$oUser->getIpRegister(),$oUser->getActivate(),$oUser->getActivateKey())) {
		return $iId;
	}		
	return false;
}

Вставляем следующее:

public function Add(UserEntity_User $oUser) {
	$sql = "INSERT INTO ".DB_TABLE_USER." 
		(user_login,
		user_password,
		user_mail,
		user_date_register,
		user_ip_register,
		user_activate,
		user_activate_key,
		user_profile_name,
		user_profile_surname
		)
		VALUES(?,  ?,	?,	?,	?,	?,	?,   ?,   ?)
	";			
	if ($iId=$this->oDb->query($sql,$oUser->getLogin(),$oUser->getPassword(),$oUser->getMail(),$oUser->getDateRegister(),$oUser->getIpRegister(),$oUser->getActivate(),$oUser->getActivateKey(),$oUser->getProfileName(),$oUser->getProfileSurname())) {
		return $iId;
	}		
	return false;
}

Примечание: поле user_profile_surname расположено после поля user_profile_name. Будьте внимательны при заполнении базы данных.

3. Добавляем фразы.
Открываем ./templates/language/<ваш языковой пакет>.php

'registration_name_error' => 'Неверное имя, допустимо от 2 до 50 символов',
'registration_surname_error' => 'Неверная фамилия, допустима от 2 до 100 символов',
'registration_surname' => 'Фамилия',
'registration_name' => 'Имя',

4. Редактируем шаблон
Изменяем ./templates/skin/<ваш скин>/actions/ActionRegistration/index.tpl. В нужное место добавляем:

<label for="surname">{$aLang.registration_surname}:</label><br />
<p><input type="text" class="input-text" id="surname" value="{$_aRequest.surname}" name="surname"/></p><br />
			
<label for="surname">{$aLang.registration_name}:</label><br />
<p><input type="text" class="input-text" id="name" value="{$_aRequest.name}" name="name"/></p><br />

Готово.

При обнаружении ошибок, просьба оставлять комментарии, либо писать в приват.

26 комментариев

avatar
а если пол? :)
avatar
Lora_GT, с полом (как и с остальными формами многочисленного выбора) немного иначе. Попробую привести пример с использованием радио-кнопок. (Возьму код из ./templates/skin/<ваш скин>/actions/ActionSettings/profile.tpl)

Правим шаблон:

<input type="radio" name="profile_sex" id="profile_sex_m" value="man" />  —  мужской<br />
<input type="radio" name="profile_sex" id="profile_sex_w" value="woman" />  —  женский<br />

Изменяем проверку
Мне кажется, достаточно того, чтобы $_POST['profile_sex'] был не пустым.

/**
 * Проверка пола
 */
if (empty(getRequest('profile_sex'))) {
        $this->Message_AddError($this->Lang_Get('registration_sex_error'),$this->Lang_Get('error'));
        $bError=true;
}

Добавляем фразу:
'registration_sex_error' => 'Вы не определились с полом',

Всё остальное — аналогично. Должно работать.
Если ошибся (ведь всего две недели кручу Livestreet), будьте добры, поправьте.
avatar
Gleb, а не мог бы ты подробный отдельный топик написать про эту фишку http://blogdj.ru/registration/.

Пользователь при регистрации себя ранжирует, от этого цвет ника его на сайте соответствующий (список людей, топики, эфир). В настройках профиля может ранг менять, ну и в профиле отображает ранг.
Думаю, многим было бы интересно ;)

avatar
Lora_GT, попробовать можно. Совсем недавно думал на своём проекте реализовать отделение цветом администраторов, модераторов и пользователей. :-)

Вплотную не занимался (разве что научился ник «красить». Например: пользователь и администратор), но, полагаю, особых трудностей возникнуть не должно.

Увы, в связи с некоторой временной занятостью, не могу, с высокой вероятностью, пообещать оформить всё в отдельный топик.

Спасибо за предложение.
avatar
Can't use function return value in write context
avatar
убери использования функции empty. или же вначале создай перменную которой присваиваешь значение функции. а потом проверяй на пустышку
avatar
Покопался на эту тему, нашел небольшую ошибочку в стандартной сборке.
Когда вводишь имя, более длинное, чем 20 символов — никакой ошибки не выдается, соответствующее поле очищается и никакого сообщения не выдается…
ИМХО — этот неправильно…
Решил для себя следующим образом.
Языковой файл:
'settings_profile_edit' => 'Изменение профиля',
'settings_profile_name' => 'Настоящее имя и фамилия',
'settings_profile_name_notice' => 'Длина имени с фамилией не может быть меньше 2 и больше 30 символов.',
'settings_profile_error_name' => 'Введите пожалуйста настоящее имя и фамилию.',

\classes\actions\ActionSettings.class.php:
/**
* Проверяем имя
*/
if (func_check(getRequest('profile_name'),'text',2,30)) {
$this->oUserCurrent->setProfileName(getRequest('profile_name'));
} else {
$this->oUserCurrent->setProfileName(null);
$this->Message_AddError($this->Lang_Get('settings_profile_error_name'),$this->Lang_Get('error'));
$bError=true;
}


При регистрации у меня не требуется ввод имени, но делается переадресания на настройку профиля. Если пользователь решит изменить свой профиль (а он это захочет сделать, хотябы для того, чтобы пол изменить), то ему придется вносить настоящее имя.
avatar
Автору большое спасибо. Если у вас так с ходу на тот момент все получилось, может вы и большее можете? Постоянно заинтересован в специалистах готовых решать задачи ;)
avatar
Борис а свяжитесь со мной чтоле =)) по выходным бывает у меня есть время похалтурить немного =))
avatar
BorisBritva, приятно, что получилось помочь.
Касаемо предложения: вероятно, смогу и большее, однако врядли вас устроит уровень знания первокурсника. Спасибо за предложение.

Всем комментаторам: прошу прощения, что не отвечал. Учебный процесс занимает всё свободное время.
avatar
Hello!
Спасибо за топик, очень помог. Но одну проблему мы так решить и не смогли.
Добавили в регистрацию поле «страна», действовали и по вашей инструкции, и перерыли в движке процесс обновления профиля. Бестолку. Страна в базе к юзеру не привязывается.
Можете помочь? Какие именно запросыы к бд необходимо совершить для этого?
avatar
Всё уже получилось)
avatar
В 0,4,1 версии будет работать?
avatar
тоже интересует
avatar
Catchable fatal error: Argument 1 passed to ModuleUser_MapperUser::Add() must be an 
instance of UserEntity_User, instance of PluginSocial_ModuleSocial_EntityUser given, called in
 /var/www/html/mgpu.net/classes/modules/user/User.class.php on line 320 and defined in 
/var/www/html/mgpu.net/classes/modules/user/mapper/User.mapper.class.php on line 25 

вот такая штука на 0.4.2, в чем может быть проблема?
avatar
Сделал, заработало на 0.4.2
проблема была в названии функции
еще добавлении колонки в mysql
avatar
можете поподробней объяснить что-куда?
avatar
Тоже понадобилось в 0.42. Вроде разобрался, может кому еще надо решение))
Короче, вместо ЭТОГО

/**
 * Проверка фамилии
 */
if (!func_check(getRequest('surname'),'text',2,100)) {
        $this->Message_AddError($this->Lang_Get('registration_surname_error'),$this->Lang_Get('error'));
        $bError=true;
}               
/**
 * Проверка имени
 */
if (!func_check(getRequest('name'),'text',2,50)) {
        $this->Message_AddError($this->Lang_Get('registration_name_error'),$this->Lang_Get('error'));
        $bError=true;
}


Ставим ЭТО


if (!(getRequest('profile_name'))) {
$this->Message_AddError($this->Lang_Get('registration_name_error'),$this->Lang_Get('error'));
$bError=true;
			}
if (!(getRequest('profile_surname'))) {
$this->Message_AddError($this->Lang_Get('registration_surname_error'),$this->Lang_Get('error'));
$bError=true;
}


И вместо ЭТОГО

// Добавляем имя
$oUser->setProfileName(getRequest('name'));
// Добавляем фамилию
$oUser->setProfileSurname(getRequest('surname'));


Ставим ЭТО

// Добавляем имя
$oUser->setProfileName(getRequest('profile_name'));
// Добавляем фамилию
$oUser->setProfileSurname(getRequest('profile_surname'));


Остальное все как в топике…
avatar
Я на 0,5 попробовал поставить по Вашему принципу, при нажатии на Регистрация вылтает ошибка с тестом «Ошибка: Неверное имя, допустимо от 2 до 50 символов, Ошибка: Неверная фамилия, допустима от 2 до 100 символов» Хотя введенная информация соответсвует требованиям. Не подскажете в чем может быть проблема?
avatar
А вот только момент такой, при регистрации указывается фамилия, а вот в настройках нельзя. Подскажите как добавить туда.
avatar
Для 1.0 подскажите решение для тех, кому надо пошагово, можно кратко. Сделать «имя» обязательным полем при регистрации. Поле создано в стандарте. Шаблон — developer
avatar
сделал по описанию на 1.0.1 — регистрация вообще не работает. Было бы круто написать отдельный плагин
avatar
да, не работает
avatar
Присоединяюсь по поводу отдельного плагина, где можно задать обязательные поля при регистрации.
avatar
Делаю чекбокс «прочел правила регистрации», в /classes/actions/ActionRegistration.class.php пишу после $bError=false;:
if (!(getRequest('rules'))) {
	$this->Message_AddError($this->Lang_Get('registration_rules_error'),$this->Lang_Get('error'));
	$bError=true;
}	

в /actions/ActionRegistration/index.tpl:
<input type="checkbox" id="rules" name="rules" class="checkbox" value="" /> 

в языковом файле создаю запись
'settings_profile_edit' => 'обязательное поле',


но без толку, в чём ошибка? (может дело в плагине расширенной регистрации)
avatar
поправка в языковом файле создаю запись
'registration_rules_error' => 'обязательное поле',
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.