Dear Friend
Kindly check whether the following is helpful in our case.
I have this:
notice
id,description
species
id,name
condition
id,name
relation
n_id,s_id,c_id
Following are in nutshell:
1.Collect the data from dropDowns and send them via AJAX.
2.Convert the data to array and store them in session.
3.Use the CArrayDataProvider as dataProvider for the collected information.
4.Update the grid by AJAX, as user adds further information from dropdown.
5.Remove the particular row by AJAX, by collecting information from row elements and removing the data in session
and restoring changed data to session.
6.Finally saving the data to Relation table whatever existing in session.
7.Avoiding duplicates in adding to the list as well as adding to the database.
8.Upon successful entry into database, all the data in session are nullified.
views/notice/view.php
<h1>View Notice #<?php echo $model->id; ?></h1>
<?php $this->widget('zii.widgets.CDetailView', array(
'data'=>$model,
'attributes'=>array(
'id',
'description',
),
)); ?>
<?php
echo CHtml::beginForm('','post',array("id"=>"nform"));?>
<?php echo CHtml::dropDownList('speciesName','',array(CHtml::listData(Species::model()->findAll(),"id","name"))); ?>
<?php echo CHtml::dropDownList('conditionName','',array(CHtml::listData(Condition::model()->findAll(),"id","name"))); ?>
<?php echo CHtml::ajaxSubmitButton("ADD",'',array(
'data'=>'js:$("#nform").serialize()',
'success'=>'js:function(data){$("#relation-grid").yiiGridView("update",{})}'
),array("id"=>"butt","style"=>"color:green;"));?>
<?php echo CHtml::endForm();?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'relation-grid',
'dataProvider'=>$relationProvider,
//'filter'=>$relation,
'columns'=>array(
'n_id',
array(
'header'=>'Species',
'name'=>'s_id',
'value'=>'Species::model()->findByPk($data["s_id"])->name',
),
array(
'header'=>'SpeciesField',
'value'=>'CHtml::textField("species",$data["s_id"])',
'type'=>'raw'
),
array(
'header'=>"Condition",
'name'=>'c_id',
'value'=>'Condition::model()->findByPk($data["c_id"])->name',
),
array(
'header'=>'ConditionField',
'value'=>'CHtml::textField("species",$data["c_id"])',
'type'=>'raw',
),
array(
'value'=>'CHtml::button("REMOVE",array("style"=>"color:red;"))',
'type'=>"raw"
),
),
)); ?>
<?php echo CHtml::button("SAVE",array(
"submit"=>array("notice/save")
));
?>
<?php
Yii::app()->clientScript->registerScript('test','
$("body").on("click","#relation-grid input[type=\"button\"]",function(){
var data={};
var sibs=$(this).parent().siblings();
data.n_id=$(sibs[0]).html();
data.s_id=$(sibs[2]).children().val();
data.c_id=$(sibs[4]).children().val();
console.log(data);
$.ajax({
"url":"'.CHtml::normalizeUrl(array("notice/view","id"=>$model->id)).'",
"data":data,
"type":"POST",
"success":function(data){$("#relation-grid").yiiGridView("update",{});},
})
return false;
});
');
NoticeController.php
public function actionView($id)
{
$model=$this->loadModel($id);
if(!Yii::app()->user->hasState("related"))
Yii::app()->user->setState("related",array());
if(Yii::app()->user->hasState("related"))
{
$relationProvider=new CArrayDataProvider(Yii::app()->user->getState('related'));
$relationProvider->keyField=false;
}
If(isset($_POST['speciesName']) && Yii::app()->request->getIsAjaxRequest())
{
$related=Yii::app()->user->getState("related");
$posted=array('n_id'=>$model->id,'s_id'=>$_POST['speciesName'],"c_id"=>$_POST['conditionName']);
if(!in_array($posted,$related))
$related[]=$posted;
Yii::app()->user->setState('related',$related);
$relationProvider=new CArrayDataProvider(Yii::app()->user->getState('related'));
$relationProvider->keyField=false;
}
If(isset($_POST['n_id']) && Yii::app()->request->getIsAjaxRequest())
{
$arr=Yii::app()->user->getState("related");
$post=$_POST;
$list=array();
foreach($arr as $a)
{
if ($a!==$post)
$list[]=$a;
}
Yii::app()->user->setState('related',$list);
$relationProvider=new CArrayDataProvider(Yii::app()->user->getState('related'));
$relationProvider->keyField=false;
}
$this->render('view',array(
'model'=>$model,
'relationProvider'=>$relationProvider
));
}
public function actionSave()
{
$relations=Yii::app()->user->getState("related");
foreach($relations as $relation)
{
$model=new Relation;
$model->n_id=$relation["n_id"];
$model->s_id=$relation["s_id"];
$model->c_id=$relation["c_id"];
if(!Relation::model()->exists("n_id=:n_id AND s_id=:s_id AND c_id=:c_id",array(":n_id"=>$model->n_id,":s_id"=>$model->s_id,":c_id"=>$model->c_id)))
$model->save(false);
}
Yii::app()->user->setState('related',null);
$this->redirect(array("relation/index"));
}
Note here I have used session for temporary storage.
Still I prefer tables for storing the data ,Which can be modified or dropped if needed.
This is the screenshot from my localhost.
3752

Regards.