Custom-Field mit dynamischer Userabfrage

  • Hallo zusammen,

    auf einer lokalen Installation von Joomla 5 wurde in einem Beitrag ein Custom Field vom Typ SQL angelegt. Die wählbaren Werte sollen einer eigenen Datenbanktabelle kommen, die dynamisch anhand des gerade eingeloggten Benutzers abgefragt wird.

    Die Abfrage des Feldes lautet sinngemäß

    SQL
    SELECT feld1 AS value, feld2 AS text FROM datenbanktabelle WHERE id="USERID"

    Mittels Override des <plg_fields_sql> lässt sich der Platzhalter "USERID" durch den aktuellen User bewerkstelligen. Der userabhängige Klartext kann so bspw. in einer Kategorieliste angezeigt werden. Das funktioniert.

    Code
    $userid	= Factory::getUser()->id;
    $sql    = str_replace('"USERID"', $userid, $sql);

    Aber natürlich sollen die zulässigen Werte auch bei der Beitragsbearbeitung angezeigt werden und wählbar sein. Auch das funktioniert, wenn ich an anderer Stelle eingreife. Nämlich unter </libraries/src/Form/Field/> die Datei "SqlField.php" ändere. Der Replace mit der aktuellen UserID wird in der Funktion function getOptions() eingebaut:

    ABER: Das ist ja eine allgemein gültige Library, die im dümmsten Fall beim nächsten Update noch überschrieben wird. Ich suche also eine Möglichkeit, die SQL-Abfrage an einer spezifischeren Stelle zu ändern. Dafür habe ich schon ein eigenes CustomField als Kopie des Standard-SQL-Felds angelegt und als PlugIn installiert. Es funktioniert analog dem Standard-SQL-Feld und ruft dieselbe Library auf.

    Bin aber ratlos, wo hier was geändert werden kann. Und ob das überhaupt die richtige Stelle ist.

    Hat jemand vielleicht eine Idee?

  • Nach einigem Probieren habe ich es nun folgendermaßen gelöst.

    Es wurde eine eigenes Custom-Field auf Basis des SQL-Feldes angelegt und als Plugin installiert und aktiviert. Die Daten liegen in einem eigenen Ordner unter </plugins/fields/meinfeld>.

    Im "meinfeld"-Order gibt es wiederum den Ordner <fields> und darin das File "meinfeld.php". Die Datei beinhaltet eine Klasse zur Erweiterung der JFormFieldSql-Klasse. Dort wird die Funktion getOptions() als Kopie der gleichnamigen Funktion aus </libraries/src/Form/Field/SqlField.php> eingefügt und erweitert.

    Damit die Funktion nicht ein zweites Mal aus der libraries aufgerufen wird, noch das merge-statement auskommentieren.

  • Kenne mich nur rudimentär aus und bin nur Laie aber JFormFieldSql ist veraltet nutze daher wohl besser:


    Code
    use Joomla\CMS\Form\Field\SqlField;
    class JFormFieldSqlreplace extends SqlField

    Siehe diesbezüglich z.B. auch

    github.com/joomla/joomla-cms/blob/5.2.1/plugins/behaviour/compat/src/classmap/classmap.php#L344

  • Hallo Sieger66,

    mit php kenne ich mich etwas aus, aber mit den Joomla-Besonderheiten wie eigenen Klassen, Ordnerstrukturen etc. wurschtel ich mich so durch und bin dankbar für jeden Tipp.

    Das "extends JFormFieldSql" habe ich in einem irgendeinem Tutorial gefunden und es kann gut sein, dass das schon älter und nicht auf Joomla 5 bezogen war. Das Coding ist nun geändert und erweitert direkt die "SqlField"-Klasse.

    Merci nochmals.