Joomla-Registrierung: Entfernen Sie nicht benötigte Felder

16

Erstens ist mir diese Frage bewusst:

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

Aber der Link in seiner Antwort ist tot, und der erwähnte Dateipfad existiert in der neuesten Joomla-Version (Version 3.3) nicht, so dass die Antwort überhaupt keinen Nutzen hat.

Was ich möchte ist einfach: Das Anmeldeformular für Joomla sieht so aus:

Standardeinstellung für das Registrierungsbild

Ich möchte sicherstellen, dass der Registrierungsprozess für meine Benutzer so einfach wie möglich ist, damit sie ihn tatsächlich abschließen können, und es gibt einige Probleme:

  • Ich muss den richtigen Namen des Benutzers nicht kennen.
  • Ich möchte lieber keine "Bestätigungsboxen" haben. Der allgemeine Konsens ist, dass sie nicht notwendig sind. /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • Alles ist erforderlich, warum sich die Mühe machen, Pflichtfelder zu markieren?

Dies ist sicherlich eine weitaus bessere Registrierungsseite:

Besseres Registrierungsbild

Ich habe die Datei \ components \ com_users \ models \ forms \ registration.xml geändert , damit das Formular so aussieht, wie ich es möchte, und es hat funktioniert! Aber wenn ich das Formular abschicke, sucht die Validierung immer noch nach den fehlenden Feldern und informiert mich, dass ich einen Namen angeben muss:

"Registrierung fehlgeschlagen: Bitte geben Sie Ihren Namen ein."

Wie kann ich die Überprüfungen für das Namensfeld sowie die beiden Bestätigungsfelder deaktivieren?

Da ein Name erforderlich ist, möchte ich den Namen auf den angegebenen Benutzernamen setzen (damit Benutzername und Name standardmäßig identisch sind). Wenn der Benutzer nach der Registrierung tatsächlich einen echten Namen auf seiner Profilseite festlegen möchte , sollte dies möglich sein, dies sollte jedoch nicht erforderlich sein.

Gehe ich das falsch an? Ich habe an einigen Stellen gelesen, dass das Ändern von Kern-Joomla-Dateien nicht gut ist, da es bei einem Update zum Bruch kommen könnte und stattdessen "Overrides" verwendet werden sollten. Normalerweise verlinken diese Antworten einfach auf Joomlas Seite über Überschreibungen und geben keine weitere Erklärung darüber, wie man sie verwendet, um das zu tun, was der Fragesteller will. Ich habe versucht, sie herauszufinden, kann es aber nicht. Wenn also Überschreibungen der richtige Weg sind, erläutern Sie bitte, wie ich das mit ihnen machen würde, anstatt nur auf das Tutorial zum Überschreiben zu verweisen.

Ich würde mich sehr über jede Hilfe freuen, die Sie leisten können. Ich versuche das jetzt schon seit ein paar Stunden herauszufinden!

gfrung4
quelle
1
Ich möchte darauf hinweisen, dass JED eine mögliche Quelle für Erweiterungen ist, die so etwas tun.
Valentin Despa
@Lodder danke für die Informationen, die Sie zum Überspringen des Überprüfungsprozesses eingegeben haben, aber ich befürchte, dass dies in meiner Vorlage nicht funktioniert. Würdest du bitte den Code überprüfen und ihn mit einem funktionierenden aktualisieren? Als ich den Prozess von @Rickster verfolgte , funktionierte das wie ein Zauber. Ich bin ein Anfänger in Joomla und bitte daher um Ihre Unterstützung in dieser Hinsicht. Danke im Voraus.
Ich fand die Antwort auf diese Stackoverflow-Frage möglicherweise wie gewünscht: Deaktivieren der Validierung einiger Felder in der Joomla 3-Registrierung
Rob L

Antworten:

12

Idealerweise wird dies alles in einem Benutzer-Plugin erledigt. Ich bin mir nicht sicher, ob dies vielen Leuten bewusst ist, aber Sie können das Formular über ein Plugin bearbeiten (kein Core-Hack erforderlich).

Ebenso sieht das Plugin die Eingabe, bevor das Modell versucht, den Eintrag zu speichern, sodass Sie einige der Feldduplikationsfelder verspotten können, um zu erzwingen, dass sie die Validierung bestehen.

Mit dieser Funktion in einem "Benutzer" -Plugin können Sie die Form ändern:

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

Anschließend können Sie eine onUserBeforeSave-Funktion verwenden, um alle Felder zurückzusetzen, die Sie zurücksetzen müssen, um die Validierung zu bestehen. (Dies ist möglicherweise nicht unbedingt erforderlich. Versuchen Sie es also ohne und sehen Sie, welche Fehler angezeigt werden.)

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

Ok, also habe ich über einen Ansatz nachgedacht, ohne irgendetwas zu hacken oder Erweiterungen von Drittanbietern zu installieren. Meine Methode beinhaltet eine Vorlagenüberschreibung, die Sie für die com_users- Komponente vornehmen müssen , insbesondere für die Registrierungsansicht .

Nun zu den Feldern (vorausgesetzt, Ihre Vorlagenüberschreibung ist vollständig eingerichtet), werden diese nicht entfernt, sondern ausgeblendet, da der Controller und das Modal Daten von ihnen benötigen. Öffnen Sie also die folgende Datei, die jetzt von Ihrer Vorlage überschrieben wird:

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

und fügen Sie den folgenden Code in der Nähe des oberen Endes der Datei hinzu 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);

Ich habe einige Kommentare hinzugefügt, damit Sie wissen, was die einzelnen Codefragmente bewirken.

Hoffe das hilft :)

Lodder
quelle
1

@ DavidFritschs Antwort war sehr hilfreich. Ein paar Probleme, die ich fand, waren:

A) Sie können bestimmte Pflichtfelder nicht vollständig entfernen, da dies zu Problemen bei der Datenfilterung beim Absenden des Formulars führt (siehe Kommentare im folgenden Code). Um dem entgegenzuwirken, verstecken Sie die Felder, anstatt sie aus dem Formularobjekt zu entfernen. B) Das Ereignis onUserBeforeSave wird erst ausgelöst, wenn es zu spät ist, um zu verhindern, dass die Registrierungsüberprüfungslogik die Formularübermittlung ablehnt. Verwenden Sie stattdessen das Ereignis onUserBeforeDataValidation.

In meinem speziellen Fall war alles, was ich wollte, E-Mail-Adresse und Passwort. Joomla warf hier jedoch eine Komplikation ein, da die E-Mail-Adresse nach dem Kennwort angezeigt wurde (diktiert durch die Reihenfolge der in der Datei registration.xml deklarierten Felder), was aus Sicht der Benutzererfahrung dumm aussehen würde. Um das zu umgehen, habe ich das Feld "Benutzername" in "E-Mail-Adresse" umbenannt und stattdessen das Feld "E-Mail-Adresse" ausgeblendet. Die E-Mail-Adresse wird beim Absenden des Formulars standardmäßig als Benutzername angegeben.

(Kleinere Anmerkung: Ich habe das Plugin darauf beschränkt, für meine Zwecke nur das Formular 'com_users.registration' zu bearbeiten, im Vergleich zu Davids Antwort, die auch andere Formulare berücksichtigt.)

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
quelle