Buenas te voy a explicar como lo hago yo, igual es una chapuza pero bueno…
Mis tablas son las que anexo, pero la que te interesa es la de rel_mancomunidades_municipios ya que es una tabla de relaciones entre dos tablas y por tanto tiene esas id como PK compuesta.
Primero el modelo:
==================
class RelMancomunidadesMunicipios extends CActiveRecord
{
/**
* The followings are the available columns in table 'rel_mancomunidades_municipios':
* @var integer $id_mancomunidad
* @var integer $id_municipio
* @var string $fecha_anexion
* @var string $fecha_baja
*/
/**
* Returns the static model of the specified AR class.
* @return CActiveRecord the static model class
*/
public static function model($className=__CLASS__)
{
return parent::model($className);
}
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'rel_mancomunidades_municipios';
}
/**
* @return array validation rules for model attributes.
*/
public function rules()
{
return array(
array('id_mancomunidad, id_municipio, fecha_anexion', 'required'),
array('id_mancomunidad, id_municipio', 'numerical', 'integerOnly'=>true),
array('fecha_baja', 'safe'),
);
}
/**
* @return array relational rules.
*/
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'mancomunidades' => array(self::BELONGS_TO, 'Mancomunidades', 'id_mancomunidad','alias'=>'mancomunidades'),
'municipios' => array(self::BELONGS_TO, 'Municipios', 'id_municipio','alias'=>'municipios'),
);
}
/**
* @return array customized attribute labels (name=>label)
*/
public function attributeLabels()
{
return array(
'id_mancomunidad' => 'Mancomunidad',
'id_municipio' => 'Municipio',
'fecha_anexion' => 'Fecha Anexion',
'fecha_baja' => 'Fecha Baja',
);
}
}
El formulario para dicho modelo:
================================
<div class="yiiForm">
<p>
Campos con <span class="required">*</span> son obligatorios.
</p>
<?php echo CHtml::beginForm('','post',array('id'=>'RelMancomunidadesMunicipios')); ?>
<?php echo CHtml::errorSummary($model); ?>
<div class="texto_error_login ui-corner-all" id="errores_relmancomunidadmunicipio" style="visibility:hidden"></div>
<div class="simple">
<?php echo CHtml::activeHiddenField($model,'id_mancomunidad'); ?>
</div>
<div class="simple">
<?php echo CHtml::activeLabelEx($model,'id_municipio'); ?>
<?php echo CHtml::activeDropDownList($model,'id_municipio',CHtml::listdata(Municipios::model()->findAll(),'id','nombre')); ?>
</div>
<div class="simple">
<?php echo CHtml::hiddenField('RelMancomunidadesMunicipios[id_municipio_anterior]','',array('id'=>'RelMancomunidadesMunicipios_id_municipio_anterior')); ?>
</div>
<div class="simple">
<?php echo CHtml::activeLabelEx($model,'fecha_anexion'); ?>
<?php echo CHtml::activeTextField($model,'fecha_anexion'); ?>
</div>
<div class="simple">
<?php echo CHtml::activeLabelEx($model,'fecha_baja'); ?>
<?php echo CHtml::activeTextField($model,'fecha_baja'); ?>
</div>
<?php
if ((Yii::app()->user->grupo)=="Administración") {
?>
<div class="ui-helper-clearfix">
<ul class="buttons ui-widget">
<li class="ui-state-default ui-corner-all" id="relmancomunidadesmunicipios_crud_create" style="visibility:visible">
<span class="ui-icon ui-icon-document"></span>Crear registro
</li>
<li class="ui-state-default ui-corner-all" id="relmancomunidadesmunicipios_crud_update" style="visibility:visible">
<span class="ui-icon ui-icon-document"></span>Actualizar registro
</li>
</ul>
</div>
<script type="text/javascript">
jQuery(document).ready(function() {
jQuery('#relmancomunidadesmunicipios_crud_create').unbind('click').click(function(){
jQuery.ajax({
'dataType':'json',
'success':function(response) {
//successAjaxCRUD('errores_mancomunidad_municipio',response);
if (response.result=="OK") {
successAjaxCRUD('errores_mancomunidades_municipios',response);
//$('#pts_grid').trigger("reloadGrid");
$('#formRelMancomunidadesMunicipios').dialog('close');
$('#RelMancomunidadesMunicipios').clearForm();
rellenar_ficha_municipios($("#Mancomunidades_id").attr("value"));
} else if (response.result=="KO") {
//$('#pts_grid').trigger("reloadGrid");
successAjaxCRUD('errores_relmancomunidadmunicipio',response);
}
},
'error':function(request, error, thrownError){
errorAjaxCRUD('errores_relmancomunidadmunicipio',request,error,thrownError);
},
'type':'POST',
'url':'/aurora/index.php?r=infoGestionGeografica/createRelMancomunidadMunicipio',
'cache':false,
'data':jQuery(this).parents("form").serialize()
});
return false;
});
jQuery('#relmancomunidadesmunicipios_crud_update').unbind('click').click(function(){
jQuery.ajax({
'dataType':'json',
'success':function(response) {
if (response.result=="OK") {
successAjaxCRUD('errores_mancomunidades_municipios',response);
//$('#pts_grid').trigger("reloadGrid");
$('#formRelMancomunidadesMunicipios').dialog('close');
$('#RelMancomunidadesMunicipios').clearForm();
rellenar_ficha_municipios($("#Mancomunidades_id").attr("value"));
} else if (response.result=="KO") {
//$('#pts_grid').trigger("reloadGrid");
successAjaxCRUD('errores_relmancomunidadmunicipio',response);
}
},
'error':function(request, error, thrownError){
errorAjaxCRUD('errores_relmancomunidadmunicipio',request,error,thrownError);
},
'type':'POST',
'url':'/aurora/index.php?r=infoGestionGeografica/updateRelMancomunidadMunicipio',
'cache':false,
'data':jQuery(this).parents("form").serialize()
});
return false;
});
});
</script>
<?php
}
?>
<?php echo CHtml::endForm(); ?>
</div><!-- yiiForm -->
Como ves en el formulario hago todo por AJAX usando JQuery por lo que esa parte no la tienes que tener en cuenta.
Controlador (las acciones de Create, Update y Delete):
======================================================
public function actionCreateRelMancomunidadMunicipio() {
$model=new RelMancomunidadesMunicipios();
$model->setScenario('create');
if(isset($_POST['RelMancomunidadesMunicipios']))
{
if ($_POST['RelMancomunidadesMunicipios']['fecha_baja']=="") {
$_POST['RelMancomunidadesMunicipios']['fecha_baja']="0000-00-00";
}
$model->attributes=$_POST['RelMancomunidadesMunicipios'];
$responce=new FormJson();
if($model->save(true)) {
$responce->result="OK";
$responce->rows[0]['descripcion']="Se ha creado el registro correctamente.";
} else {
$arr_errores=$model->getErrors();
$responce->result="KO";
$i=0;
foreach ($arr_errores as $errores=>$error) {
foreach ($error as $key=>$value) {
$responce->rows[$i]['campo']=$errores;
$responce->rows[$i]['descripcion']=$value;
}
$i++;
}
}
echo json_encode($responce);
}
}
public function actionUpdateRelMancomunidadMunicipio() {
$model=new RelMancomunidadesMunicipios();
$model->setScenario('update');
if(isset($_POST['RelMancomunidadesMunicipios']))
{
$model=RelMancomunidadesMunicipios::model()->findByPk(array('id_mancomunidad'=>$_POST['RelMancomunidadesMunicipios']['id_mancomunidad'], 'id_municipio'=>$_POST['RelMancomunidadesMunicipios']['id_municipio_anterior']));
$model->attributes=$_POST['RelMancomunidadesMunicipios'];
$responce=new FormJson();
if($model->save(true)) {
$responce->result="OK";
$responce->rows[0]['descripcion']="Se ha actualizado el registro correctamente.";
} else {
$arr_errores=$model->getErrors();
$responce->result="KO";
$i=0;
foreach ($arr_errores as $errores=>$error) {
foreach ($error as $key=>$value) {
$responce->rows[$i]['campo']=$errores;
$responce->rows[$i]['descripcion']=$value;
}
$i++;
}
}
echo json_encode($responce);
}
}
public function actionDeleteRelMancomunidadMunicipio() {
$model=new RelMancomunidadesMunicipios();
$model->setScenario('update');
if(isset($_GET['id_mancomunidad'])&& isset($_GET['id_municipio']))
{
$responce=new FormJson();
$borrado=RelMancomunidadesMunicipios::model()->deleteByPk(array('id_mancomunidad'=>$_GET['id_mancomunidad'],'id_municipio'=>$_GET['id_municipio']));
if($borrado==1) {
$responce->result="OK";
$responce->rows[0]['descripcion']="Se ha realizado el borrado del registro correctamente.";
} else {
$arr_errores=$model->getErrors();
$responce->result="KO";
$i=0;
foreach ($arr_errores as $errores=>$error) {
foreach ($error as $key=>$value) {
$responce->rows[$i]['campo']=$errores;
$responce->rows[$i]['descripcion']=$value;
}
$i++;
}
}
echo json_encode($responce);
}
}
Aquí tampoco hagas caso del objeto $response que es un Json que tengo para el resultado de la acción ya que te recuerdo que yo lo hago por AJAX.
Para hacerlo sin AJAX simplemente tienes que tener el botón de submit y enviar el formulario a la acción correspondiente según lo que quieras hacer.
Mira el código a ver si te sirve.
Saludos.