TUTORIAL YII FRAMEWORK (CAPÍTULO 17) – HACER FORMULARIO PARA MULTIPLES MODELOS

Una vez realizado el CRUD de cada modelo este nos genera automáticamente un formulario con los datos del modelo, si queremos hacer un formulario que incluya los datos de dos o mas modelos debemos modificar varias lineas de código.

En el ejemplo que explico a continuación tenemos dos modelos, el modelo Personal cuyos datos son id_personal, nombre_personal y id_estado y el modelo Estado con id_estado y nombre_estado, de mas está decir que Personal es alimentado por Estado, lo primero que haremos es modificar la vista _form de Personal.

<div class="form">
<?php $form = $this->beginWidget('CActiveForm', array( 'id'=>'user-form',
'enableAjaxValidation'=>true, ));
if ($a->isNewRecord==false) { $b=Estado::model()->findByPk($a->id_estado); }
echo $form->errorSummary(array($a,$b)); ?>
<div class="row">
<?php echo $form->labelEx($a,'nombre_personal'); ?>
<?php echo $form->textField($a,'nombre_personal'); ?>
<?php echo $form->error($a,'nombre_personal'); ?>
</div>
<div class="row">
<?php echo $form->labelEx($b,'nombre_estado'); ?>
<?php echo $form->textField($b,'nombre_estado'); ?>
<?php echo $form->error($b,'nombre_estado'); ?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton($a->isNewRecord ? 'Crear' : 'Actualizar'); ?>
</div> <?php $this->endWidget(); ?> </div></p>

Con ese código incluimos el campo nombre_estado del modelo Estado en el formulario de Personal, también agregamos en el parámetro errorSummary el modelo $b, que en este caso es Estado, con esto nos valida el formulario con las restricciones que hayamos puesto en el rules() de ambos modelos, por otra parte preguntamos si se está creando un nuevo registro o no, en caso de ser una actualización cargamos la información del modelo Estado, de Personal nos la carga automáticamente.

En el caso de las vistas create.php y update.php cambiamos la siguiente linea:

<?php echo $this->renderPartial('_form', array('model'=>$model)); ?>

por esta

<?php echo $this->renderPartial('_form', array('a'=>$a, 'b'=>$b)); ?>

Ahora modificamos la acción create:

public function actionCreate()
{
$a=new Personal;
$b=new Estado;
$this->performAjaxValidation(array($a,$b));
if(isset($_POST['Personal'],$_POST['Estado']))
{
$a->attributes=$_POST['Personal'];
$b->attributes=$_POST['Estado'];
$sql='select max(id_estado) from estado;';
$connection=Yii::app()->db;
$command=$connection->createCommand($sql);
$row=$command->queryRow();
$row["max"]++;
$b->id_estado=$row["max"];
$a->id_estado=$row["max"];
if($b->save() && $a->save())
$this->redirect(array('view','id'=>$a->id_personal));
}
$this->render('create',array('a'=>$a,'b'=>$b));
}
<p style="text-align: justify;">

Lo primero que hacemos es instanciar los modelos Personal y Estado, luego si los datos pasan la validación determinamos el mayor id de estado, se lo asignamos al dato id_estado de cada modelo y guardamos los datos.
Para update hacemos algo parecido:

public function actionUpdate($id)
{
$a=new Personal;
$b=new Estado;
$this->performAjaxValidation(array($a,$b));
$a=$this->loadModel($id);
if(isset($_POST['Personal'],$_POST['Estado']))
{
$a->attributes=$_POST['Personal'];
$b->attributes=$_POST['Estado'];

$b->id_estado=$a->id_estado;
$b->setIsNewRecord(false);
if($a->save() && $b->update())
$this->redirect(array('view','id'=>$a->id_personal));
}
$this->render('update',array('a'=>$a,'b'=>$b));
}
<p style="text-align: justify;">

De igual forma que con el create validamos los datos, guardamos y direccionamos. En definitiva hemos hecho un formulario en el que guardamos datos de dos modelos distintos, es un ejemplo sencillo pero válido, si tus modelos tienen mas datos lo incluyes en el _form y si quieres agregar más modelos al form se hace de la misma forma.

About these ads

Publicado el 27/01/2012 en Yii Framework. Añade a favoritos el enlace permanente. 9 comentarios.

  1. mi consulta es referente function actioncreate()
    esta consulta siempre devuelve uno, guardando uno en BD en el campo id_estado de la tabla personal, hay algún script que no colocaste pues yo realice copy paste :)

    $sql=’select max(id_estado) from estado;’;
    $connection=Yii::app()->db;
    $command=$connection->createCommand($sql);
    $row=$command->queryRow();
    $row["max"]++;
    $b->id_estado=$row["max"];
    $a->id_estado=$row["max"];

  2. yo te digo una cosa SEÑOR “GABO”..DEBERIAS CORREGIR TUS ERRORES DE PROGRAMACION AL PONERLOS. CHEQUEE PASO A PASO LO QUE PONES Y TE DA ERROR CON EL TEMA DEL MAX QUE CALCULO QUE E SLO QUE LE PASA AL OTRO COLEGA.
    si colocas codigo convendria que lo revises antes, asi nos evitamos perdidas de tiempo.
    Saludos

  3. Gabriel, muy buen ejemplo.

    Tengo duda sobre como se declara el modelo b en el update.php o create aparte de la linea publicada.

    Gracias y saludos.

  4. Hola Gabriel, espero puedas ayudarme pronto. Tengo el siguiente problema estoy tratando de hacer un formulario con 2 modelos, he seguido este ejemplo pero tengo un problema me da el siguiente error

    CDbCommand failed to execute the SQL statement: SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permiso denegado a la secuencia sec. The SQL statement executed was: INSERT INTO “grupo” (“tipo”, “accion”, “id_persona”) VALUES (:yp0, :yp1, :yp2)

    La linea donde esta el error:
    if($b->save() && $a->save())

    Donde grupo seria como tu ejemplo de personal y persona como estado…

    Verifique en la base de datos el usuario tiene todos los privilegios , que podra ser lo que ocurre?

    En la base de datos verifico y se guardan los datos de persona pero no los grupos

    Gracias de antemano!!!

  5. ok amigo gracias estoy buscando como darle los privilegios!!

  6. Hola amigo, escribo para saber si me puedes ayudar con algo, tengo que hacer un formulario que involucra 3 tablas y lo puedo hacer de la forma como lo muestras aqui sin ningun problema pero, la cuestion es que deseo utilizar la extension mulmodelform para que me permita añadir los item. Lo he podido hacer con 2 tablas pero no con 3.

    La cuestios sería un modelo maestro llamado personas que me permita añadir contactos y estos contactos que se puedan añadir telefonos….

    Personas(Añadir item Contacto)
    Contactos(añadir item telefonos)

    La tabla personas puede tener muchos contactos y esta muchos telefonos.

    Espero que me hallas entendido y si tienes alguna idea te agradezco de antemo…

Tu Opinión es Importante, Comenta!

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.