web-dev-qa-db-fra.com

Enregistrement Joomla: Supprimez les champs inutiles

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

https://stackoverflow.com/questions/14799733/remove-name-field-from-joomla-registration-form

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

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

registration image default

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

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

better registration image

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. Elle me signale donc que je dois fournir un nom:

"Échec de l'inscription: veuillez entrer votre nom."

Comment puis-je désactiver les vérifications du champ de nom ainsi que des deux champs de confirmation?

Puisqu'un nom est requis, j'aimerais définir le nom avec le nom d'utilisateur fourni (le nom d'utilisateur et le nom sont donc identiques par défaut). Si l'utilisateur veut réellement définir un vrai nom dans sa page de profil après enregistrement, il devrait pouvoir le faire, mais cela ne devrait pas être obligatoire.

Est-ce que je m'y prends mal? J'ai lu à certains endroits que la modification de fichiers Joomla principaux n'est pas bonne, car cela pourrait entraîner une mise à jour et que les "remplacements" devraient être utilisés à la place. Habituellement, ces réponses renvoient simplement à la page de Joomla sur les substitutions et ne fournissent aucune explication supplémentaire sur la façon de les utiliser pour faire ce que le demandeur veut. J'ai essayé de les comprendre, mais je ne le peux pas. Par conséquent, si les substitutions sont la solution, expliquez-moi comment je pourrais y parvenir, plutôt que de simplement créer un lien vers le didacticiel sur les substitutions.

J'apprécierais énormément toute aide que vous pourriez fournir. J'essaie de comprendre cela depuis quelques heures maintenant!

16
gfrung4

Idéalement, tout cela sera fait dans un plugin utilisateur. Je ne suis pas sûr que beaucoup de gens s'en rendent compte, mais vous pouvez éditer le formulaire à partir d'un plugin (aucun piratage de base requis).

De même, le plug-in voit l'entrée avant que le modèle ne tente de l'enregistrer. Vous pouvez donc vous moquer de certains des champs de duplication de champs pour le forcer à réussir la validation.

Cette fonction dans un plugin "utilisateurs" vous permet de modifier le formulaire:

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

Vous pouvez ensuite utiliser une fonction onUserBeforeSave pour réinitialiser les champs à réinitialiser pour passer 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'];
}
12
David Fritsch

Ok, je pensais donc à une approche sans avoir à pirater quoi que ce soit ou à installer des extensions tierces. Ma méthode impliquera un Template Override que vous devrez créer pour le composant com_users , en particulier le Enregistrement vue.

Maintenant, pour les champs (en supposant que votre remplacement de modèle soit entièrement configuré), nous ne les supprimerons pas, mais nous les cacherons car le contrôleur et le modal exigent des données. Alors ouvrez le fichier suivant qui est maintenant votre remplacement de template:

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

et ajoutez le code suivant dans la partie supérieure 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é certains commentaires afin que vous sachiez ce que chaque extrait de code est en train de faire.

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

8
Lodder

La réponse de @ DavidFritsch a été très utile. Quelques problèmes que j'ai cependant trouvés étaient:

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

Dans mon cas particulier, tout ce que je voulais, c'était une adresse électronique et un mot de passe. Joomla a cependant introduit une complication ici, puisque l'adresse e-mail apparaissait après le mot de passe (dicté par l'ordre des champs déclarés dans le fichier registration.xml), ce qui aurait l'air daft du point de vue de l'expérience utilisateur. Pour contourner ce problème, j'ai renommé le champ de nom d'utilisateur en 'Adresse électronique' et ai masqué le champ d'adresse électronique. Le courrier électronique est alors défini par défaut à partir du nom d'utilisateur lors de la soumission du formulaire.

(Remarque mineure: j'ai limité le plugin à n'utiliser que le formulaire 'com_users.registration' pour mes besoins, par rapport à la réponse de David qui considère également d'autres formulaires.)

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

}
1
John Rix