Domanda

Ho creato un modulo nel pannello di amministrazione con vari campi. Ora i campi qui non appartiene ad un unico tavolo. Nella finestra di salvataggio, voglio alcuni valori di andare in una tabella particolare, mentre altri per andare in qualche altra tabella. Sono in grado di mostrare i dati utilizzando unisce, ma non so come salvare di nuovo.

dire Let Ho un tblUser con campi:

tblUser

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

Qui, STORE_ID e bank_id hanno vincoli di chiave a incremento automatico di id di tblcore_store (id, store_name) e tblBanks (id, bank_name, bank_acc), rispettivamente. Ora i campi del modulo sono:

  • Nome utente
  • Conservare Id
  • Conservare Nome
  • Nome Bank
  • conto bancario

Quando amministratore clic su salva voglio i dati della forma per andare nelle rispettive tabelle e avendo anche loro riferimenti nella STORE_ID e bank_id.

È stato utile?

Soluzione

È possibile selezionare una tabella principale (modello e di risorse - nel tuo caso tblUser) che farà tutto l'operazioni di salvataggio. Poi nel controller è necessario impostare tutti i dati in quel modello e scrivere la propria funzione _beforeSave che salverà tutti gli altri modelli in altre tabelle, aggiungere il loro ID di modello di tabella principale e quindi salvare il modello principale.

funzione _beforeSave dovrebbe essere attuato in modello di risorse di quel modello. file di modello / risorse / MainModule.php:

...
// 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 );
}
...

Nel vostro controller sarà sufficiente scrivere:

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

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

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

e la funzione _beforeSave farà il resto.

In questo modo salvare i dati che si desidera in altre tabelle con altre tabelle, mentre ancora l'esecuzione di tutte le query nella stessa transazione in modo che verranno salvate o il rollback tutti insieme.

Questa tecnica funziona perché non importa ciò che si aggiunge ad un modello con setData sarà conservato dopo la chiamata per salvare la funzione (e più importante all'interno delle funzioni _afterSave e _beforeSave), ma solo i dati che ha lo stesso nome di una colonna della tabella volontà actualy essere salvati. Hai solo bisogno di valori del nome da altre tabelle in modo diverso rispetto alle colonne della tabella del modello corrente e non avrete alcun problema di accesso che i dati in funzione _beforeSave e salvandolo ad altre tabelle.

Tutto questo può essere fatto anche in _afterSave se avete bisogno di ottenere $ object-> getId () e salvarlo in una tabella figlio (in _beforeSave il $ oggetto non è ancora stato salvato in modo che la id è presente solo se che voce della tabella esisteva prima ed è stato caricato. D'altra parte in _afterSave è già stato salvato in modo da poter utilizzare sia ID univoco lì).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top