Реєстрація Joomla: Видаліть непотрібні поля


16

По-перше, мені відомо це питання:

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

Але посилання в його відповіді мертве, і згаданий шлях до файлу не існує в останній Joomla (версія 3.3), тому відповідь ні до чого.

Я хочу просто: Реєстраційна форма для Joomla виглядає приблизно так:

за замовчуванням зображення реєстрації

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

  • Мені не потрібно знати справжнє ім’я користувача.
  • Я вважаю за краще не підтверджувати поля. Загальний консенсус полягає в тому, що вони не потрібні. /ux/484/is-a-repeat-password-field-ne необходимо-in-a-signup-page
  • Все потрібно, навіщо турбуватись маркувати обов'язкові поля?

Звичайно, це набагато краща сторінка реєстрації:

краще зображення реєстрації

Я змінив файл \ компоненти \ com_users \ models \ form \ registration.xml, щоб форма виглядала так, як я хочу, і вона працювала! Але кожного разу, коли я надсилаю форму, перевірка все одно шукає відсутні поля, тому вона повідомляє мені, що мені потрібно вказати ім'я:

"Реєстрація не вдалася. Введіть своє ім'я."

Як я можу відключити чеки для поля імен, а також два поля підтвердження?

Оскільки ім’я потрібне, я хотів би встановити ім’я на вказане ім’я користувача (тому ім'я користувача та ім’я за замовчуванням однакові). Якщо користувач насправді хоче перейти, встановивши справжнє ім’я на своїй сторінці профілю після реєстрації, він повинен мати можливість, але цього не потрібно.

Я йду про це неправильно? Я десь читав, що модифікація основних файлів Joomla не є хорошою, оскільки вона може зламатися в оновленнях, і замість цього слід використовувати "переопрацювання". Зазвичай ці відповіді просто посилаються на сторінку Joomla з перевірками, і не дають більше пояснень щодо того, як використовувати їх для того, щоб робити те, що бажає. Я спробував розібратися в них, але не можу, тому, якщо відміни - це шлях, поясніть, будь ласка, поясніть, як я б пішов робити це з ними, а не просто посилаючись на підручник із переосмисленням.

Я дуже вдячний за будь-яку допомогу, яку ви можете надати, я намагаюся розібратися в цьому вже кілька годин!


1
Я хотів би зазначити JED як можливе джерело розширень, що роблять щось подібне.
Валентин Деспа

@Lodder дякую за інформацію, яку ви вставили, щоб пропустити процес перевірки, але я боюся, що він не працює в моєму шаблоні. Ви хочете перевірити код та оновити працюючий? Коли я стежив за процесом @Rickster, і це працювало як шарм. Я новачок в Joomla і тому прошу вашої допомоги в цьому плані. Заздалегідь спасибі.

Я знайшов відповідь на це питання Stackoverflow, що ви хочете: Як відключити валідацію деяких полів при реєстрації Joomla 3
Rob L

Відповіді:


12

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

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

Цей функціонал у плагіні "користувачів" дозволяє змінювати форму:

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) Ви не можете повністю видалити певні обов'язкові поля, оскільки це створює проблеми з фільтрацією даних при поданні форми (див. Коментарі в коді нижче). Для боротьби з цим приховайте, а не видаляйте поля з об’єкта форми. B) Подія onUserBeforeSave не запускається, поки не буде занадто пізно, щоб запобігти відхиленню подання форми логікою перевірки реєстрації. Замість цього використовуйте подію onUserBeforeDataValidation.

У моєму конкретному випадку я хотів лише адресу електронної пошти та пароль. Joomla тут наклав ускладнення, оскільки адреса електронної пошти з'являлася після пароля (продиктований порядком полів, оголошених у файлі register.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'];
    }
}

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.