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

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

https://stackoverflow.com/questions/14799733/remove-name -полем-с-JOOMLA-регистрации-формы

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

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

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

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

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

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

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

«Ошибка регистрации: введите свое имя».

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

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

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

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

16 голосов | спросил Rickster 1 FebruaryEurope/MoscowbSun, 01 Feb 2015 07:17:39 +0300000000amSun, 01 Feb 2015 07:17:39 +030015 2015, 07:17:39

3 ответа


11

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

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

Эта функция в плагине «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'];
}
ответил David Fritsch 2 FebruaryEurope/MoscowbMon, 02 Feb 2015 03:55:34 +0300000000amMon, 02 Feb 2015 03:55:34 +030015 2015, 03:55:34
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);

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

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

ответил Lodder 1 FebruaryEurope/MoscowbSun, 01 Feb 2015 16:48:28 +0300000000pmSun, 01 Feb 2015 16:48:28 +030015 2015, 16:48:28
1

@ Ответ DavidFritsch был очень полезен. Несколько проблем, которые я нашел, были:

A) Вы не можете полностью удалить определенные обязательные поля, поскольку это вызывает проблемы с фильтрацией данных при отправке формы (см. комментарии в коде ниже). Чтобы бороться с этим, скройте, а не удалите поля из объекта формы. B) Событие 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'];
    }
}

}
ответил John Rix 31 Jpm1000000pmTue, 31 Jan 2017 13:57:26 +030017 2017, 13:57:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132