Frage

Ich habe ein Formular im Administratorfeld mit verschiedenen Feldern erstellt. Jetzt gehören die Felder hier nicht zu einer einzigen Tabelle. Auf dem Speichern möchte ich, dass einige Werte in eine bestimmte Tabelle gehen, während andere in einen anderen Tisch gehen. Ich bin in der Lage, die Daten mit Verbindungen anzuzeigen, weiß aber nicht, wie ich sie zurücksparen kann.

Nehmen wir an, ich habe einen TBLUSER mit Feldern:

TBLUSER

- user_id        INT(11)         Auto Increment
- username       VARCHAR(15)
- store_id       SMALLINT(5)
- bank_id        INT(11)

Hier haben Store_id und Bank_id ausländische Schlüsselbeschränkungen zu automatischen Inkrement-IDs von tBlcore_store (id, store_name) und tblbanks (ID, bank_name, bank_acc). Jetzt sind die Felder in der Form:

  • Nutzername
  • Speicher -ID
  • Speichername
  • Bank Name
  • Bankkonto

Wenn Administrator klicken, möchte ich, dass die Daten des Formulars in ihre jeweiligen Tabellen eingehen und ihre Referenzen in Store_id und bank_id haben.

War es hilfreich?

Lösung

Sie können eine Haupttabelle (Modell und Ressource - in Ihrem Fall TBLUSER) auswählen, die alle Speichervorgänge ausführt. Dann sollten Sie im Controller alle Daten in diesem Modell festlegen und Ihre eigene _Beforesave -Funktion schreiben, die alle anderen Modelle in andere Tabellen speichert, ihre IDs zum Haupttabellenmodell hinzufügen und dann das Hauptmodell speichern.

_Beforesave -Funktion sollte im Ressourcenmodell dieses Modells implementiert werden. Modell/Ressource/Mainmodule.php -Datei:

...
// this function will get executed before the model is saved but after save function has been called
protected function _beforeSave( Mage_Core_Model_Abstract $object )
{
  // do some model loads and checks here so that you will update existing data and not duplicate rows on editAction saves...
  $otherModel = Mage::getModel( 'moduleName/otherTableModel' );
  $otherModel->setData( 'foo', $object->getData( 'other_table_foo' ) )->save();
  $object->setData( 'bank_id', $otherModel->getId() );

  return parent::_beforeSave( $object );
}
...

In Ihrem Controller müssen Sie nur schreiben:

$mainModel = Mage::getModel( 'moduleName/mainModel' );

if( $id ) {
    $mainModel->load( $id );
}

$mainModel->setData( $dataFromServerRequest ) // or addData...
    ->save();

und die _Beforesave -Funktion erfüllt den Rest.

Dies speichert die von Ihnen gewünschten Daten in anderen Tabellen in anderen Tabellen, während sie noch alle Abfragen in derselben Transaktion ausführen, damit sie alle zusammen gespeichert oder zurückgerollt werden.

Diese Technik funktioniert, denn unabhängig davon, was Sie einem Modell mit SetData hinzufügen, wird nach dem Aufruf erhalten, um Funktionen zu speichern (und vor allem in _Aftersave- und _Beforesave -Funktionen), aber nur die Daten, die den gleichen Namen wie eine Tabellenspalte haben, werden tatsächlich gespeichert. Sie müssen nur die Werte aus anderen Tabellen anders benennen als die Spalten in der Tabelle des aktuellen Modells und Sie haben keine Probleme, auf diese Daten in der Funktion der _Beforesave zuzugreifen und sie in anderen Tabellen zu speichern.

All dies kann auch in _Aftersave erfolgen, wenn Sie $ Objekt-> getId () erhalten und in einer untergeordneten Tabelle speichern müssen existiert zuvor und wurde geladen. Andererseits wurde es bereits gespeichert, sodass Sie dort die eindeutige ID verwenden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top