CREATE TABLE `tbl_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) NOT NULL, `email` varchar(128) NOT NULL, `password` varchar(128) NOT NULL, `created` datetime DEFAULT NULL, `modified` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
のようなテーブルがあり、このテーブルに対応するUserモデルとして
class User extends CActiveRecord { public static function model($className=__CLASS__) { return parent::model($className); } public function tableName() { return 'tbl_user'; } public function rules() { return array( array('name, email, password', 'required'), array('name, email', 'safe', 'on'=>'search'), ); } }
のようなものがあったとします。
この際、以下のようなUserコントローラのcreateアクションでデータを登録するとします。
class UserController extends Controller { public function actionCreate() { $model=new User; if(isset($_POST['User'])) { $model->attributes=$_POST['User']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } $this->render('create',array('model'=>$model)); } }
なお、以下がcreateアクションが呼び出すuser/create.phpビューの内容です。
<?php $form=$this->beginWidget('bootstrap.widgets.TbActiveForm', array( 'id'=>'user-form', 'focus'=>array($model,'email'), )); ?> <?php echo $form->errorSummary($model); ?> <?php echo $form->textFieldRow($model,'name',array('class'=>'span5','maxlength'=>128)); ?> <?php echo $form->textFieldRow($model,'email',array('class'=>'span5','maxlength'=>128)); ?> <?php echo $form->textFieldRow($model,'password',array('class'=>'span5','maxlength'=>128)); ?> <div class="form-actions"> <?php $this->widget('bootstrap.widgets.TbButton', array( 'buttonType'=>'submit', 'type'=>'primary', 'label'=>'送信', )); ?> </div> <?php $this->endWidget(); ?>
この場合、Userコントローラの
$model->attributes=$_POST['User'];
の部分で、フォームからの入力値がUserモデルに引き渡され、Userモデル内で利用できるようになるのですが、この際、注意すべき点が1点あります。それは、Userモデルの
public function rules() { return array( array('name, email, password', 'required'), array('name, email', 'safe', 'on'=>'search'), ); }
の部分で渡すフィールド名が設定されていないとUserモデルには引き渡されないということです。例えば、修正の際に誤って
public function rules() { return array( array('name, email', 'required'), array('name, email', 'safe', 'on'=>'search'), ); }
のように「password」を削除してしまったとします。この場合、passwordの入力値がUserモデルに渡らず、問題となります。ハマると原因を探るのに以外と時間がかかるので注意が必要です。