Joomla-Registrierungs-Formular. Felder umsortieren.
Das Joomla-Registrierungsformular zeigt die Felder (Name, Benutzername usw.) immer in einer festen Reihenfolge an. Hat man zusätzlich eigene Felder definiert, erscheinen die bei der Standardausgabe immer unten drunter. Mit einem schnellen Code-Schnipsel-Beispiel zeige ich, wie man eine andere Reihenfolge festlegen kann bzw. Joomla-Felder und eigene mischen. Kein Silbertablett-Service!
Es gibt andere Wege Joomla-Formulare zu beeinflussen, beispielsweise mit eigenen Plugins, die ich persönlich eigentlich weitaus mehr mag als das hier gezeigte Override-Verfahren. Deshalb ist diese Anleitung auch kurz und bündig.
Vorarbeiten
- Ich arbeite mit Joomla 4. In Joomla 3 unterscheidet sich das vom Prinzip her nicht groß.
- Im Beispiel verwende ich ein schlichtes Registrierungsformular, ohne Captcha und ähnlichem. Ich weiß also nicht, inwiefern der geneigte Leser noch weiteres Hirnschmalz generieren muss, um auch solche Felder einzusetzen. Manchmal ist Joomla ja sonderlich bezüglich Konsistenz.
- Wir brauchen natürlich eine Registrierungs-Seite, auf der das joomla-eigene Formular der Komponente
com_users
angezeigt wird. - Ich habe zusätzlich im Backend zwei eigene Benutzer-Felder angelegt. "Anrede" als Pflichtfeld und "Hobby" als optionales Feld. Für beide sind die Rechte so konfiguriert, dass noch nicht registrierte Besucher sie füllen dürfen. "Inhalt von eigenen Feldern bearbeiten": Erlaubt.
- Anchließend erstelle ich einen Template-Override der Datei
components\com_users\tmpl\registration\default.php
.
Dateien und/oder Ordner neu anlegen und/oder bearbeiten und/oder Overrides per Klick erzeugen (von mir nicht empfohlen) kann man auch im Joomla-Backend im Template-Editor. J!3: Menü Erweiterungen > Templates > Templates. J!4: Menü System > Blöd rumsuchen > Site Templates. In beiden danach auf den verlinkten Templatetitel klicken. Im Template-Editor kann man jedoch nur auf Dateien und Verzeichnisse innerhalb des jeweiligen Template-Ordners und ggf. dem zugehörigen /media/-Ordner (Joomla 4) zugreifen! Nicht alle Dateitypen werden angezeigt.
Override bearbeiten
Die Ordnerangabe /DEINTEMPLATE/
meint den Ordner, in dem das zu bearbeitende Template liegt. Jedes hat ja einen eigenen Namen und Ordner.
Am Beispiel eines Frontend-Templates namens "bs4ghsvs":
/templates/bs4ghsvs/
In der neuen Datei templates\DEINTEMPLATE\html\com_users\registration\default.php
füge ich nach den einleitenden use
-Zeilen den folgenden Code-Block ein.
- Dieser sammelt alle Formularfelder in einem Array
$allFields
. Dabei werden eindeutige Array-Schlüssel/-Indices/-Keys verwendet, die später relevant sind für die Ausgabe der einzelnen Felder. - Zeile 3: Joomla hat alle Felder in Gruppen bzw. Fieldsets unterteilt. Die Standardfelder befinden sich in einem Fieldset namens
default
, eigene Felder meist, aber nicht verlässlich, in einem Fieldset namensfields-0
. Verwendet man im Backend zusätzlich Feldgruppen zur Gliederung der eigenen Felder kommen weitere, anders benannte Fieldsets hinzu. Also durchläuft der Code alle Fieldsets des Formular-Objektes. - Zeile 5 holt sich alle Felder im gerade aktuellen Fieldset. In Zeile 7 wird ein Feld nach dem anderen "abgegriffen" und in Zeile 9 schließlich in unserem Array
$allFields
zwischengespeichert. - Zeile 12 wird uns gleich eine Info ausgeben, welche der gesammelten Felder welchen Array-Index bekommen haben.
$allFields = array();
foreach ($this->form->getFieldsets() as $fieldset)
{
$fields = $this->form->getFieldset($fieldset->name);
foreach ($fields as $field)
{
$allFields[$fieldset->name . '.' . $field->fieldname] = $field;
}
}
echo ' Orientierung. Array-Keys <pre>' . print_r(array_keys($allFields), true) . '</pre>';exit;
Feldbezeichner indentifizieren
Rufe ich mein Registrierungsformular nun im Frontend auf, sehe ich etwas in dieser Art:
Orientierung. Array-Keys
Array
(
[0] => default.spacer
[1] => default.name
[2] => default.username
[3] => default.password1
[4] => default.password2
[5] => default.email1
[6] => fields-0.anrede
[7] => fields-0.hobby
)
Das kopiere ich mir in einen Texteditor zum späteren "Abspicken".
Anschließend entferne ich diese Zeile aus meinem Code oben:
echo ' Orientierung. Array-Keys <pre>' . print_r(array_keys($allFields), true) . '</pre>';exit;
Felder in eigener Reihenfolge ausgeben
Im Override lösche ich diesen Block:
<?php // Iterate through the form fieldsets and display each one. ?>
<?php foreach ($this->form->getFieldsets() as $fieldset) : ?>
<?php $fields = $this->form->getFieldset($fieldset->name); ?>
<?php if (count($fields)) : ?>
<fieldset>
<?php // If the fieldset has a label set, display it as the legend. ?>
<?php if (isset($fieldset->label)) : ?>
<legend><?php echo Text::_($fieldset->label); ?></legend>
<?php endif; ?>
<?php echo $this->form->renderFieldset($fieldset->name); ?>
</fieldset>
<?php endif; ?>
<?php endforeach; ?>
Und ersetze ihn durch meine eigene Ausgabe:
<?php
echo $allFields['default.spacer']->renderField();
echo $allFields['fields-0.anrede']->renderField();
echo $allFields['default.name']->renderField();
echo $allFields['fields-0.hobby']->renderField();
echo $allFields['default.username']->renderField();
echo $allFields['default.password1']->renderField();
echo $allFields['default.password2']->renderField();
echo $allFields['default.email1']->renderField();
?>
Ich verwende also die Array-Keys aus meinem "Spickzettel" oben.
Beachte, dass keines der joomla-üblichen Pflichtfelder fehlen darf! Sie müssen ebenfalls immer vorhanden sein, sonst kann man die Registrierung nicht erfolgreich abschließen.
Mein erfolgreich getestetes Beispielformular