2 способи як зробити авторизацію по email в Joomla
Привіт, шановні читачі shargaev-group.ru! Нещодавно зіткнувся з завданням, реалізувати авторизацію по email адресою на сайті Joomla. За замовчуванням, в 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 _ \ - \.]) + \. ([Az \.] {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 готова!
Якщо у вас виникли питання, задавайте їх у коментарях.