Registrazione Joomla: rimuove i campi non necessari


16

Innanzitutto, sono a conoscenza di questa domanda:

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

Ma il link nella sua risposta è morto e il percorso del file menzionato non esiste nell'ultima versione di Joomla (versione 3.3), quindi la risposta non è di alcuna utilità.

Quello che voglio è semplice: il modulo di registrazione per Joomla è simile al seguente:

immagine di registrazione predefinita

Voglio garantire che il processo di registrazione sia il più semplice possibile per i miei utenti in modo che lo completino effettivamente e ci siano alcuni problemi:

Sicuramente questa è una pagina di registrazione molto migliore:

migliore immagine di registrazione

Ho modificato il file \ componenti \ com_users \ modelli \ forme \ registration.xml per fare in modo che il modulo assomigli a quello che voglio, e ha funzionato! Ma ogni volta che invio il modulo, la convalida cerca ancora i campi mancanti, quindi mi informa che devo fornire un nome:

"Registrazione non riuscita: inserisci il tuo nome."

Come posso disabilitare i controlli per il campo del nome, così come i due campi di conferma?

Poiché è richiesto un nome, vorrei impostare il nome sul nome utente fornito (quindi nome utente e nome sono gli stessi per impostazione predefinita). Se l'utente desidera effettivamente impostare un nome reale nella pagina del suo profilo dopo la registrazione, dovrebbe essere in grado di farlo, ma non dovrebbe essere richiesto.

Sto andando in questo modo nel modo sbagliato? Ho letto in alcuni punti che la modifica dei file Joomla di base non è buona, in quanto potrebbe interrompersi in un aggiornamento e che invece dovrebbero essere utilizzati "override". Di solito queste risposte si collegano semplicemente alla pagina di Joomla sulle sostituzioni e non forniscono ulteriori spiegazioni su come usarle per fare ciò che chi desidera. Ho provato a capirli, ma non ci riesco, quindi se le sostituzioni sono la strada da percorrere, ti preghiamo di spiegare come farei per fare questo con loro, piuttosto che collegarmi al tutorial di sostituzione.

Apprezzerei molto qualsiasi aiuto tu possa fornire, sto provando a capirlo da qualche ora!


1
Vorrei sottolineare JED come una possibile fonte di estensioni facendo qualcosa del genere.
Valentin Despa,

@Lodder grazie per le informazioni che hai inserito per saltare il processo di convalida, ma temo che non funzioni nel mio modello. Per favore, controlla il codice e aggiorna con quello funzionante? Mentre seguivo il processo di @Rickster e questo ha funzionato come un fascino. Sono alle prime armi in joomla e, pertanto, chiedo la tua assistenza in tal senso. Grazie in anticipo.

Ho trovato la risposta a questa domanda StackOverflow potrebbe essere quello che vuoi: Come disabilitare la convalida di alcuni campi nella registrazione di Joomla 3
Rob L

Risposte:


12

Idealmente, tutto ciò avverrà in un plug-in utente. Non sono sicuro che molte persone lo capiscano, ma è possibile modificare il modulo da un plug-in (non è richiesto alcun hack di base).

Allo stesso modo, il plug-in vedrà l'input prima che il modello tenti di salvare la voce, quindi puoi deridere alcuni dei campi di duplicazione del campo per forzarlo a superare la convalida.

Questa funzione in un plug-in "utenti" consente di modificare il modulo:

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

Quindi è possibile utilizzare una funzione onUserBeforeSave per ripristinare uno dei campi che è necessario ripristinare per passare la convalida. (Questo potrebbe non essere del tutto necessario, quindi prova senza e vedi quali errori ricevi.)

function onUserBeforeSave($user, $isnew, $new) {
    $user['password2'] = $user['password1'];
}

8

Ok, quindi stavo pensando a un approccio senza dover hackerare nulla o installare estensioni di terze parti. Il mio metodo prevede una sostituzione del modello che dovrai creare per il componente com_users , in particolare la vista Registrazione .

Ora per i campi (supponendo che la sostituzione del modello sia tutta configurata), non li rimuoveremo, ma invece li nasconderemo poiché il controller e il modale richiedono dati da essi. Quindi apri il seguente file che ora è il tuo modello override:

templates / tuo_template / html / com_users / registrazione / default.php

e aggiungi il seguente codice vicino all'inizio del file subito dopo 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);

Ho aggiunto alcuni commenti in modo da sapere cosa sta facendo ogni frammento di codice.

Spero che sia di aiuto :)


1

@La risposta di DavidFritsch è stata molto utile. Un paio di problemi che ho riscontrato sono stati:

A) Non è possibile rimuovere completamente determinati campi obbligatori in quanto causa problemi con il filtraggio dei dati all'invio del modulo (vedere i commenti nel codice seguente). Per combattere questo, nascondere invece di rimuovere i campi dall'oggetto modulo. B) L'evento onUserBeforeSave non viene generato fino a quando non è troppo tardi per impedire alla logica di convalida della registrazione di rifiutare l'invio del modulo. Utilizzare invece l'evento onUserBeforeDataValidation.

Nel mio caso particolare, volevo solo l'indirizzo e-mail e la password. In questo caso, Joomla ha creato una complicazione, poiché l'indirizzo e-mail appariva dopo la password (dettata dall'ordine dei campi dichiarati nel file registration.xml), che sarebbe sembrato stupido dal punto di vista dell'esperienza dell'utente. Per ovviare a ciò, ho rietichettato il campo del nome utente in "Indirizzo e-mail" e invece ho nascosto il campo dell'indirizzo e-mail. L'e-mail viene quindi predefinita dal nome utente al momento dell'invio del modulo.

(Nota minore: ho limitato il plug-in per operare solo sul modulo 'com_users.registration' per i miei scopi, rispetto alla risposta di David che considera anche altre forme.)

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.