JoomlaCamp 2018 Essen - 03.02.2017 in Essen

Custom Form Field Type, Rückgabewert bei Submit

    Custom Form Field Type, Rückgabewert bei Submit

    Hallo zusammen,

    ich programmiere eine Komponente. In Backend werden Daten eingetragen. Im FrontEnd (noch nicht programmiert) sollen die Daten dann auf eine spezielle Weise angezeigt werden. Änderungen sind nur im Backend möglich.
    Im Backend habe ich mir also ein eigenes Formular-Element erstellt. Das stellt die 7 Wochentage dar, und hakt die an, die im Datensatz hinterlegt sind.
    Im Datensatz in der DB sind die auf die Weise "Mo,Do,Fr" hinterlegt.
    Beim Einlesen mache ich daraus ein Array (mit explode(",") ). Das stelle ich dann entsprechend dar. Alles bis hier hin kein Problem.

    Beim Speichern der Werte (also beim Abschicken des Formulars) muss ich die übertragenen Werte ja wieder in das Format für die Datenbank bringen (also komma-separieren).
    Ich finde einfach keine Informationen, wie ich das nun bewerkstellige.

    Ich habe es so weit geschafft, dass einzelnen Checkboxen mit dem Status ("on" oder <leer>) im $this->input->get('jForm',array(),'ARRAY') auftauchen.
    Doch wie schaffe ich es, die einzelnen Checkboxen, die auf "on" stehen, zu verbinden (PHP-Funktion implode() ) und den Rest in die Datenbank zu bekommen? Welche Funktion(en) muss ich dafür überschreiben?

    Ich benutze JModelAdmin, JFormFieldList und JControllerForm. Die einzelnen Checkboxen heißen "chk_Mo" bis "chk_So".

    Hier ein Code-Schnippsel von mir. Ich wollte jetzt nicht *alles* posten, das würde erstmal den Rahmen sprengen:

    Quellcode

    1. class AppointmentsControllerAppointment extends JControllerForm
    2. {
    3. function save($key = NULL, $urlVar = NULL)
    4. {
    5. $formdata = JFactory::getApplication()->input->get('jForm','','ARRAY');
    6. $chk=array();
    7. if($this->input->getString('chk_Mo'))
    8. $chk[]="Mo";
    9. if($this->input->getString('chk_Di'))
    10. $chk[]="Di";
    11. if($this->input->getString('chk_Mi'))
    12. $chk[]="Mi";
    13. if($this->input->getString('chk_Do'))
    14. $chk[]="Do";
    15. if($this->input->getString('chk_Fr'))
    16. $chk[]="Fr";
    17. if($this->input->getString('chk_Sa'))
    18. $chk[]="Sa";
    19. if($this->input->getString('chk_So'))
    20. $chk[]="So";
    21. $chk = implode($chk, ",");
    22. $key = $formdata->get('id',0);
    23. parent::save($key,$urlVar);
    24. }
    25. }



    Ich hoffe auf eure Tips und Lösungsvorschläge.

    Viele Grüße,
    xola
    Anscheinend versteht niemand das Problem, ich auch nicht. Jedenfalls weiss ich nicht recht was ich antworten soll.
    Du nimmst die Daten aus deinem Formular entgegen, hier im Controler, und das funktioniert? Auch das speichern?
    Oder nicht?
    Und kannst den Satz dann nicht mehr lesen?

    Ich würde das anders anlegen, mit einem JFormField checkboxes, dann ginge alles sozusagen automatisch.

    Auf welcher Basis entwicklst du eine Komponente? Welches Tutorial?
    Grüße, Christiane
    ----------------
    JUG München | | Wicked Software - Blog
    Hallo,

    vielen Dank für die Antwort. Und Entschuldigung für die späte Rückmeldung. Hatte relativ lange einen Auslandsaufenthalt.

    Okay ich kann verstehen, dass die Informationen nicht ausreichen. Ich versuche es, besser zu formulieren.

    Erstens, die Anleitung die ich benutze ist diese hier: docs.joomla.org/J3.x:Developin…nt/Adding_backend_actions
    Das Problem liegt allerdings nicht in der Anleitung. Mein Problem, das ich habe, wird in der Anleitung gar nicht aufgefasst.

    Meine Komponente, die ich programmiere, heißt "com_appointments". Es soll ein einfacher Terminplaner werden. Nichts großes. Administratoren können im Backend Termine einpflegen (z.B. "Party am Freitag bei mir"), genauso auch wiederholende Termine (z.B. "Mittwoch-Training der Jugendmannschaft").
    Auch wöchentliche Wiederholungen von mehreren Tagen in der Woche sind möglich (z.B. "Wöchentlich Dienstag und Donnerstags den Müll rausbringen").

    Die Datenbanktabelle für die Komponente hat ein Feld "repeat_days". Darin sind die Wiederholungstage komma-getrennt gespeichert. Für das letzte o.g. Beispiel (das mit dem Müll rausbringen) ist das dann also "Di,Do".

    Das wird im Backend wie folgt dargestellt:
    picload.org/view/ddoroail/grafik.png.html

    Für die Checkboxen habe ich ein eigenes Form Field erstellt und es "Weekdays" genannt. Der Code dafür sieht aktuell noch so aus:

    PHP-Quellcode

    1. <?php
    2. // No direct access to this file
    3. defined('_JEXEC') or die('Restricted access');
    4. jimport('joomla.form.formfield');
    5. jimport('joomla.form.helper');
    6. JFormHelper::loadFieldClass('list');
    7. class JFormFieldWeekdays extends JFormFieldList {
    8. protected $type = 'Weekdays';
    9. public function getInput() {
    10. $checked = explode(",",$this->form->getData()->get('repeat_days'));
    11. foreach($this->options as $opt)
    12. {
    13. $ret .= '<input id="jForm[chk_'.$opt->value.']" type="checkbox" name="jForm[chk_'.$opt->value.']"';
    14. if(in_array($opt->value, $checked))
    15. {
    16. $ret .= " checked";
    17. }
    18. $ret .= '>';
    19. $ret .= '<label for="'.$opt->value.'" style="display:inline;"> '.$opt->text.'</label>';
    20. $ret .= '<div></div>';
    21. }
    22. return $ret;
    23. }
    24. }


    Natürlich stellt sich die Frage, warum ich nicht den Typ "Checkboxes" wähle. Aus dem einfachen Grund, da in der Dokumentation zu dem Form Feld steht, dass es nicht in der Lage ist, die angehakten Elemente an die Datenbank zu geben: docs.joomla.org/Checkboxes_form_field_type
    The checkboxes form field type provides a set of checkboxes.

    Note: unlike most standard form field types, such as textfield or checkbox,
    this field is not an "out of the box" solution. It will create
    checkboxes for you, and submit their values in form of an array, but it
    will not store them in the database.


    In meiner Programmierung werden beim Speichern bislang keine Wochentage in die Datenbank geschrieben. Genau das will ich nun erreichen, weiß aber nicht, wie.

    Ich vermute, dass ich dafür die save-Methode im Controller überschreiben muss. Das wäre mein Code vom ersten Beitrag. Komme hier aber nicht weiter.

    Ich hoffe es ist jetzt verständlich.

    Viele liebe Grüße,
    xola

    xola schrieb:

    Was meinst du mit der chosen-Formatierung? Finde leider kaum was dazu...

    Sieht man doch in Joomla überall, bspw. Multiple-Listen in Schlagwortefeldern oder wo man mehrere Kategorien auswählen kann oder neuerdings auch in den Suchwerkzeugen unter Beiträge als multiple...

    Quellcode

    1. // Load chosen.
    2. JHtml::_('formbehavior.chosen', 'select');

    (macht aus jeder Select-Box (Liste) eine chosen (chzn)-Auswahl.

    Quellcode

    1. // Load chosen.
    2. JHtml::_('formbehavior.chosen', '.dings');

    (nur aus Select-Box mit class="dings").

    Ohne multiple jede Select-Box im Joomla-Backend seit Joomla 3, bspw. Positionsauswahl in Modulen usw.

    Hat dann auch gleich noch schicke Suchfunktion drinnen
    Joomla-Fachmann: ghsvs.de

forum.joomla.de is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters the trademark holder in the United States and other countries.