Webseiten und ZubehörProgrammierung UmsetzungPflege Backups BetreuungJoomla-Spezialist

JoomlaSchnipsel

In Joomla kann man eigene Formularfelder programmieren und mittels addfieldpath in JForm-XML-Dateien bekannt machen. Alternativ geht das in PHP mit JForm::addFieldPath(...). Was aber, wenn man für das eigene Feld einen Namen (Typ) verwendet, den Joomla schon verwendet oder eine andere zuinstallierte Erweiterung? Joomla wird das Formularfeld anzeigen, das es zuerst findet. Vielleicht das falsche.

Beispiel-Szenario

Nehmen wir an, wir haben ein Plugin namens testens geschrieben. Das soll im Backend ein Formular anzeigen, um Plugin-Einstellungen machen zu können. Es soll also diverse Formularfelder anzeigen. Ganz normal in Joomla.

Darunter befindet sich auch ein von uns selbst erstelltes JForm-Formularfeld, das ausschließlich einen fixen Text "Hallo Welt!" ausgeben soll.

Dafür haben wir ein eigenes Formularfeld vom Typ Spacer im Ordner /plugins/system/testens/myfields/ angelegt. Also dort eine Datei ereugt namens spacer.php.

<?php
defined('JPATH_PLATFORM') or die;

class JFormFieldSpacer extends JFormField
{

 protected $type = 'Spacer';

 protected function getInput()
 {
  return ' ';
 }

 protected function getLabel()
 {
  return 'Hallo Welt!';
 }
}

Unser Feld soll folgendermaßen im Formular aussehen und seinen Text ausgeben.

Ausgabe des eigenen JForm-Feldes vom Typ Spacer
Ausgabe des eigenen JForm-Feldes vom Typ Spacer

Wie man es eben so macht in Joomla-Formularen (JForms), trägt man dafür in die XML-Datei des Plugins im <config>-Block innerhalb des <fields>-Blocks mit Namen params an der Wunschposition das eigene Feld mit type="spacer" ein (Zeilen 20, 21).

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.5" type="plugin" group="system" method="upgrade">
 <name>PLG_SYSTEM_STRUCTUREDDATAGHSVS</name>

...

 <config>
  <fields name="params" addfieldpath="plugins/system/testens/myfields/">
   <fieldset name="basic">
    
...

    <field name="structureddata_only_robots" type="list" default="1"
     label="Only robots"
     description="Structured datas nur Robots zeigen">
     <option value="0">JNO</option>
     <option value="1">JYES</option>
    </field>

    <field type="spacer" name="organizationlogospacer"
     label="Egal_FUER_das_Tutorial"/>

...

   </fieldset>
  </fields>
 </config>

</extension>

Zusätzlich befindet sich in Zeile 8 der Hinweis, wo Joomla nach eigenen Formularfeldern suchen soll. Mit dieser Anweisung wird Joomla in einer Methode addPath(...)  den so hinterlegten Pfad zu unserem eigenen Feld zu bereits anderweitig gesammelten Pfaden, wo Joomla auch sucht, hinzufügen.

Und das ist die Crux in obigem Beispiel

Wir haben blöderweise nicht daran gedacht, dass im Joomla-Core ein JForm-Formularfeld vom Typ Spacer bereits existiert, das etwas anders funktioniert als unser eigenes.

Wenn Joomla bereits ein Feld vom selben Typ, also Spacer sonstwo gefunden hat, ist es ein wenig Russich Roulette, welches nun gezogen wird. Meistens gewinnt Joomla mit seinem eigenen Spacer-Feld. Manchmal auch eine ganz andere Erweiterung, dessen Ersteller blöd wie wir war.

Wie im folgenden Bild zu sehen. Da steht nicht Hallo Welt, sondern das oben im XML eingetragene Label wird durch das Spacer-Feld von Joomla ausgegeben, weil das eben Labels ausgibt und nicht festen Text. Unser eigenes Formular-Feld interessiert das Label in der XML aber gar nicht. Kann also nur Joomla sein.

Joomlaeigenes Spacer Feld gibt Label aus statt Hallo Welt
Joomlaeigenes Spacer Feld gibt Label aus statt Hallo Welt

Was kann man tun?

Individueller, unverwechselbarer Name (Typ)...

... für das eigene Formularfeld, Ich könnte es z.B. spacerghsvs nennen und die Codes und Dateinamen entsprechend umschreiben. Da ich vielleicht noch viele Erweiterungen schreiben werde, wo ich viele, aber unterschiedliche Spacerfelder programmieren werde... Weiß nicht, ob ich so kreativ bin und die Übersicht behalte. Geht aber natürlich auch und wir sind fertig.

Namespacing verwenden

Klingt vielleicht komplizierter als es ist (das ewige Los der Autodidakten, die am Ende feststellen, dass die Akademiker gelegentlich über ganz einfache Sachen reden).

In obigem XML und PHP haben wir ein Feld vom Typ spacer definiert. Die Klasse des Formularfelds (JFormFieldSpacer, Zeile 4 oben) benötigt in diesen Fällen explizit ein J vorne dran, damit Joomla es findet. Das hat einfach damit zu tun, wie Joomla die Klassennamen der Formularfelder zum Finden und Prüfen und Laden zusammensetzt.

Ändere ich in obiger XML-Datei den Typ (type) des Spacerfeldes z.B. wie folgt

<field type="testens.spacer" name="organizationlogospacer"
	label="Egal_FUER_das_Tutorial"/>

und ändere in der PHP-Datei den Klassennamen (ohne J! Bzw. das "J" durch "Testens" ersetzen, was auch klein geschrieben sein darf.)

class TestensFormFieldSpacer extends JFormField

wird ohne weitere Änderungen an Dateiname oder Inhalt der PHP-Datei das eigene Formularfeld gezogen.

Unverwechselbar ist dieser Namensraum Testens aber so nicht wirklich, also nicht wirklich eindeutig/spezifisch für mein System-Plugin testens. Auch andere Erweiterungsprogrammierer könnten auf die selbe Idee kommen, einen Namespace Testens zu verwenden.

Man sollte also abwägen und in Joomla würde sich zum Beispiel besser ein eindeutiger Namensraum PlgSystemTestens für ein System-Plugin testens im PHP-Code oben anbieten.

class PlgSystemTestensFormFieldSpacer extends JFormField

 sowie dann in der XML-Datei

<field type="PlgSystemTestens.spacer" name="organizationlogospacer"
	label="Egal_FUER_das_Tutorial"/>

 Komplett Kleinschreibung ist auch erlaubt.

PHP Formular Joomla XML Tutorial