Frontend: Mehrere XML-Formdeklarationen laden und in View bereitstellen

  • Hallo zusammen,


    ich würde gerne Duplikate in den Formdeklarationen einsparen und daher würde ich gerne mehrere XML-Formdeklarationen in einer View einbinden.


    Bisher nutze ich folgendes:



    Hier gibt es in /models/forms entsprechend die comment.xml.


    Wie würde ich nun vorgehen, wenn ich nun auch Elemente aus einer user.xml in der View einbinden wollen würde?


    Freue mich über eure Antworten und wünsche frohe Ostern!

  • Ich mach so was über Plugins (public function onContentPrepareForm($form, $data)) sollte aber wohl auch anderswo so gehen.
    3 Varianten aus einem Demo-Plugin von mir


  • Vielen Dank. Ich habe es nun etwas weniger dynamisch gelöst bekommen:

    Code
    /** * getCommentForm function. *  * @access public * @param array $data (default: array()) * @param bool $loadData (default: true) * @return void */public function getCommentForm($data = array(), $loadData = true){    $form            =         $this->loadForm('com_bestia.Comment', 'comment', array('control' => 'jform', 'load_data' => $loadData));    if (empty($form))    {        return false;    }    return $form;}/** * getUserForm function. *  * @access public * @param array $data (default: array()) * @param bool $loadData (default: true) * @return void */public function getUserForm($data = array(), $loadData = true){    $form            =         $this->loadForm('com_bestia.user', 'user', array('control' => 'jform', 'load_data' => $loadData));    if (empty($form))    {        return false;    }    return $form;}


    Dies habe ich dann in der view.html.php so eingebunden:


    Code
    $this->commentform    =    $this->get('CommentForm'); 
            $this->userform        =    $this->get('UserForm');
  • Deine Lösung werde ich auf jeden Fall auch antesten, vielen Dank noch mal :)


    kann es sein, dass die showon-Methode (in der XML-Formdeklaration) im Frontend nicht funktioniert?

  • Sollte funktionieren.


    Im Normalfall extenden ja alle Formularfelder letztlich
    libraries/joomla/form/field.php (JFormField)


    Dort wird $options['showonEnabled'] = true; neben anderem gesetzt. Wichtig noch das dort gesetzte vorbereitete $options['rel'] (data-showon=usw.)


    Dann im Normalfall von dort weitergereicht an JLayout /layouts/joomla/form/renderfield.php (Wird Frontend und Backend verwendet) oder Template/Komponenten-Override dieses JLayouts.


    Das muss dann JQuery-JavaScript cms.js laden und rel setzen wie im o.g. renderfield.php zu sehen.

  • Hm, okay...


    Ich stelle leider fest, dass bei folgender Konfiguration



    Das Feld "testtest" wird allerdings immer eingeblendet. Das sollte eigentlich nichts mit dem Thema auf GitHub zu tun haben, oder? Beide Felder stehen im gleichen Fieldset.

  • Hm, ich weiß nun nicht, ob ich Dich richtig verstehe:


    Aktuell nutze ich folgendes


    PHP
    <?php foreach($this->userform->getFieldset('contact') as $field) : ?>
    <div class="col-sm-3"><label for="<?php echo $field->name; ?>"><?php echo $field->label; ?></label></div>
    <div class="col-sm-9"><?php echo $field->input; ?></div>
    <?php endforeach; ?>


    Wie müsste ich das nun anpassen?

  • Vorab: Ursprünglich waren die JLayouts ja gedacht, es auch Normalusern einfach möglich zu machen, Overrides für häufig verwendete Elemente zu erstellen, in diesem Fall für Ausgabe Formularfelder. Daraus geworden ist teils ein vollkommen verquastes, intransparentes vonDateiZuDateiGehangel, bevor man rausbekommt, welches JLayout jetzt eigentlich gezogen wird oder um am Ende die verwendbaren Optionen/Variablen herauszubekommen. Es gibt nämlich oft weitaus mehr als dann im JLayout via $displayData landen. Und dieses extract() ist zusätzlich unnötige, echte Seuche... Egal. Vorgemaule. War mal wieder nötig ;)


    Also:
    Für /layouts/joomla/form/renderfield.php erzeugst du einen Override.
    Folgende Pfade können dafür verwendet werden, also auch Komponente
    [0] => templates/mytemplate/html/layouts/com_mycomponent
    [1] => components/com_mycomponent/layouts
    [2] => templates/mytemplate/html/layouts


    Diesen passt an Bootstrap 3 an: col-sm-3 usw.


    In deinem Code oben ersetzt Zeilen 2 und 3 durch
    $field->renderField();
    Denke das klappt, außer das spezifische Formularfeld überschreibt nun wieder renderfield und/oder setzt ein anderes JLayout via $this->renderLayout


    Ob das JLayout /layouts/joomla/form/renderlabel.php ebenfalls gezogen wird und relevant ist, weiß ich nicht mehr und hab auch gerade keine Lust auf Gehangel ;) Hilft nur ausprobieren.

  • Hallo und vielen Dank für Deine Mühen.


    Ich verstehe es aber auch richtig, dass folgendes auch ohne Override erst einmal grundsätzlich funktionieren müsste oder?


    $this->userform->renderFieldset('contact');


    Wenn ich das mache werden die einzelnen Felder zwar wieder ausgegeben (ohne foreach-Schleife im Layout-File, also ist das schon einmal nett), aaaaber das Showon funktioniert weiterhin nicht. Das Feld bleibt nach wie vor standardmäßig eingeblendet und verschwindet auch nicht, egal was im Dropdownfeld (welches ja die Bedingung darstellen sollte) ausgewählt ist.

  • Ich habe es mit einem Kontaktformular einer Seite, die ebenfalls Bootstrap3 hat, gestern getestet.


    In die contact.xml deine beiden Felder oben in fieldset=contact.


    In contact_form.php die ganzen Feldausgaben ersetzt dutch

    Code
    echo $this->form->renderFieldset('contact');


    Funktioniert.
    Im Quelltext: cms.js geladen.
    Im HTML ein JSON-kodiertes data-showon fürs testtest-Input:

    Code
    <div class="control-group"  data-showon='[{"field":"jform[title]","values":["dr"],"op":""}]'>




    Was gibts jetzt noch. JavaScriptfehler: Webkonsole im Browser prüfen.
    Mehrere Felder mit selbem name oder selber id.
    Generell Verwirrung durch doppelte IDs, names etc., die ja pro Seite eindeutig sein müssen.


    Vielleicht erst mal rudimentäres Formular aufbauen, nur mit diesen beiden Feldern und nur mit 1 Formular testen. Dann schrittweise hochbauen.