Pregunta

He creado un formulario en el panel de administración con varios campos. Ahora los campos aquí no pertenecen a una sola tabla. En el salve, quiero ir a algunos valores en una tabla en particular, mientras que otros a entrar en alguna otra mesa. Soy capaz de mostrar los datos utilizando une, pero no saben cómo guardar de nuevo.

Vamos a decir que tengo una tblUser con campos:

tblUser

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

A continuación, store_id y bank_id tienen restricciones de clave externa a Identificación de incremento automático de tblcore_store (id, nombre_tienda) y tblBanks (id, bank_name, bank_acc), respectivamente. Ahora los campos del formulario son:

  • Nombre de usuario
  • Tienda Id
  • Nombre tienda
  • Nombre del banco
  • cuenta bancaria

Cuando administrador Haga clic en Guardar Quiero los datos del formulario para entrar en sus respectivas mesas y también tener sus referencias en store_id y bank_id.

¿Fue útil?

Solución

Se puede seleccionar una tabla principal (modelo y de recursos - en su caso tblUser) que hará todo el proceso de almacenamiento operaciones. Luego, en el controlador debe establecer todos los datos de ese modelo y escribir su propia función _beforeSave que salvará a todos los demás modelos en otras tablas, añadir sus ID de modelo de la tabla principal y luego guardar el modelo principal.

Función _beforeSave se debe implementar en el modelo de recursos de ese modelo. archivo de modelo / Recursos / 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 );
}
...

En el controlador que sólo tendrá que escribir:

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

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

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

y la función _beforeSave hará el resto.

Esto ahorrará los datos que desea en otras tablas a otras tablas al mismo tiempo la ejecución de todas las consultas en la misma transacción para que se guardarán ni se deshacen todos juntos.

Esta técnica funciona porque no importa lo que se agrega a un modelo con setData se conservará después de la llamada a la función de ahorro (y más importante dentro de funciones _afterSave y _beforeSave), pero sólo los datos que tienen el mismo nombre que una columna de tabla actualy ser salvado. Sólo necesita valores de nombre de otras tablas de manera diferente que las columnas en la tabla del modelo actual y que no tendrá problemas para acceder a esos datos en función de _beforeSave y guardarlo en otras tablas.

Todo esto también se puede hacer en _afterSave si usted necesita para obtener $ objeto-> getId () y guardarlo en una tabla secundaria (en _beforeSave el objeto $ no se ha guardado todavía por lo que la identificación está presente sólo si entrada de la tabla que existía antes y estaba cargada. por otro lado, en _afterSave que ya se ha guardado para que pueda utilizar su ID único que hay).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top