Загрузка...

Чем плоха стандартная регистрация Joomla?

Стандартная форма регистрации Joomla довольно неоднозначна. Лично мне она совсем не нравится. Выглядит она так:

1

С одной стороны, всё довольно очевидно и логично. Но с другой стороны, многие ли из вас смогут ответить, что такое «логин», и чем он отличается от «имени»? Зачем вообще запрашивать и имя и логин? Поля ввода повторного email и пароля нужны, чтобы пользователь не ошибся, но, согласитесь, вводить два раза свою электронную почту раздражает.

К сожалению, регистрация в Joomla устроена именно таким образом. На эти поля завязана вся система и просто так убрать их нельзя.

Использование стандартной регистрации Joomla для рассылки спама

Есть еще одна проблема, о которой, уверен, многие не знают. Какая-то умная голова догадалась использовать форму регистрации Joomla для рассылки спама.

«Как такое возможно?» – спросите вы. Очень просто. Страница формы регистрации Joomla стандартная:

index.php?option=com_users&view=registration

Это означает, что зайдя на любой сайт, работающий на Joomla, и введя этот URL, вы попадете на форму регистрации, содержащую стандартный набор полей.

Далее бот заполняет поля любыми данными. Главное – подставить в поле «Имя пользователя» текст спам-сообщения. После того, как регистрация отправляется, имя пользователя (спам-сообщение) видит, по крайней мере, администратор сайта. Это в лучшем случае. В худшем, если на сайте опубликован модуль последних зарегистрированных пользователей, могут видеть и посетители сайта.

Вот такой вот необычный способ рассылки спама. Если вам кажется, что я его придумал, то нет. Это реальные случаи из практики. Вообще, такой спам не доставляет особых проблем, но вот база данных постепенно наполняется спам-пользователями, что не есть хорошо.  Примерно вот так это выглядит в админке:

2

Как должна выглядеть быстрая форма регистрации?

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

«А как же логин и пароль?» – спросите вы. Я сторонник следующего подхода. Логин должен соответствовать двум требованиям:

  • Быть уникальным для каждого пользователя
  • Быть запоминающимся (таким, который пользователь легко вспомнит, даже если долго не заходил на сайт)

Этим двум требованиям лучше всего соответствуют Email и телефон пользователя. Но если телефон – это что-то личное, то, чем пользователь не всегда готов делиться, то запрос email – стандартная процедура при регистрации на любом сайте. Таким образом, в качестве логина лучшим решением мне видится использования адреса электронной почты. Этот адрес всегда будет уникальным для пользователя, и, с высокой долей вероятности, пользователь вспомнит его, даже если давно не заходил на сайт.

С паролем всё не так однозначно. Главное требование к паролю: его сложность. Она используется для защиты от подбора пароля. Но заставлять пользователя самому придумывать для себя сложный пароль, на мой взгляд, не лучшая идея. Просто представьте: вас заставляют придумать буквенно-цифровой пароль в N символов, содержащий строчные и заглавные буквы, а потом вам нужно еще и повторить его в поле подтверждения. Ужас. Почему-то разработчики Joomla пошли именно по этому пути, добавив настройки по требованиям к сложности пароля при регистрации.

В моем представлении – если уж делать для всех пользователей сложные пароли, то нужно делать это автоматически, не заставляя их морочить себе голову на этапе регистрации. На самом деле это проще, чем может показаться на первый взгляд. Кроме того, так мы можем избавиться сразу от двух лишних полей в форме регистрации: пароль и подтверждение пароля.

Давайте подведем итог по полям формы регистрации (было –> стало):

  • Имя –> Имя
  • Логин > Email
  • Пароль > Скрыто, генерируется автоматически
  • Повтор пароля –> Скрыто, генерируется автоматически
  • Адрес электронной почты –> Скрыто, заполняется из поля «Логин»
  • Подтверждение адреса электронной почты –> Скрыто, заполняется из поля «Логин»

Таким образом, от 6 полей в форме регистрации, заполнения пользователем потребуют только два: Имя и Email. В результате форма регистрации будет выглядеть так:

3

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

4

Вот теперь, на мой взгляд, идеально =).

Есть еще некоторые смежные вопросы по процессу регистрации.

Стоит ли заставлять пользователей подтверждать email при регистрации?

Joomla позволяет выбрать: подтверждать или нет адрес электронной почты после регистрации. Если выбрано подтверждение, пользователю приходит письмо со ссылкой, по которой он должен перейти. В противном случае аккаунт не активируется.

Стоит ли использовать подтверждение адреса электронной почты? Здесь нет однозначного ответа. Если реальность email-адреса пользователя для вас очень важна, то стоит включить такое подтверждение, но при этом быть готовым к тому, что часть адресов может быть фейковой. Если же ваша главная задача – максимально упростить для пользователя прохождение процесса регистрации (например, в момент заказа в интернет-магазине), то можно и отказаться от этой опции. Так или иначе, переключить ее вы можете в настройках менеджера пользователей Joomla.

