Problem With Id Field On Create

Hello,

I used gii to generate an initial crud interface for one table. This table has one auto-increment primary key, id. The create page shows a field for ID, which i obviously don’t want. If I just remove it from the form, I can add a record, however, there’s a bit of code that fails in the controller, in the actionCreate() method:

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

This gives a 404, because $model->id is empty. But I do want to show a view of the new record upon completion of the create action.

Being new to Yii (just started today), I’m not sure of the best way to work this out. Anyone?

TIA,

Rodrigo

Hi Rodrigo, welcome to the forum.

This should work after the model has been successfully saved.

Would you please show your controller code?

Remove id(primary field) from view. In action of your controller, save the model. $model -> save(); Soon after the save you should be able to access the variable $model ->id. Then redirect to wherever you want.

And yes, if you did exactly the same, show the snippet for controller.

Hello guys,

Thanks, that’s what I had done, removed from view (_form.php).

Here’s the controller code:




<?php


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

			),

			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('index','view','create','update','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 Companies;


		// Uncomment the following line if AJAX validation is needed

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


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

		{

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

			if($model->save())

			{

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

				//$model->refresh();

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

			}

		}


		$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['Companies']))

		{

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

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

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

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new Companies('search');

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

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

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


		$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=Companies::model()->findByPk($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']==='companies-form')

		{

			echo CActiveForm::validate($model);

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

		}

	}

}



rgds.

Fixed. My sequence (using PGSQL) for id was missing a select grant, so Yii could not retrieve last insert id. However, PHPPDO extension did not make this visible at all, it would mask the issue to Yii. Once I switched to standard php-pdo module, Yii showed error that led me into resolution.

best regards,

rodrigo