Здравствуйте, уважаемые читатели shargaev-group.ru! Недавно столкнулся с задачей, реализовать авторизацию по email адресу на сайте Joomla. По умолчанию, в Joomla доступна авторизация только по логину, что на мой взгляд, не совсем удобно. Немного раскинув мозгами, в мою голову пришло два решения, которыми я хочу поделиться с вами.
Делаем авторизацию по email в joomla
Способ №1 Подмена поля.
Способ заключается в следующем: меняем название поля Логин (username) на Email. При регистрации, предлагаем пользователю заполнить два поля «Email» и «Повторный ввод email адреса». Полученные значения из первого поля, joomla будет сохранять в поле username (Логин). Таким образом, пользователь зарегистрировавшийся на вашем сайте, сможет авторизоваться по email адресу.
Приступаем к реализации:
Открываем языковой файл компонента /language/ru-RU/users ru-RU.com_users.ini и правим следующие строки:
Для регистрации:
COM_USERS_REGISTER_USERNAME_DESC= «Введите адрес электронной почты»
COM_USERS_REGISTER_USERNAME_LABEL= «Адрес электронной почты»
COM_USERS_REGISTER_EMAIL1_DESC= «Введите адрес электронной почты еще раз»
COM_USERS_REGISTER_EMAIL1_LABEL= «Адрес электронной почты еще раз»
В форме регистрации в место поля Логин, должно появиться поле «Адрес электронной почты».
Для авторизации:
В файле /language/ru-RU/ru-RU.mod_login.ini правим строки:
MOD_LOGIN_VALUE_USERNAME= «Логин или Email»
Валидация:
Для переименованного поля username нам нужно сделать валидацию. Открываем файл /components/com_users/models/forms/registration.xml
Ищем код:
<field name="username" type="text" class="validate-username" description="COM_USERS_DESIRED_USERNAME" filter="username" label="COM_USERS_REGISTER_USERNAME_LABEL" message="COM_USERS_REGISTER_USERNAME_MESSAGE" required="true" size="30" validate="username" maxlength="10" />
И заменяем значение validate на email, а значение filter на string:
<field name="username" type="text" class="validate-username" description="COM_USERS_DESIRED_USERNAME" filter="string" label="COM_USERS_REGISTER_USERNAME_LABEL" message="COM_USERS_REGISTER_USERNAME_MESSAGE" required="true" size="30" validate="email" maxlength="10" />
Способ №2. Кастомизация компонента com_users.
Принцип работы данного метода: в поле «Логин» пользователь может ввести логин или пароль. При отправке формы на сервер, проверяем в контроллере, что находится в присланном поле username. Если оно содержит email, ищем пользователя с таким адресом в базе данных и возвращаем его логин. Полученный логин, перезаписываем в значение $data[‘username’]. Дальше идет стандартная процедура авторизация Joomla.
Приступаем к реализации:
В модуле авторизации, меняем название поля «Логин» на «Логин или Email». Для этого в языковом файле файле /language/ru-RU/ru-RU.mod_login.ini меняем значение MOD_LOGIN_VALUE_USERNAME на «Логин или Email».
В языковом файле /language/ru-RU/ru-RU.com_users.ini меняем значение строки на
COM_USERS_LOGIN_USERNAME_LABEL= «Логин или Email»
В контроллер /components/com_users/controllers/user.php после кода (примерно 39 строка):
$data['return'] = base64_decode(JRequest::getVar('return', '', 'POST', 'BASE64'));
$data['username'] = JRequest::getVar('username', '', 'method', 'username');
$data['password'] = JRequest::getString('password', '', 'post', JREQUEST_ALLOWRAW);
Вставляем код:
// получаем логин
if(preg_match('/([a-z0-9_\-\.])+@([a-z0-9_\-\.])+\.([a-z\.]{2,6})/', $data['username']) && $data['password'])
{
$model = $this->getModel('login');
if($login = $model->getUserLogin($data['username'])) $data['username'] = $login;
}
Данный код, проверяет содержимое поля username, если оно содержит email, запускает метод getUserLogin для поиска логина.
В файл модели /components/com_users/models/login.php добавляем метод getUserLogin:
public function getUserLogin($mail)
{
if(!$mail) return false;
$db = $this->getDBO();
$q = $db->getQuery(true);
$q->select('username')
->from('#__users')
->where('email = ' . $db->quote((string)$mail));
$db->setQuery($q);
if($res = $db->loadResult()) return $res;
return false;
}
функция ищет в базе данных пользователя по указанному email адресу, если такой пользователь есть, возвращает его логин.
Ну вот и все, авторизация по email в Joomla готова!
Если у вас возникли вопросы, задавайте их в комментариях.




Спасибо, всё работает.
На здоровье! Рад, что данное решение вам помогло.
Отличное решение! Автору респект и благодарность!
них*я не работает
А не подскажете как написать код, чтобы при регистрации пользователя, система принимала к регистрации адреса эл.почты только с определеными доменами, например ХХХ@yahoo.com и XXX@YYY.ge
Спасибо заранее
При регистрации делаем проверку данных (пишите свой плагин или кастомизируете стандартный компонент), поле с email проверяем на нужный нам домен:
if(preg_match(‘/@yahoo.com|YYY.ge/i’, ‘Email’)) {
выполняем ваш код
} else {
отправляем ошибку
}