Inscription Joomla: Supprimez les champs inutiles

16

Tout d'abord, je suis conscient de cette question:

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

Mais le lien dans sa réponse est mort, et le chemin de fichier mentionné n'existe pas dans la dernière version de Joomla (version 3.3), donc la réponse est d'aucune utilité.

Ce que je veux, c'est simple: le formulaire d'inscription pour Joomla ressemble à ceci:

image d'enregistrement par défaut

Je veux m'assurer que le processus d'inscription est aussi simple que possible pour mes utilisateurs afin qu'ils le terminent réellement, et il y a quelques problèmes:

  • Je n'ai pas besoin de connaître le vrai nom de l'utilisateur.
  • Je préfère ne pas avoir de cases "confirmer". Le consensus général est qu'ils ne sont pas nécessaires. /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • Tout est requis, pourquoi s'embêter à marquer les champs obligatoires?

C'est sûrement une page d'inscription bien meilleure:

meilleure image d'enregistrement

J'ai modifié le fichier \ components \ com_users \ models \ forms \ registration.xml pour que le formulaire ressemble à ce que je veux, et cela a fonctionné! Mais chaque fois que je soumets le formulaire, la validation recherche toujours les champs manquants, donc cela m'informe que je dois fournir un nom:

"L'inscription a échoué: veuillez entrer votre nom."

Comment puis-je désactiver les vérifications pour le champ de nom, ainsi que les deux champs de confirmation?

Puisqu'un nom est requis, je voudrais définir le nom sur le nom d'utilisateur fourni (donc le nom d'utilisateur et le nom sont les mêmes par défaut). Si l'utilisateur souhaite réellement définir un vrai nom dans sa page de profil après l' enregistrement, il devrait pouvoir le faire, mais cela ne devrait pas être obligatoire.

Suis-je en train de mal faire ça? J'ai lu à certains endroits que la modification des fichiers Joomla de base n'est pas bonne, car cela pourrait interrompre une mise à jour, et que des "remplacements" devraient être utilisés à la place. Habituellement, ces réponses renvoient simplement à la page de Joomla sur les remplacements et ne fournissent aucune explication plus détaillée sur la façon de les utiliser pour faire ce que le demandeur veut. J'ai essayé de les comprendre, mais je ne peux pas, donc si les remplacements sont le chemin à parcourir, veuillez expliquer comment je procéderais avec eux, plutôt que de simplement me lier au didacticiel de remplacement.

J'apprécierais grandement toute aide que vous pourriez fournir, j'essaie de comprendre cela depuis quelques heures maintenant!

gfrung4
la source
1
Je voudrais souligner JED comme une source possible d'extensions faisant quelque chose comme ça.
Valentin Despa
@Lodder merci pour les informations que vous avez insérées pour ignorer le processus de validation, mais je crains que cela ne fonctionne pas dans mon modèle. Souhaitez-vous s'il vous plaît vérifier le code et mettre à jour avec un travail? Comme j'ai suivi le processus de @Rickster et cela a fonctionné comme un charme. Je suis novice à Joomla et par conséquent, je demande votre aide à cet égard. Merci d'avance.
J'ai trouvé que la réponse à cette question Stackoverflow était peut-être ce que vous vouliez: comment désactiver la validation de certains champs dans l'enregistrement Joomla 3
Rob L

Réponses:

12

Idéalement, tout cela se fera dans un plugin utilisateur. Je ne suis pas sûr que beaucoup de gens le réalisent, mais vous pouvez modifier le formulaire à partir d'un plugin (aucun hack de base requis).

De même, le plugin verra l'entrée avant que le modèle ne tente d'enregistrer l'entrée, vous pouvez donc vous moquer de certains champs de duplication de champ pour le forcer à passer la validation.

Cette fonction dans un plugin "utilisateurs" vous permet de modifier la forme:

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

Ensuite, vous pouvez utiliser une fonction onUserBeforeSave pour réinitialiser l'un des champs que vous devez réinitialiser pour réussir la validation. (Cela peut ne pas être totalement nécessaire, alors essayez sans et voyez quelles erreurs vous obtenez.)

function onUserBeforeSave($user, $isnew, $new) {
    $user['password2'] = $user['password1'];
}
David Fritsch
la source
8

D'accord, je pensais à une approche sans devoir pirater quoi que ce soit ni installer d'extensions tierces. Ma méthode impliquera une substitution de modèle que vous devrez effectuer pour le composant com_users , en particulier la vue Registration .

Maintenant, pour les champs (en supposant que votre remplacement de modèle est entièrement configuré), nous ne les supprimerons pas, mais les cacherons car le contrôleur et le modal nécessitent des données d'eux. Ouvrez donc le fichier suivant qui est maintenant le remplacement de votre modèle:

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

et ajoutez le code suivant en haut du fichier juste après 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);

J'ai ajouté quelques commentaires afin que vous sachiez ce que fait chaque extrait de code.

J'espère que cela t'aides :)

Lodder
la source
1

@ La réponse de DavidFritsch a été très utile. Cependant, j'ai trouvé quelques problèmes:

A) Vous ne pouvez pas supprimer complètement certains champs obligatoires car cela pose des problèmes avec le filtrage des données lors de la soumission du formulaire (voir les commentaires dans le code ci-dessous). Pour lutter contre cela, cachez plutôt que supprimez les champs de l'objet formulaire. B) L'événement onUserBeforeSave n'est déclenché que trop tard pour empêcher la logique de validation d'inscription de rejeter la soumission du formulaire. Utilisez plutôt l'événement onUserBeforeDataValidation.

Dans mon cas particulier, tout ce que je voulais, c'était une adresse e-mail et un mot de passe. Joomla a cependant ajouté une complication ici, car l'adresse e-mail apparaissait après le mot de passe (dictée par l'ordre des champs déclarés dans le fichier registration.xml), ce qui serait stupide du point de vue de l'expérience utilisateur. Pour contourner ce problème, j'ai renommé le champ du nom d'utilisateur en «Adresse e-mail» et j'ai masqué le champ de l'adresse e-mail. L'e-mail est ensuite transféré par défaut à partir du nom d'utilisateur lors de la soumission du formulaire.

(Remarque mineure: j'ai restreint le plugin pour qu'il fonctionne uniquement sur le formulaire 'com_users.registration' à mes fins, par rapport à la réponse de David qui considère également d'autres formes.)

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
la source