How to save multiple jqrelcopy-generated dropdownlists in a database?

I’m stuck in this problem for several days now. I can’t seem to figure out how to do it. I am following this sample: <http://www.yiiframework.com/forum/index.php/topic/18155-extension-jqrelcopy> and I even recreated it. It’s working but I can’t seem to apply it in my project. Please help me. Thanks!

Brief Background: I am making a room reservation system. I am using 2 databases: one for the users and one for the schedule.

Here are my codes:<br>

ScheduleController.php


<?php


   class ScheduleController extends Controller

   {

    /**

     * @var string the default layout for the views. Defaults to '//layouts/column2',     meaning

     * using two-column layout. See 'protected/views/layouts/column2.php'.

     */

    public $layout='//layouts/column2';


    /**

     * @return array action filters

     */

    public function filters()

    {

        return array(

            'accessControl', // perform access control for CRUD operations

            'postOnly + delete', // we only allow deletion via POST request

        );

    }


    /**

     * Specifies the access control rules.

     * This method is used by the 'accessControl' filter.

     * @return array access control rules

     */

    public function accessRules()

    {

        return array(

            array('allow',  // allow all users to perform 'index' and 'view' actions

                'actions'=>array('index','view'),

                'users'=>array('admin'),

            ),

            array('allow', // allow authenticated user to perform 'create' and 'update'   actions

                'actions'=>array('create'),

                'users'=>array('@'),

            ),

            array('allow', // allow admin user to perform 'admin' and 'delete' actions

                'actions'=>array('admin','delete', 'update', 'UpdateField'),

                'users'=>array('admin'),

            ),

            array('deny',  // deny all users

                'users'=>array('*'),

            ),

        );

    }


    /**

     * Displays a particular model.

     * @param integer $id the ID of the model to be displayed

     */


    public function actionView($id)

    {

        $this->render('view',array(

            'model'=>$this->loadModel($id),

        ));

    }


    /**

     * Creates a new model.

     * If creation is successful, the browser will be redirected to the 'view' page.

     */


    public function actionCreate()

    {

        $model=new Schedule;

        $modelscheditem = new SchedItems;


        // Uncomment the following line if AJAX validation is needed

        // $this->performAjaxValidation($model);

        if(isset($_POST['Schedule'], $_POST['SchedItems']))

        {

            $model->attributes=$_POST['Schedule'];

            $modelscheditem->attributes=$_POST['SchedItems'];


            if($model->save())

                $this->redirect(array('view','id'=>$model->id_schedule));


            if($this->saveSchedItem($_POST['SchedItems']))

                $this->redirect(array('view','id'=>$modelscheditem->id_sched_items));

        }


        //$model=new Schedule;

        //$modelscheditem = new SchedItems;


        $data = array($modelscheditem);


        $this->render('create',array(

            'data'=>$data,

            'model'=>$model,

            'modelscheditem'=>$modelscheditem,


        ));

    }


    protected function saveSchedItem($formData)

    {

        if (empty($formData))

            return;


        $result = array();

        $idx=0;


        foreach($formData['fk_items'] as $fk_items)

        {

            $model = new SchedItem;

            $model->fk_items = $fk_items;


            $model->fk_items = $formData['fk_items'][$idx];


            //no id is submitted for new items

            if(!empty($formData['id_sched_items'][$idx]))

                $modelscheditem->id_sched_items = $formData['id_sched_items'][$idx];


            if(!$model->save())

                return false;


            $idx++;


        }

        return true;

    }





    /**

     * Updates a particular model.

     * If update is successful, the browser will be redirected to the 'view' page.

     * @param integer $id the ID of the model to be updated

     */


    public function actionUpdate($id)

    {

        $model=$this->loadModel($id);

        $modelscheditem = new SchedItems;


        // Uncomment the following line if AJAX validation is needed

        // $this->performAjaxValidation($model);


        if(isset($_POST['Schedule'], $_POST['SchedItems']))

        {

            $model->attributes=$_POST['Schedule'];

            $modelscheditem->attributes=$_POST['SchedItems'];


            if($this->saveSchedItem($_POST['SchedItem']))

            {

                $this->redirect(array('view','id'=>$model->id_schedule));

                $this->redirect(array('view','id'=>$modelscheditem->id_sched_items));

            }


            $modelscheditem = new SchedItems;

            $data=$model->findAll();


            $this->render('update', array('data'=>$data,));


        }


        $this->render('update',array(

            'model'=>$model,

            'modelscheditem'=>$modelscheditem,

        ));


        $es = new EditableSaver('S');

        $es->update();

    }


    /**

     * Deletes a particular model.

     * If deletion is successful, the browser will be redirected to the 'admin' page.

     * @param integer $id the ID of the model to be deleted

     */


    public function actionDelete($id)

    {

        $this->loadModel($id)->delete();


        // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

        if(!isset($_GET['ajax']))

            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

    }


    /**

     * Lists all models.

     */


    public function actionIndex()

    {

        $dataProvider=new CActiveDataProvider('Schedule');

        $this->render('index',array(

            'dataProvider'=>$dataProvider,

        ));

    }


    /**

     * Manages all models.

     */


    public function actionAdmin()

    {

        $model=new Schedule('search');

        $model->unsetAttributes();  // clear any default values

        if(isset($_GET['Schedule']))

            $model->attributes=$_GET['Schedule'];


        $this->render('admin',array(

            'model'=>$model,

        ));

    }


    /**

     * Returns the data model based on the primary key given in the GET variable.

     * If the data model is not found, an HTTP exception will be raised.

     * @param integer $id the ID of the model to be loaded

     * @return Schedule the loaded model

     * @throws CHttpException

     */


    public function loadModel($id)

    {

        $model=Schedule::model()->findByPk($id);

        if($model===null)

            throw new CHttpException(404,'The requested page does not exist.');

        return $model;

    }


    /**

     * Performs the AJAX validation.

     * @param Schedule $model the model to be validated

     */


    protected function performAjaxValidation($model)

    {

        if(isset($_POST['ajax']) && $_POST['ajax']==='schedule-form')

        {

            echo CActiveForm::validate($model);

            Yii::app()->end();

        }

    }


    public function actionAjaxupdate()

    {

        $autoIdAll = $_POST['autoId'];

        if(count($autoIdAll)>0)

        {

            foreach($autoIdAll as $autoId)

            {

                $model=$this->loadModel($autoId);

                if($act=='doActive')

                    $model->isActive = '1';

                if($act=='doInactive')

                    $model->isActive = '0';

                if($model->save())

                    echo 'ok';

                else

                    throw new Exception("Sorry",500);


            }

        }

    }


    /*public function actionUpdateEditable() {

        Yii::import('bootstrap.widgets.TbEditableSaver');

        $es = new TbEditableSaver($_GET['tableName']);  // 'modelName' is classname of model to be updated

        $es->update();

    }*/


    public function actionUpdateField()

    {

        $es = new EditableSaver('Schedule');  //'User' is name of model to be updated

        $es->update();

    }

}