Нужна ли отдельная страница для регистрации?

По умолчанию Joomla предлагает только один вариант регистрации – на отдельной странице, адрес которой я уже писал выше. Иногда может быть удобнее производить регистрацию в модуле  Joomla, или, например, во всплывающем окне. Что-то вроде:

5

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

Нужна ли защита от автоматических регистраций?

Последний вопрос, на который следует дать себе ответ, делать или нет защиту от автоматических регистраций. Если вас донимает спам в менеджере пользователей, то, определенно, стоит сделать такую защиту. Если же подобный вид спама вас не беспокоит, то можно обойти этот вопрос стороной.

Теперь, когда мы определились с внешним видом и функциональностью нашей быстрой регистрации, пора перейти непосредственно к ее реализации.

Создание быстрой формы регистрации

1) Переопределяем макет страницы регистрации в используемый шаблон Joomla.

 Для этого копируем файл:

/components/com_users/views/registration/tmpl/default.php

в:

/templates/ВАШ_ШАБЛОН/html/com_users/registration/

Каталоги, которых не хватает, создаем сами. Все дальнейшие действия производим уже в переопределенном файле.

2) Создаем, и подключаем к переопределенному макету файлы JS и CSS

Для автоматического заполнения полей нам потребуется использовать немножко JavaScript. Мы можем написать его или в общем файле JS, который подключен к шаблону, или создать новый файл и подключить его только в макете регистрации. Пойдем вторым путем.

В папке /templates/ВАШ_ШАБЛОН/html/com_users/registration/ создаем новый файл registration.js . Пока он пустой.

Чтобы данное решение было легко переносимым между сайтами, и не было привязано к отдельному шаблону, также мы добавим в папку отдельный файл стилей registration.css:

 /templates/ВАШ_ШАБЛОН/html/com_users/registration/registration.css . Он тоже пока пустой.

В переопределенном макете регистрации Joomla в начале находим строчку:

1
JHtml::_('behavior.formvalidator');

И заменяем ее на:

1
2
3
4
$app = JFactory::getApplication();
$document = JFactory::getDocument();
$document->addScript('/templates/'.$app->getTemplate().'/html/com_users/registration/registration.js');
$document->addStyleSheet('/templates/'.$app->getTemplate().'/html/com_users/registration/registration.css');

Если всё верно, в исходном коде страницы регистрации появится подключение файлов registration.js и registration.сss . Они должны корректно открываться браузером.

3) Создаем  JS-код для быстрой регистрации

В файл копируем следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function light_reg() {
    if((jQuery('.registration #jform_email1').val() =='') || (jQuery('.registration #jform_name').val() =='')){
        return false;
    } else {
            jQuery('.registration #jform_username').attr('value', jQuery('.registration #jform_email1').attr('value'));
            jQuery('.registration #jform_email2').attr('value', jQuery('.registration #jform_email1').attr('value'));
                var rand = function(min, max) {
                    return Math.floor(arguments.length > 1 ? (max - min + 1) * Math.random() + min : (min + 1) * Math.random());
                };
                var words = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
                strpas="";
                for(i=1;i<9;i++){
                    strpas+=words.charAt( Math.floor( Math.random() * words.length - 1 ) );
                }
                jQuery('.registration #jform_password1').attr('value',strpas);
                jQuery('.registration #jform_password2').attr('value',strpas);
        return false;
    }
};

Здесь всё просто. Проверяем, заполнены ли поля имени и адреса электронной почты. Если да, автоматически заполняем на их основе остальные поля, и генерируем уникальный пароль.

4) Добавляем обработчик клика на кнопку «Регистрация»

В файле /templates/ВАШ_ШАБЛОН/html/com_users/registration/default.php находим код:

1
<button type="submit" class="btn btn-primary validate" >

и заменяем его на:

1
<button type="submit" class="btn btn-primary validate" onclick="light_reg();">

Почему не использовать события JS и, в частности, JQuery? Таким образом мы обходим стандартную проверку заполнения полей, создаваемую Joomla. Нам нужно, чтобы пользователь заполнил только два поля, но не все, т.к. остальные заполнит наш скрипт из п.3.

Теперь, если всё сделано правильно, когда вы заполните в форме поля имени и адреса электронной почты, а затем нажмете кнопку «Зарегистрировать», то сначала увидите на секунду, как автоматически заполнятся все остальные поля, а затем произойдет регистрация.

5) Добавляем файл стилей, и скрываем все лишние поля

Когда мы убедились, что все поля заполняются скриптом корректно, и регистрация проходит успешно, нужно придать форме законченный вид и скрыть все автоматически заполняемые поля. Пользователь должен видеть только два поля: «Имя» и «Адрес электронной почты». Наполняем наш файл registration.css следующим содержимым:

1
2
3
4
5
6
7
8
9
10
11
.registration .control-group.jform_username,
.registration .control-group.jform_password1,
.registration .control-group.jform_password2,
.registration .control-group.jform_email2,
.registration .control-group.jform_spacer {
    display: none;
}
.registration .form-horizontal .controls {
    margin-left: 0;
}

