Buenas a todos. Espero se encuentren bien, soy nuevo en yii y me parece un excelente framework. He estado leyendo guias y tutoriales con respecto a este tema (Ingreso tabular) y tengo la siguiente duda con respecto a como manejar un registro tabular entre 2 tablas/modelos que se relacionan de muchos a muchos.
Resulta que tengo la siguiente estructura en mi base de datos:
Solicitud
co_solicitud(pk)
co_status
tipo_mov
nu_id_solicitante
fe_solicitud
Detalle_Solicitud
co_solicitud(pk)(fk1)
co_item(pk)(fk2)
cant_solicitud
nu_id_asignado_a
Item
co_item(pk)
status_item
tx_item
Bien mi problema es que necesito realizar un formulario tipo Maestro/Detalle con ingreso tabular para la parte de Detalle_solicitud, pero Detalle_Solicitud al tener una clave primaria compuesta, no se como manejar esa situacion, cabe destacar que en la tabla "Item" no haré ningun ingreso ni registrare nada, puesto que es unatabla replicada que viene de otro sistema, de alli solo extraere la informacion, en este caso los items que se esten solicitando.
Estuve investigando y leyendo al respecto, lo unico que consegui fue disociar la relacion MANY_MANY, y cambiarla por HAS_MANY, y utilizar una extesion llamada "ztabulariputmanager" con la cual puedo realizar el formulario tipo maestro/detalle. pero tengo problemas puesto al seguir la guia no me muestra nada al ingresar a la accion create de solicitud. Estaria muy agradecido por la ayuda que me puedan brindar, si hay alguna otra manera de trabajar o manejar esta situacion bienvenida sea, pero sin cambiar mi modelo de base de datos jejej. De antemano muchas gracias. Aca coloco los codigos de los archivos:
Modelo Solicitud:
class Solicitud extends CActiveRecord
{
.
.
.
public function relations()
{
'detalles' => array(self::HAS_MANY,'DetalleSolicitud', 'co_solicitud'),
'catalogos' => array(self::HAS_MANY, 'Catalogo', array('co_item'=>'co_item'),'through'=>'detalles'),
);
}
}
Modelo Detalle_Solicitud
public function relations()
{
return array(
'solicitudes'=> array(self::BELONGS_TO, 'Solicitud','co_solicitud'),
'catalogos'=> array(self::BELONGS_TO, 'Catalogo', 'co_item'),
);
}
Solicitud Controller:
public function actionCreate()
{
$model=new Solicitud();
$detalleManager= new DetalleManager($model);
// Uncomment the following line if AJAX validation is needed
$this->performAjaxValidation($model);
if (isset($_POST['Solicitud']))
{
$model->attributes = $_POST['Solicitud'];
$detalleManager->manage = ($model, $_POST['DetalleSolicitud']);
if($model->validate() && $detalleManager->validate()){
$model->save();
$detalleManager->save($application);
$this->redirect(array('view', 'id' => $model->co_solicitud));
}
}
$this->render('create',array(
'detalleManager'=>$detalleManager,
'model'=>$model,
));
}
View form solicitud:
<?php
/* @var $this SolicitudController */
/* @var $model Solicitud */
/* @var $form CActiveForm */
?>
<div class="form-horizontal">
<?php $form=$this->beginWidget('CActiveForm', array(
'id'=>'solicitud-form',
.
.
.
<table id="detalles">
<thead>
<tr>
<td>Item</td>
<td>Cantidad</td>
<td>Asignado a:</td>
<td>
<?php echo CHtml::link('add', '', array('onClick'=>'addStudent($(this))', 'class'=>'add'/* 'submit'=>'', 'params'=>array('Student[command]'=>'add', 'noValidate'=>true)/**/));?>
</td>
</tr>
</thead>
<tbody>
<?php foreach($detalles->items as $id=>$model): ?>
<?php $this->renderPartial('detalleSolicitud/_form', array('id'=>$id, 'model'=>$model, 'form'=>$form));?>
<?php endforeach;?>
</tbody>
</table>
<?php $this->renderPartial('detalleSolicitud/_form', array('detalles'=>$detalles, 'form'=>$form));?>
.
.
.
<?php $this->endWidget(); ?>
</div><!-- form -->
Form DetalleSolicitud
<tr>
<td>
<?php echo $form->textField($model,"[$id]co_item");?>
</td>
<td>
<?php echo $form->textField($model,"[$id]ca_solicitud");?>
</td>
<td>
<?php echo $form->textField($model, "[$id]nu_ci_asignado_a");?>
</td>
<td>
<?php echo CHtml::link(
'delete',
'',
array(
'class'=>'delete',
'onClick'=>'deleteStudent($(this))', /*
'submit'=>'',
'params'=>array(
'Student[command]'=>'delete',
'Student[id]'=>$id,
'noValidate'=>true)/**/
));?>
</td>
</tr>
Clase extendida de la extension TabularManager:
<?php
yii::import('application.extensions.TabularInputManager');
class DetalleManager extends TabularInputManager
{
protected $class='Detalle';
/**
* Retrieve the list of Detalless
* @return array of Detalles objects
*/
public function getItems()
{
if (is_array($this->_items))
return $this->_items;
else {
return array(
'n0' => new DetalleSolicitud,
);
}
}
/**
* Deletes the uneeded Detalles
*/
public function deleteOldItems($model, $itemsPk) {
$criteria = new CDbCriteria;
$criteria->addNotInCondition('co_solicitud', $itemsPk);
//Student has a attribute classroom_id: indicates which classroom s/he is in.
$criteria->addCondition("co_item = {$model->primaryKey}");
DetalleSolicitud::model()->deleteAll($criteria);
}
/**
* Create a new TabularInputManager and loads the current child items
*/
public function load($model) {
$return = new DetalleManager;
foreach($model->solicitudes as $item)
$return->_items[$item->primaryKey]=$item;
return $return;
}
/**
* Set the unsafe attributes for the child items, usually the primary key of the parent model
*/
public function setUnsafeAttribute($item, $model) {
$item->co_solicitud = $model->primaryKey;
}
}
?>