Регистрация в Joomla: удаление ненужных полей

16

Во-первых, я знаю об этом вопросе:

/programming/14799733/remove-name-field-from-joomla-registration-form

Но ссылка в ответе устарела, и упомянутый путь к файлу не существует в последней версии Joomla (версия 3.3), поэтому ответ бесполезен.

То, что я хочу, это просто: форма регистрации для Joomla выглядит следующим образом:

регистрационное изображение по умолчанию

Я хочу, чтобы процесс регистрации был максимально простым для моих пользователей, чтобы они действительно завершили его, и есть некоторые проблемы:

  • Мне не нужно знать настоящее имя пользователя.
  • Я бы предпочел не иметь «подтвердить» коробки. Общее мнение заключается в том, что они не нужны. /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • Все требуется, зачем отмечать обязательные поля?

Конечно, это гораздо лучшая страница регистрации:

лучшее оформление изображения

Я изменил файл \ components \ com_users \ models \ forms \ registration.xml, чтобы форма выглядела так, как я хочу, и это сработало! Но всякий раз, когда я отправляю форму, проверка все равно ищет пропущенные поля, поэтому она сообщает мне, что мне нужно указать имя:

"Регистрация не удалась: пожалуйста, введите ваше имя."

Как я могу отключить проверки для поля имени, а также двух полей подтверждения?

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

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

Я был бы очень признателен за любую помощь, которую вы можете оказать, я пытаюсь понять это уже несколько часов!

gfrung4
источник
1
Я хотел бы указать на JED в качестве возможного источника расширений, выполняющих что-то вроде этого.
Валентин Деспа
@Lodder спасибо за информацию, которую вы вставили, чтобы пропустить процесс проверки, но я боюсь, что он не работает в моем шаблоне. Не могли бы вы проверить код и обновить работающий? Как я следил за процессом @Rickster, и это работало как шарм. Я новичок в Joomla и, следовательно, прошу вашей помощи в этом отношении. Заранее спасибо.
Я нашел ответ на этот вопрос Stackoverflow, возможно, то, что вы хотите: Как отключить проверку некоторых полей в регистрации Joomla 3
Роб Л

Ответы:

12

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

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

Эта функция в плагине "users" позволяет вам изменять форму:

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating a valid form, 
    // may also want to check whether this is frontend or admin depending on where all you want to affect
    // JFactory::getApplication()->isAdmin()
    $name = $form->getName();
    if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
    {
        return true;
    }

    // remove fields on frontend
    if (!JFactory::getApplication()->isAdmin()) {
        $form->removeField('password2');
        $form->removeField('email2');
    }

    return true;
}

Затем вы можете использовать функцию onUserBeforeSave для сброса любых полей, которые необходимо сбросить для прохождения проверки. (Это может быть не совсем необходимо, поэтому попробуйте без и посмотрите, какие ошибки вы получите.)

function onUserBeforeSave($user, $isnew, $new) {
    $user['password2'] = $user['password1'];
}
Дэвид Фрич
источник
8

Итак, я думал о подходе без необходимости взламывать что-либо или устанавливать какие-либо сторонние расширения. Мой метод будет включать переопределение шаблона, которое вам нужно будет сделать для компонента com_users , в частности, представления « Регистрация» .

Теперь для полей (при условии, что ваш шаблон переопределения полностью настроен), мы не будем их удалять, а вместо этого будем их скрывать, поскольку контроллер и модал требуют от них данных. Итак, откройте следующий файл, который теперь является переопределением вашего шаблона:

шаблоны / YOUR_TEMPLATE / html / com_users / регистрация / default.php

и добавьте следующий код в верхнюю часть файла сразу после JHtml::_('behavior.formvalidation');:

$doc = JFactory::getDocument();