Структура полей в форме регистрации построена в Joomla не самым удачным образом. Элементы, которые нам нужно скрыть, не имеют уникальных классов/идентификаторов. Точнее сами элементы их имеют, а вот родительские, которые также должны быть скрыты, уже нет. Проблему можно решить несколькими способами. Можно обращаться к элементам в CSS по порядковым номерам полей в форме. Но, как по мне, это не очень надежно. Я сделал иначе. В файле макета:

/templates/ВАШ_ШАБЛОН/html/com_users/registration/default.php

Находим код:

1
2
3
<div class="control-group">
        <div class="control-label">
                 <?php echo $field->label; ?>

И заменяем его на:

1
2
3
<div class="control-group <?php echo $field->id ?>”>
       <div class="control-label">
              <?php echo $field->label; ?>

Этой заменой мы добавили уникальные CSS-классы для родителей каждого поля. Теперь CSS-стили, заданные в файле registration.css, будут работать корректно.

Можно проверять. Теперь в форме регистрации видны только два нужных поля, и при этом регистрация работает.

6) Переносим заголовки полей в placeholder’ы (не обязательно)

В целом форма быстрой регистрации уже готова. Если вы хотите сделать её еще компактнее, можно перенести названия полей внутрь полей. Код в макете регистрации сделан таким образом, что мы получаем уже готовые сформированные поля. Есть два пути. Мы можем либо сформировать поля в html заново (что не очень-то и просто), либо подправить код путем поиска-замены по содержимому переменной. Пойдем вторым путем. Как по мне, он проще.

Найдем код:

1
2
3
<div class="controls">
       <?php echo $field->input; ?>
</div>

И заменим на:

1
2
3
<div class="controls">
      <?php echo str_replace('<input', '<input placeholder="'.trim(strip_tags($field->label)).'"', $field->input); ?>
</div>

Да, согласен, то еще код. Но работает исправно.

Также удалим обычные заголовки полей. Удаляем блок:

1
2
3
4
5
6
<div class="control-label">
       <?php echo $field->label; ?>
       <?php if (!$field->required && $field->type !== 'Spacer') : ?>
                 <span class="optional"><?php echo JText::_('COM_USERS_OPTIONAL'); ?></span>
        <?php endif; ?>
</div>

Теперь, наконец, наша форма приобрела окончательный вид, который задумывался первоначально. Можно потестировать, проверить, что всё работает. Логин и пароль будут приходить пользователю на email сразу после регистрации.

Желательно сразу проработать варианты ошибок, которые могут возникнуть в процессе эксплуатации формы. Например, пользователь мог забыть, что он уже регистрировался на сайте, и попытаться зарегистрироваться повторно. В этом случае Joomla выдаст ошибку с предупреждением, что пользователь с таким логином уже существует в системе. Пользователь вообще не знает, о чем это сообщение, т.к. слово «Логин» не фигурирует в форме регистрации. Это, и другие сообщения, где подменяются понятия, лучше сразу заменить с помощью переопределения языковых констант.

Быстрая регистрация в Joomla своими руками. Защита от спама.

Теперь, когда базовая форма быстрой регистрации в Joomla готова, можно вернутся к теме защиты от спам-регистраций.

В самом простом исполнении вы можете проверять, совпадает ли логин пользователя и email. Т.к. у нас они заполняются автоматически одними и теми же данными, то это утверждение будет всегда истинно для реальных пользователей и практически всегда ложно для роботов, которые ничего не знают об особенностях нашей формы регистрации.

К сожалению, точка кода, в которой необходимо осуществлять эту проверку, находится в файле ядра Joomla, изменение которого приведет к хаку. Вы можете внести этот хак, но помните о нем.

В файле:

components/com_users/models/registration.php

находим:

1
2
// Load the users plugin group.
JPluginHelper::importPlugin('user');

И добавляем после код:

1
2
3
4
if($data['username'] !== $data['email']) {   
    $this->setError(JText::sprintf('COM_USERS_REGISTRATION_SAVE_FAILED', $user->getError()));
    return false;     
}

Теперь при несовпадении логина и email’а регистрация не произойдет.

Способ с хаком плохой. Но есть и хороший, хотя и не такой быстрый. Можно вынести эту маленькую правку в отдельный плагин, избежав, таким образом, хака.

Вот и всё. Теперь функционал быстрой регистрации окончательно готов. Мы обошлись собственными силами, не используя сторонних расширений. Подобная регистрация, с некоторыми оговорками, может быть интегрирована и в компонент интернет-магазина Virtuemart, позволяя регистрировать покупателей незаметно, не отвлекая от заказа.

Если у вас не получилось самостоятельно выполнить все шаги, можете воспользоваться файлами из архива ниже или заказать доработку регистрации Joomla у меня. Их нужно извлечь в директорию, куда мы переопределяем макет на первом шаге. Этого достаточно для подключения быстрой регистрации.

{

}