Problem with Create and Update

Hello to all,

I successfully created the fullModel and the fullCrud, but I have these errors when I try to access the page create and update :

  • Property "CityController.pickleForm" is not defined. (when I want to create a new city)

  • Property "CityController.loadModel" is not defined. (when I want to update a city)

Have you any idea?

I will take a guess here and assume that you are calling loadModel as a property rather than a method. Try calling $this->loadModelb[/b] rather than $this->loadModel. Let me know if this works for the loadModel part.

Hello Bettor,

I called "loadModel" as a method : $this->loadModel()

same for "pickleForm" : $this->pickleForm($model, $_POST)

where are you trying to access both methods? on controller level or? If it is outside the controller you may have to declare both methods as public…you may want to paste some code too so I can investigate it further

hello bettor and thank you for your attention,

I want to access methods "pickleForm" and "loadModel" from the controller (actionCreate & actionUpdate).




<?php


class TypeReglementController extends Controller

{

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


	public function filters()

	{

	return array(

			'accessControl', 

			);

	}


	public function accessRules()

	{

	return array(

			array('allow',  

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

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

				),

			array('allow', 

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

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

				),

			array('allow', 

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

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

				),

			array('deny', 

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

				),

			);

	}


		public function actionView()

	{

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

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

		));

	}


	public function actionCreate()

	{

		$model = new TypeReglement;

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

			$relation = $_GET['relation']; // TODO - check?!

	    else

			$relation = null;


					$this->pickleForm($model, $_POST);

		

				$this->performAjaxValidation($model, 'type-reglement-form');

    

		if(isset($_POST['TypeReglement'])) {

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




			if($model->save()) {

						unset($_SESSION['TypeReglement']);

    


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

			$this->renderPartial('success', array('model' => $model, 'relation' => $relation));

		else

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

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

				}

			}




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

			$this->renderPartial('_miniform',array( 'model'=>$model, 'relation' => $relation));

		else

			$this->render('create',array( 'model'=>$model));

	}




	public function actionUpdate()

	{

		$model = $this->loadModel();


		    $this->pickleForm($model, $_POST);

		

				$this->performAjaxValidation($model, 'type-reglement-form');

		

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

		{

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




			if($model->save()) {

		      unset($_SESSION['TypeReglement']);

		

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

			}

		}


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

					'model'=>$model,

					));

	}


	public function actionDelete()

	{

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

		{

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


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

			{

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

					$this->redirect($_POST['returnUrl']); 

				else

					$this->redirect(array('admin'));

			}

		}

		else

			throw new CHttpException(400,

					Yii::t('app', 'Invalid request. Please do not repeat this request again.'));

	}


	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('TypeReglement');

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

			'dataProvider'=>$dataProvider,

		));

	}


	public function actionAdmin()

	{

		$model=new TypeReglement('search');

		$model->unsetAttributes();


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

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


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

			'model'=>$model,

		));

	}


}



where in your controller class are the loadModel() and pickleForm() methods? I cannot see them!

You have not defined the function loadModel and pickeForm. You define, for example:




	public function loadModel()

	{

		if($this->_model===null)

		{

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

				$this->_model=TypeReglement::model()->findbyPk($_GET['id']);

			if($this->_model===null)

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

		}

		return $this->_model;

	}



Or regenerate your controller with Crud. Maybe you deleted this function by mistake.

You should also implement the pickleForm

Thank you all, it works well :)

I have regenerated the controller with "Crud Generator" and it works now, as with "Full Crud Generator" does not work.

Did you know why? and do you know the difference between these two methods of generating controller?

Here are the two generated conrolleurs :

with "Crud Generator" :




<?php


class TypeReglementController 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 TypeReglement;


		// Uncomment the following line if AJAX validation is needed

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


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

		{

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

			if($model->save())

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

		}


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

			'model'=>$model,

		));

	}


	/**

	 * 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['TypeReglement']))

		{

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

			if($model->save())

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

		}


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

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

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new TypeReglement('search');

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

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

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


		$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=TypeReglement::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']==='type-reglement-form')

		{

			echo CActiveForm::validate($model);

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

		}

	}

}



with "Full Crud Generator" :




<?php


class TypeReglementController extends Controller

{

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


	public function filters()

	{

	return array(

			'accessControl', 

			);

	}


	public function accessRules()

	{

	return array(

			array('allow',  

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

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

				),

			array('allow', 

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

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

				),

			array('allow', 

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

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

				),

			array('deny', 

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

				),

			);

	}


		public function actionView()

	{

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

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

		));

	}


	public function actionCreate()

	{

		$model = new TypeReglement;

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

			$relation = $_GET['relation']; // TODO - check?!

	    else

			$relation = null;


					$this->pickleForm($model, $_POST);

		

				$this->performAjaxValidation($model, 'type-reglement-form');

    

		if(isset($_POST['TypeReglement'])) {

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




			if($model->save()) {

						unset($_SESSION['TypeReglement']);

    


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

			$this->renderPartial('success', array('model' => $model, 'relation' => $relation));

		else

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

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

				}

			}




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

			$this->renderPartial('_miniform',array( 'model'=>$model, 'relation' => $relation));

		else

			$this->render('create',array( 'model'=>$model));

	}




	public function actionUpdate()

	{

		$model = $this->loadModel();


		    $this->pickleForm($model, $_POST);

		

				$this->performAjaxValidation($model, 'type-reglement-form');

		

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

		{

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




			if($model->save()) {

		      unset($_SESSION['TypeReglement']);

		

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

			}

		}


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

					'model'=>$model,

					));

	}


	public function actionDelete()

	{

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

		{

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


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

			{

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

					$this->redirect($_POST['returnUrl']); 

				else

					$this->redirect(array('admin'));

			}

		}

		else

			throw new CHttpException(400,

					Yii::t('app', 'Invalid request. Please do not repeat this request again.'));

	}


	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('TypeReglement');

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

			'dataProvider'=>$dataProvider,

		));

	}


	public function actionAdmin()

	{

		$model=new TypeReglement('search');

		$model->unsetAttributes();


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

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


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

			'model'=>$model,

		));

	}


}



Full crud does not write the loadModel() that’s why doesent work.

If you use this one, you are supposed to implement by yourself this function, I guess