{EXTENSION] jqrelcopy

HI all this what i tried.

i used the jqrelcopy i have tried to connect to the database and add each record. I cannot add any records. The create function is not working

these are the files

Model name is Pogo and table name is Pogo

table fields-> id, name, value, comment (all are text fields except the id(auto increment))

_form.php


<div class="form">


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

	'id'=>'pogo-form',

	'enableAjaxValidation'=>false,

)); ?>


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


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


	<?php

 $removeText = 'remove';

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

                         'id' => 'add_persons',

                         'removeText' => $removeText,                        

                         'options' => array('excludeSelector'=>'.nocopy'),

                     ));

?>


 

<a id="add_persons" href="#" rel=".copy">Add Pogo</a>

 

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

            <div class="row copy">

                <?php echo CHtml::encode('name');  ?> 

                <?php echo CHtml::textField('Pogo[firstname][]','');  ?>

                <?php echo CHtml::encode('value');  ?> 

                <?php echo CHtml::textField('Pogo[value][]','');  ?>

				<?php echo CHtml::encode('comment');  ?> 

                <?php echo CHtml::textField('Pogo[comment][]','');  ?>

            </div>

    <?php else: ?>

        <?php

        $idx = 0;

        $count = count($data);

 

        foreach($data as $pogo):

          //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('Pogo[id][]',$pogo->id,array('class'=>'nocopy')); 

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

            ?>  

            <?php echo CHtml::encode('name');  ?> 

            <?php echo CHtml::textField('Pogo[name][]',$pogo->name);  ?>

            <?php echo CHtml::encode('value');  ?> 

            <?php echo CHtml::textField('Pogo[value][]',$pogo->value);?>

			<?php echo CHtml::encode('comment');  ?> 

            <?php echo CHtml::textField('Pogo[comment][]',$pogo->comment);?>

            <a class="nocopy" onclick="$(this).parent().remove(); return false;" href="#"><?php echo $removeText;  ?></a>

        </div>

        <?php 

           $idx++; 

           endforeach; 

        ?>

    <?php endif; ?>

<?php echo CHtml::submitButton('save'); ?>

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


</div><!-- form -->

PogoController


<?php


class PogoController 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

		);

	}


	/**

	 * 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('*'),

			),

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

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

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

			),

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

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

				'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 Pogo;


		// Uncomment the following line if AJAX validation is needed

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


		if(isset($_POST['Pogo']))

		{

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

			if($model->save())

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

		}


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

			'model'=>$model,

		));

	}


	protected function savePogo($formData)

    {

        if (empty($formData))

            return;

 

        $result = array();

            $idx=0;

 

                //You will get 3 arrays in $formData: id, firstname, lastname

 

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

        {

                   $model = new Pogo;

                   $model->name = $name;

 

                   //The other attributes can be found at the same postion in the formData

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

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

 

                   //no id is submitted for new items  

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

                       $model->id = $formData['id'][$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);


		// Uncomment the following line if AJAX validation is needed

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


		if(isset($_POST['Pogo']))

		{

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

			if($model->save())

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

		}


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

			'model'=>$model,

		));

	}


	/**

	 * Deletes a particular model.

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

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

	 */

	public function actionDelete($id)

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$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'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	/**

	 * Lists all models.

	 */

	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('Pogo');

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

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new Pogo('search');

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

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

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


		$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 the ID of the model to be loaded

	 */

	public function loadModel($id)

	{

		$model=Pogo::model()->findByPk((int)$id);

		if($model===null)

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

		return $model;

	}


	/**

	 * Performs the AJAX validation.

	 * @param CModel the model to be validated

	 */

	protected function performAjaxValidation($model)

	{

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

		{

			echo CActiveForm::validate($model);

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

		}

	}

}



Create view


<?php

$this->breadcrumbs=array(

	'Pogos'=>array('index'),

	'Create',

);


$this->menu=array(

	array('label'=>'List Pogo', 'url'=>array('index')),

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

);

?>


<h1>Create Pogo</h1>


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

Model Pogo


<?php


/**

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

 *

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

 * @property integer $id

 * @property string $name

 * @property string $value

 * @property string $comment

 */

class Pogo extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @return Pogo 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 'pogo';

	}


	/**

	 * @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('name, value, comment', 'required'),

			array('name, value, comment', 'length', 'max'=>10),

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

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

			array('id, name, value, comment', '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(

		);

	}


	/**

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

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'name' => 'Name',

			'value' => 'Value',

			'comment' => 'Comment',

		);

	}


	/**

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

	 * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.

	 */

	public function search()

	{

		// Warning: Please modify the following code to remove attributes that

		// should not be searched.


		$criteria=new CDbCriteria;


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

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

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

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


		return new CActiveDataProvider(get_class($this), array(

			'criteria'=>$criteria,

		));

	}

}

You don’t call the protected function savePogo($formData) in the controllers actionUpdate and actionCreate,

see my example of relCopy.

1. You can’t use the default workaround in the controller actions




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

 if($model->save()) ...



because $_POST[‘Pogo’] doesn’t have the structure of one model, there are multiple records submitted from the form.

You can take a look at $_POST[‘Pogo’] by using a debugger or var_dump, CVardumper::dump.

To save the model is the job of ‘savePogo($formData)’:

It creates an extra model for each submitted row, assigns the attributes and saves the model.

You submit ‘$data’ (array of model Pogo) to the views.







public function actionCreate()

{

	

	if(isset($_POST['Pogo']))

	{

		if($this->savePogo($_POST['Pogo']))

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

	}

   

        $model=new Pogo;

	

	//create an array with one model Pogo

	$data = array($model);

   

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

			      'data'=>$data, //array of 'Pogo'

	           ));

}




public function actionUpdate($id)

{

	//this only would load a single model, don't use it

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


	if(isset($_POST['Pogo']))

	{

	   if($this->savePogo($_POST['Pogo'])) //save all records

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

	}

	

	$model = new Pogo();


	//$data is an array of the model 'Pogo', not a single 'Pogo'

	$data = $model->findAll(); 


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

		'data'=>$data, //array of 'Pogo'

	));

}






2. Controllers ‘render’ function now submit $data to the update/create view

In your _form view you use ‘$data’, so the update/create views should submit this variable.

Change the code in the update/create views from model to data:





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




Hope this helps.

Otherwise, use var_dump to see what’s going on.

Thank You Very much it works flawless!!!!

You ROCK!!!!

Hello everybody.

I tried this example step by step many times and it shows me this error when i access the route: /index.php?r=pogo/create:


Create Pogo

Fields with * are required.

Fatal error: Call to a member function getErrors() on a non-object in C:\Alejandro\xampp\htdocs\Yii\framework\web\helpers\CHtml.php on line 1592


My question is why? beacause i did it like all this page with all the database offcourse and everything, because i tried with my project, when i tried with this "Pogo" examplo. It didnt work.

Another details if this information is usefull is that only shows that error above when a i change the actionCreate function by default with the new actionCreate function. In other words with the actionCreate function it renders well but its doesnt save, with the new actionCreate function its doesnt render it shows the error above.

Best regards.

You use textfield but I need instead the datetime picker fields. Do you know how to do that?