$js = "
        jQuery(document).ready(function($){

            // Define the variables
            var regForm     = $('#member-registration');
            var name        = regForm.find('#jform_name');
            var password    = regForm.find('#jform_password1');
            var password2   = regForm.find('#jform_password2');
            var email       = regForm.find('#jform_email1');
            var email2      = regForm.find('#jform_email2');

            // Hide the required field, star, name, confirm pass and confirm email
            regForm.find('.spacer').parents('.control-group').hide();
            regForm.find('.star').hide();
            name.parents('.control-group').hide();
            password2.parents('.control-group').hide();
            email2.parents('.control-group').hide();

            // Add a default value to the name field
            name.val('Anonymous');

            // Clone password and email values to the confirm fields
            email.on('keyup', function() {
                email2.val( this.value );
            });
            password.on('keyup', function() {
                password2.val( this.value );
            });

        });    
    ";    
$doc->addScriptDeclaration($js);

Я добавил несколько комментариев, чтобы вы знали, что делает каждый фрагмент кода.

Надеюсь это поможет :)

Лоддер
источник
1

Ответ @ DavidFritsch был очень полезным. Однако я обнаружил пару проблем:

A) Вы не можете полностью удалить некоторые обязательные поля, так как это вызывает проблемы с фильтрацией данных при отправке формы (см. Комментарии в коде ниже). Чтобы бороться с этим, скрывайте, а не удаляйте поля из объекта формы. Б) Событие onUserBeforeSave не запускается, пока не станет слишком поздно, чтобы логика проверки регистрации не отклонила отправку формы. Вместо этого используйте событие onUserBeforeDataValidation.

В моем конкретном случае все, что я хотел, это адрес электронной почты и пароль. Joomla добавила здесь сложность, поскольку адрес электронной почты появлялся после пароля (продиктованного порядком полей, объявленных в файле registration.xml), что выглядело бы глупо с точки зрения взаимодействия с пользователем. Чтобы обойти это, я пометил поле имени пользователя на «Адрес электронной почты» и вместо этого скрыл поле адреса электронной почты. Электронная почта тогда по умолчанию от имени пользователя при отправке формы.

(Небольшое примечание: я ограничил плагин для работы только с формой 'com_users.registration' для моих целей, по сравнению с ответом Дэвида, который учитывает и другие формы.)

class PlgUserSimpleRegistration extends JPlugin
{

function onContentPrepareForm($form, $data)
{
    if (!($form instanceof JForm))
    {
        $this->_subject->setError('JERROR_NOT_A_FORM');
        return false;
    }

    // Check we are manipulating the registration form
    if ($form->getName() != 'com_users.registration')
    {
        return true;
    }

    // Check whether this is frontend or admin
    if (JFactory::getApplication()->isAdmin()) {
        return true;
    }

    // Remove/Hide fields on frontend
    // Note: since the onContentPrepareForm event gets fired also on
    // submission of the registration form, we need to hide rather than
    // remove the mandatory fields. Otherwise, subsequent filtering of the data
    // from within JModelForm.validate() will result in the required fields
    // being stripped from the user data prior to attempting to save the user model,
    // which will trip an error from inside the user object itself on save!
    $form->removeField('password2');
    $form->removeField('email2');

    $form->setFieldAttribute('name', 'type', 'hidden');
    $form->setValue('name', null, 'placeholder');
    $form->setFieldAttribute('email1', 'type', 'hidden');
    $form->setValue('email1', null, JUserHelper::genRandomPassword(10) . '@invalid.nowhere');

    // Re-label the username field to 'Email Address' (the Email field
    // ordinarily appears below the password field on the default Joomla
    // registration form)
    $form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');

    return true;
}

function onUserBeforeDataValidation($form, &$user) {
    if ($form->getName() != 'com_users.registration') {
        return true;
    }

    if (!$user['username']) {
        // Keep up the pretense from above!
        $form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');
        return true;
    }

    if (!$user['name'] or $user['name'] === 'placeholder') {
        $user['name'] = $user['username'];
        $user['email1'] = $user['email2'] = $user['username'];
        $user['password2'] = $user['password1'];
    }
}

}
Джон Рикс
источник