Zugriff auf subform-Feld aus com_content.article template

  • Joomla Version
    4.4.1
    PHP Version
    PHP 8.2.x
    Hoster
    Lokal

    Hey guten Abend :)


    ich bastle gerade an einem eigenen Template weiter und habe die Subforms entdeckt. Alle Beiträge einer bestimmten Kategorie sollen zwischen Titel und Inhalt ein bestimmtes Layout eingesetzt bekommen. Jeder Beitrag hat dabei einen eigenen Inhalt in diesem Layout. Daher denke ich, dass die Subforms dafür die richtige Lösung sein könnten.


    Da ich kein Interesse daran habe generell alle "fields" zu ändern, würde ich gerne direkt aus dem Artikel-Layout darauf zugreifen.

    Code
    // html/com_content/article/
    $fields = [];
    $fhFields = FieldsHelper::getFields('com_content.article', $this->item);
    foreach ($fhFields as $field) {
        $fields[$field->name] = $field;
    }
    $subformFields = json_decode($fields['mysubformname']->rawvalue);
    foreach ($subformFields as $subformField) {
        print_r($subformField)
    }

    Das klappt schonmal ganz gut. Leider beinhalten die nun in `$subformField` enthaltenen Objekte einfach nur Felder mit Namen wie `field11` oder `field3`.


    Gibt es eine Möglichkeit hier an die "richtigen" Namen zu kommen? So wie die Felder eben auch im Adminpanel benannt habe?

  • Danke, die Links hatte ich leider bereits betrachtet. Auch hier hatte der Nutzer ringo das Problem, dass seine Felder nur "field15", usw. hießen. Ebenfalls gibt das subform, so wie ich das sehe, keine "name" properties zurück, damit ich das ganze wie in deinem zweiten Link beschrieben nochmals remappen könnte.

  • Ich bin zwar nur Laie und möglicherweise ist nachfolgendes auch akademisch völlig falsch und geht einfacher aber eventuell nützlich als Beispiel für dein obiges field3 in einem Template-Override des Hauptbeiträge-Blogs funktioniert folgender Code:



    somit wird am Ende auf dreierlei weise der Titel des selben Feldes ausgegeben.

    Das kann man natürlich stark verkürzen da man es ja nicht auf dreierlei weise braucht.

    Die ersten beiden Varianten haben den Vorteil das der Titel nur ausgegeben bzw. vorhanden ist wenn auch das Feld im Subform vorhanden ist.


    Die 8 oben ist die id des Subformfeldes und mußt du natürlich entsprechend abändern.

    Statt der 8 könnte man auch den namen des Subform-Feldes entsprechend eintragen wenn man am Anfang des Codes folgendes noch einfügt:


    Code
       foreach($this->item->jcfields as $jcfield)
         {
              $this->item->jcfields[$jcfield->name] = $jcfield;
         }
  • Jetzt klappt es, vielen Dank! Mein Fehler war es den FieldsHelper zu nutzen um die jcfields zu erhalten. Seltsamerweise hat der die Felder in einer Art und Weise ausgespuckt, die kein ->subform_rows zugelassen hat.


    Danke für's nochmal durchkauen. Komme aus einer Welt der streng typisierten Programmiersprachen, bei der mir in der IDE alle Klassen, Methoden und Properties fein säuberlich angezeigt werden. Das macht es etwas leichter. ^^

  • ...Seltsamerweise hat der die Felder in einer Art und Weise ausgespuckt, die kein ->subform_rows zugelassen hat.

    weil du anstatt:


    $fhFields = FieldsHelper::getFields('com_content.article', $this->item , true );


    in deinem Code ohne das zusätzliche true verwendt hast:


    $fhFields = FieldsHelper::getFields('com_content.article', $this->item );


    war subform_rows nicht in $fhFields vorhanden.