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.
Zwei oder mehr Benutzer-Felder im Joomla-Backend erstellen. Beispielsweise "Anrede" und "Hobby".
  • Anchließend erstelle ich einen Template-Override der Datei components\com_users\tmpl\registration\default.php.

Dateien und Ordner anlegen/bearbeiten oder neue Overrides per Klick erzeugen 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 zugreifen!

Override bearbeiten

Der Ordnerangabe /DEINTEMPLATE/ meint den Ordner, in dem das zu bearbeitende Template liegt. Jedes hat ja einen eigenen Namen und Ordner.

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 namens fields-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;
In Joomla 3 kann man die Code-Zeilen z.B. nach den beiden JHtml-Zeilen am Anfang der Datei einfügen. Hauptsache "früh". In Joomla 4 sinds halt HTMLHelper-Zeilen wie im Bild.

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