Subform in Datenbank speichern

  • Hallo,


    ich entwickle gerade eine Komponente, wo Informationen für Trainingsbereiche eingegeben werden. Um zu den Trainingsbereichen Räume zuzuordnen, habe ich gedacht das wiederkehrende Subform-Feld einzusetzen. Es klappt wunderbar das ich im Formular mehre Räume hinzufügen kann.


    Ich habe folgende Tabellen:


    training

    • id
    • name
    • description

    room

    • id
    • room
    • description

    training_room

    • id
    • training_id
    • room_id

    Nun meine Frage: Wie kann ich die eingegebenen Daten aus dem Subform-Feldern in die Datenbank speichern? Die Daten aus dem Subform sollen in die Tabelle training_room gespeichert werden.


    Schon einmal vielen Dank für eure Antworten.

  • Kannst du genauer sagen wo du das Problem hast?
    Du bekommst die Daten als Array. Das musst du nun durchlaufen, Objekte draus machen und die kannst du in deine Tabellen speichern (insertObject, updateObject).
    Automatisch geht hier nichts, falls du das meinst. Speichern, ändern und löschen dieser Tabellen(einträge) ist Handarbeit.

  • Vielen Dank für deinen Hinweis und entschuldige bitte, dass ich mich nicht ganz präzise ausgedrückt habe.
    Ich weiß nicht an welcher Stelle ich das durchlaufen des Arrays implementieren muss. Im Controller, im View oder im Model? Welche Funktion muss ich dazu überschreiben?

  • Gespeichert wird im model, in der Methode save.
    Du hast dort $data - Schau dir an wie deine Subformeingaben aussehen.


    Normalerweise geht es so - dies ist Pseudocode! - nicht funktionsfähig - und leider zieht diese Forensoftware die Einrückungen manchmal raus


  • Hallo Christiane,


    vielen DANK für die Anregung. Ich hatte versucht das über die save-Methode des Controllers zu lösen, bevor ich deinen Beitrag gelesen hatte. Über das Model ist es ja einfacher, da das Daten-Array direkt übergeben wird. Manchmal habe ich eine lange Leitung. ;) Hätte ja gleich ans Model denken sollen.


    Das was ich nicht verstehe ist, dass als Speichern-Nachricht nur eine 1 angezeigt. Meine save-Methode sieht nun so aus:

    Code
    public function save($data) {        if (parent::save($data)) {            $db = JFactory::getDbo();            $id = $data['id'];            if ($id <= 0) {                $id = $db->lastInsertId();            }            foreach($data['subform'] as $data) {                $record = new stdClass();                $record->training_id = $id;                $record->room_id = $data['room_id'];                if ($data['id'] > 0) {                    $record->id = $data['id'];                    $result = $db->updateObject('#__btzleipzig_training_room', $record);                } else {                    $result = $db->insertObject('#__btzleipzig_training_room', $record);                }                if (!$result) {                    return JError::raiseError(404, JText::_('COM_BTZLEIPZIG_TRAINING_ROOM_NOT_INSERT'));                }            }            return true;        }        return false;    }


    Das laden der Daten war dann wieder einfach. Ich habe einfach die loadFormData-Methode erweitert:

  • Gut ;)
    Generell sollte der Controler nur die Steuerung machen, das model alles was die Daten verwurstet oder mit der Datenbank zu tun hat und view alles was die Ausgabe macht. Es gibt natürlich Ausnahmen, aber deines ist ein klassischer Fall.

    Zitat

    Das was ich nicht verstehe ist, dass als Speichern-Nachricht nur eine 1 angezeigt.


    Die save-Methode von parent gibt true zurück wenn alles in Ordnung ist, deshalb.


    Wenn du es perfekt machen willst quotest du auch im ersten Teil die Tabellennamen und castest die id (sicher ist sicher):
    zum Beispiel: $record->room_id = (int) $data['room_id'];

  • Danke dir Christiane!


    Das mit der Ausgabe der 1 hat sich auch geklärt. Ich hatte zum testen was ausgegeben, was ich vergessen hatte zu löschen. Nun wird auch wieder die normale Ausgabe angezeigt.


    Das mit dem quoten und dem Casten steht auf meiner ToDo-Liste, da ich noch mehr entdeckt habe, wo ich das nicht so gemacht habe. :)