Здравствуйте, уважаемые читатели 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 {
отправляем ошибку
}