Rejestracja Joomla: Usuń niepotrzebne pola

16

Po pierwsze, mam świadomość tego pytania:

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

Ale link w jego odpowiedzi jest martwy, a wspomniana ścieżka do pliku nie istnieje w najnowszej wersji Joomla (wersja 3.3), więc odpowiedź jest bezużyteczna.

To, czego chcę, jest proste: formularz rejestracyjny dla Joomla wygląda następująco:

domyślny obraz rejestracyjny

Chcę, aby proces rejestracji był jak najprostszy dla moich użytkowników, aby faktycznie go ukończyli, i są pewne problemy:

Z pewnością jest to znacznie lepsza strona rejestracji:

lepszy obraz rejestracyjny

Zmodyfikowałem plik \ components \ com_users \ models \ form \ register.xml, aby formularz wyglądał tak, jak chcę i działał! Ale za każdym razem, gdy przesyłam formularz, sprawdzanie poprawności nadal szuka brakujących pól, więc informuje mnie, że muszę podać nazwę:

„Rejestracja nie powiodła się: proszę podać swoje imię i nazwisko”.

Jak mogę wyłączyć sprawdzanie pola nazwy, a także dwóch pól potwierdzenia?

Ponieważ nazwa jest wymagana, chciałbym ustawić ją na podaną nazwę użytkownika (więc nazwa użytkownika i nazwa są domyślnie takie same). Jeśli użytkownik naprawdę chce po rejestracji ustawić prawdziwe imię i nazwisko na swojej stronie profilu , powinien to zrobić, ale nie powinno to być wymagane.

Czy robię to w niewłaściwy sposób? Czytałem już w niektórych miejscach, że modyfikowanie podstawowych plików Joomla nie jest dobre, ponieważ może się włamać podczas aktualizacji i że zamiast tego należy użyć „przesłonięcia”. Zazwyczaj odpowiedzi te po prostu zawierają link do strony Joomla na temat przesłonięć i nie zawierają dalszego wyjaśnienia, jak je wykorzystać, aby zrobić to, czego chce pytający. Próbowałem je rozgryźć, ale nie mogę, więc jeśli przesłonięcia są dobrym rozwiązaniem, wyjaśnij, jak bym to zrobił z nimi, zamiast po prostu linkować do samouczka zastępowania.

Byłbym bardzo wdzięczny za wszelką pomoc, którą próbuję rozwiązać od kilku godzin!

gfrung4
źródło
1
Chciałbym wskazać JED jako możliwe źródło rozszerzeń, które robią coś takiego.
Valentin Despa
@Dodaj dzięki za informacje, które wstawiłeś, aby pominąć proces sprawdzania poprawności, ale obawiam się, że nie działa w moim szablonie. Czy mógłbyś sprawdzić kod i zaktualizować działający? Gdy śledziłem proces @Rickster , działało to jak urok. Jestem nowicjuszem w joomla i dlatego proszę o pomoc w tym zakresie. Z góry dziękuję.
Znalazłem odpowiedź na to pytanie Stackoverflow: Jak wyłączyć sprawdzanie poprawności niektórych pól w rejestracji Joomla 3
Rob L

Odpowiedzi:

12

Idealnie byłoby to zrobić we wtyczce użytkownika. Nie jestem pewien, czy wiele osób zdaje sobie z tego sprawę, ale możesz edytować formularz z wtyczki (nie wymaga hakowania rdzenia).

Podobnie wtyczka zobaczy dane wejściowe, zanim model podejmie próbę zapisania pozycji, dzięki czemu można wyśmiewać niektóre pola duplikacji pól, aby zmusić ją do przejścia weryfikacji.

Ta funkcja wtyczki „Użytkownicy” umożliwia zmianę formy:

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;
}

Następnie można użyć funkcji onUserBeforeSave, aby zresetować dowolne pola, które należy zresetować, aby przejść sprawdzanie poprawności. (Może to nie być całkowicie konieczne, więc spróbuj bez i zobacz, jakie błędy otrzymujesz).

function onUserBeforeSave($user, $isnew, $new) {
    $user['password2'] = $user['password1'];
}
David Fritsch
źródło
8

Ok, więc myślałem o podejściu bez konieczności rdzenia czegokolwiek lub instalowania rozszerzeń innych firm. Moja metoda będzie obejmowała zastąpienie szablonu, które trzeba będzie wykonać dla komponentu com_users , a konkretnie w widoku Rejestracja .

Teraz w przypadku pól (zakładając, że wszystkie ustawienia zastąpienia szablonu zostały skonfigurowane), nie będziemy ich usuwać, ale zamiast tego będziemy je ukrywać, ponieważ kontroler i modal wymagają od nich danych. Więc otwórz następujący plik, który jest teraz zastąpieniem szablonu:

templates / YOUR_TEMPLATE / html / com_users / register / default.php

i dodaj następujący kod u góry pliku zaraz po 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);

Dodałem kilka komentarzy, abyś wiedział, co robi każdy fragment kodu.

Mam nadzieję że to pomoże :)

Lodder
źródło
1

Odpowiedź DavidaFritscha była bardzo pomocna. Kilka problemów, które znalazłem, to:

Odp .: Nie można całkowicie usunąć niektórych obowiązkowych pól, ponieważ powoduje to problemy z filtrowaniem danych podczas przesyłania formularza (patrz komentarze w kodzie poniżej). Aby temu przeciwdziałać, ukryj zamiast usuwać pola z obiektu formularza. B) Zdarzenie onUserBeforeSave nie jest uruchamiane, dopóki nie jest za późno, aby zapobiec odrzuceniu przez formularz logiki sprawdzania poprawności rejestracji. Zamiast tego użyj zdarzenia onUserBeforeDataValidation.

W moim szczególnym przypadku chciałem tylko adres e-mail i hasło. Joomla wrzuciła tu jednak komplikację, ponieważ adres e-mail pojawiał się po haśle (podyktowany porządkiem pól zadeklarowanych w pliku register.xml), co wyglądałoby głupio z punktu widzenia doświadczenia użytkownika. Aby obejść ten problem, ponownie oznaczyłem pole nazwy użytkownika na „Adres e-mail”, a zamiast tego ukryłem pole adresu e-mail. Adres e-mail jest następnie domyślnie używany w nazwie użytkownika podczas przesyłania formularza.

(Drobna uwaga: ograniczyłem wtyczkę do działania tylko w formularzu „com_users.registration” dla moich celów, w porównaniu do odpowiedzi Davida, która rozważa także inne formularze).

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
źródło