_form.php


<?php

/* @var $this ScheduleController */

/* @var $model Schedule */

/* @var $form CActiveForm */

?>


<div class="form">


    <?php $form=$this->beginWidget('CActiveForm', array(

        'id'=>'schedule-form',

        // Please note: When you enable ajax validation, make sure the corresponding

        // controller action is handling ajax validation correctly.

        // There is a call to performAjaxValidation() commented in generated controller code.

        // See class documentation of CActiveForm for details on this.

        'enableAjaxValidation'=>false,

    )); ?>


    <!--<p class="note">Fields with <span class="required">*</span> are required.</p>-->

    <br>


    <?php echo $form->errorSummary($model); ?>


    <br>


    <!--Users-->

    <div class="row">

        <?php echo "User Name:";?>

        <br>

        <?php echo $form->dropDownList($model,'fk_userid', $model->getUser()); ?>

        <br>

        <?php echo $form->error($model,'fk_userid'); ?>

    </div>


    <!--Date From-->

    <div class="row">

        <?php echo $form->labelEx($model,'date_from'); ?>

        <?php $this->widget('zii.widgets.jui.CJuiDatePicker',array(

            'model'=>Schedule::model(),

            'name'=>'Schedule[date_from]',

            'value'=>$model->date_from,

            'options'=>array(

                'dateFormat' => 'yy-mm-dd',

                'showAnim'=>'clip',//'slide','fold','slideDown','fadeIn','blind','bounce','clip','drop'

                'changeMonth'=>true,

                'changeYear'=>true,

                'yearRange'=>'1900:date(y)',    // 1900 to current year

                //'minDate' => '1900-01-01',      // minimum date

                // maximum date(current date)

                //'showOn'=>'both', // 'focus', 'button', 'both'

                //'buttonText'=>Yii::t('ui',''),

                //'buttonImage'=>Yii::app()->request->baseUrl.'/images/calendar.png',

                //'buttonImageOnly'=>true,

            ),

            'htmlOptions'=>array(),

        ));

        ?>

        <?php echo $form->error($model,'date_from'); ?>

    </div>


    <!--Date To-->

    <div class="row">

        <?php echo $form->labelEx($model,'date_to'); ?>

        <?php $this->widget('zii.widgets.jui.CJuiDatePicker',array(

            'model'=>Schedule::model(),

            'name'=>'Schedule[date_to]',

            'value'=>$model->date_to,

            'options'=>array(

                'dateFormat' => 'yy-mm-dd',

                'showAnim'=>'clip',//'slide','fold','slideDown','fadeIn','blind','bounce','clip','drop'

                'changeMonth'=>true,

                'changeYear'=>true,

                'yearRange'=>'1900:date(y)',    // 1900 to current year

                //'minDate' => '1900-01-01',      // minimum date

                // maximum date(current date)

                //'showOn'=>'both', // 'focus', 'button', 'both'

                //'buttonText'=>Yii::t('ui',''),

                //'buttonImage'=>Yii::app()->request->baseUrl.'/images/calendar.png',

                //'buttonImageOnly'=>true,

            ),

            'htmlOptions'=>array(),

        ));

        ?>

        <?php echo $form->error($model,'date_to'); ?>

    </div>


    <!--Time From-->

    <div class="row">

        <?php echo $form->labelEx($model,'time_from'); ?>

        <?php $this->widget('booster.widgets.TbTimePicker',array(

                'model'=>Schedule::model(),

                'name' =>'Schedule[time_from]',

                'value' =>$model->time_from,

                'noAppend' => true, // mandatory

                'options' => array(

                    'disableFocus' => true, // mandatory

                    'showMeridian' => false // irrelevant

                ),

                'wrapperHtmlOptions' => array('class' => 'col-md-3'),

            )

        );

        ?>

        <?php echo $form->error($model,'time_from'); ?>

    </div>


    <!--Time To-->

    <div class="row">

        <?php echo $form->labelEx($model,'time_to'); ?>

        <?php $this->widget('booster.widgets.TbTimePicker',array(

                'model'=>Schedule::model(),

                'name' =>'Schedule[time_to]',

                'value' =>$model->time_to,

                'noAppend' => true, // mandatory

                'options' => array(

                    'disableFocus' => true, // mandatory

                    'showMeridian' => false // irrelevant

                ),

                'wrapperHtmlOptions' => array('class' => 'col-md-3'),

            )

        );

        ?>

        <?php echo $form->error($model,'time_to'); ?>

    </div>


    <!--Rooms-->

    <div class="row">

        <?php echo "Room Name"; ?>

        <br>

        <?php echo $form->dropDownList($model,'fk_room', $model->getRoom()); ?>

        <br>

        <?php echo $form->error($model,'fk_room'); ?>

    </div>


    <!--Items-->

    <?php echo "Item Name"//$form->labelEx($modelscheditem,'fk_items'); ?><br>

    <?php

    $this->widget('ext.jqrelcopy.JQRelcopy',array(

        'id' => 'copylink',

        'removeText' => 'Remove',

        'removeHtmlOptions' => array('style'=>'color:red'),

        'options' => array(

            'limit'=>5,

            'append'=>CHtml::tag('span',array('class'=>'hint'),'You can remove this line'),

        )

    ))

    ?>


    <?php if (empty($data)): ?>

        <div class="row copy">

            <?php echo CHtml::dropDownList('SchedItems[fk_items]', $modelscheditem, $model->getItem()); ?>

            <?php echo $form->error($modelscheditem,'fk_items'); ?>

        </div>

    <?php else: ?>

        <?php

        $idx = 0;

        $count = count($data);


        foreach($data as $modelscheditem):

            //the last added row is the row to copy

            $copyClass = ($idx == $count-1) ? ' copy' : '';


            ?>

            <div class="row<?php echo $copyClass;  ?>">

                <?php

                //don't allow to edit the id, don't copy the id to new records

                echo CHtml::hiddenField('SchedItems[fk_items]',$modelscheditem->id_sched_items,array('class'=>'nocopy'));

                echo CHtml::tag('span',array('class'=>'nocopy'),$modelscheditem->id_sched_items);

                ?>


                <?php echo CHtml::dropDownList('fk_items', $modelscheditem, $model->getItem()); ?>

                <?php echo $form->error($modelscheditem,'fk_items'); ?>


            </div>

            <?php

            $idx++;

        endforeach;

        ?>

    <?php endif; ?>

    <a id="copylink" href="#" rel=".copy">Add Item</a>




    <!--Current Date-->

    <div class="row">

        <?php echo $form->hiddenField($model,'createddate',array('value'=>date('yy-m-d H:m:s'))); ?>

    </div>


    <!--Approved By-->

    <div class="row">

        <?php echo $form->hiddenField($model,'approvedby',array('value'=>0)); ?>

    </div>




    <!--Submit-->

    <div class="row buttons">

        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>

    </div>


    <?php $this->endWidget(); ?>


