Здравствуйте, уважаемые читатели 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;
}

Добавляем в контроллер joomla код проверки на email

Данный код, проверяет содержимое поля 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 в модель joomla

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

Ну вот и все, авторизация по email в Joomla готова!

Если у вас возникли вопросы, задавайте их в комментариях.