</div><!-- form -->[/code


create.php

[code]<?php

/* @var $this ScheduleController */

/* @var $model Schedule */





$this->menu=array(

	array('label'=>'Manage Schedule', 'url'=>array('admin')),

);

?>


<h1>Create Schedule</h1>


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

<?php $this->renderPartial('_form', array(/*'model'=>$model,*/ /*'modelscheditem'=>$modelscheditem,*/ 'data'=>$data));?>

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

Schedule.php (model)


<?php


/**

 * This is the model class for table "schedule".

 *

 * The followings are the available columns in table 'schedule':

 * @property integer $id_schedule

 * @property string $fk_userid

 * @property string $date_from

 * @property string $date_to

 * @property string $time_from

 * @property string $time_to

 * @property integer $fk_room

 * @property string $status

 * @property string $remarks

 * @property integer $approvedby

 * @property string $createddate

 */

class Schedule extends CActiveRecord

{

    /**

     * @return string the associated database table name

     */

    public function tableName()

    {

        return 'schedule';

    }


    /**

     * @return array validation rules for model attributes.

     */

    public function rules()

    {

        // NOTE: you should only define rules for those attributes that

        // will receive user inputs.

        return array(

            array('fk_room, approvedby', 'numerical', 'integerOnly'=>true),

            array('fk_userid, status, remarks', 'length', 'max'=>45),

            array('date_from, date_to, time_from, time_to, createddate, approvedby', 'safe'),


            // The following rule is used by search().

            // @todo Please remove those attributes that should not be searched.

            array('id_schedule, fk_userid, date_from, date_to, time_from, time_to, fk_room, status, remarks, approvedby, createddate', 'safe', 'on'=>'search'),




        );

    }


    /**

     * @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(

            'rooms'=>array(self::BELONGS_TO, "Rooms", "fk_room"),

            'users'=>array(self::BELONGS_TO, "OstUseraccounts", "fk_userid"),

            'scheditems'=>array(self::BELONGS_TO, "SchedItems", "fk_items"),

        );

    }


    /**

     * @return array customized attribute labels (name=>label)

     */

    public function attributeLabels()

    {

        return array(

            'id_schedule' => 'Id Schedule',

            'fk_userid' => 'Fk Userid',

            'date_from' => 'Date From',

            'date_to' => 'Date To',

            'time_from' => 'Time From',

            'time_to' => 'Time To',

            'fk_room' => 'Fk Room',

            'status' => 'Status',

            'remarks' => 'Remarks',

            'approvedby' => 'Approvedby',

            'createddate' => 'Createddate',

        );

    }


    /**

     * Retrieves a list of models based on the current search/filter conditions.

     *

     * Typical usecase:

     * - Initialize the model fields with values from filter form.

     * - Execute this method to get CActiveDataProvider instance which will filter

     * models according to data in model fields.

     * - Pass data provider to CGridView, CListView or any similar widget.

     *

     * @return CActiveDataProvider the data provider that can return the models

     * based on the search/filter conditions.

     */


    public function search()

    {

        // @todo Please modify the following code to remove attributes that should not be searched.


        $criteria=new CDbCriteria;


        $criteria->compare('id_schedule',$this->id_schedule);

        $criteria->compare('fk_userid',$this->fk_userid,true);

        $criteria->compare('date_from',$this->date_from,true);

        $criteria->compare('date_to',$this->date_to,true);

        $criteria->compare('time_from',$this->time_from,true);

        $criteria->compare('time_to',$this->time_to,true);

        $criteria->compare('fk_room',$this->fk_room);

        $criteria->compare('status',$this->status,true);

        $criteria->compare('remarks',$this->remarks,true);

        $criteria->compare('approvedby',$this->approvedby);

        $criteria->compare('createddate',$this->createddate,true);


        return new CActiveDataProvider($this, array(

            'criteria'=>$criteria,


        ));

    }


    /**

     * @return CDbConnection the database connection used for this class

     */

    public function getDbConnection()

    {

        return Yii::app()->reservation_db;

    }


    /**

     * Returns the static model of the specified AR class.

     * Please note that you should have this exact method in all your CActiveRecord descendants!

     * @param string $className active record class name.

     * @return Schedule the static model class

     */


    public static function model($className=__CLASS__)

    {

        return parent::model($className);

    }


    public function getRoom(){

        $list = Chtml::listData(Rooms::model()->findAll(),'id_rooms','room_name');

        return $list;

    }


    public function getItem(){

        $listItem = Chtml::listData(Items::model()->findAll(),'id_item','item_name');

        return $listItem;

    }


    public function getUser(){

        $listUser = Chtml::listData(OstUseraccounts::model()->findAll(),'userid','username');

        return $listUser;

    }


    public function getCount()

    {

        $model = Schedule::model()->findAll();

        $count = count($model);


        echo $count;

    }


}