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 model($className=__CLASS__)
{
return parent::model($className);
}
public tableName()
{
return 'tbl_user';
}
public rules()
{
return array(
array('name, email, password', 'required'),
array('name, email', 'safe', 'on'=>'search'),
);
}
} のようなものがあったとします。
この際、以下のようなUserコントローラのcreateアクションでデータを登録するとします。
class UserController extends Controller
{
public 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 rules()
{
return array(
array('name, email, password', 'required'),
array('name, email', 'safe', 'on'=>'search'),
);
} の部分で渡すフィールド名が設定されていないとUserモデルには引き渡されないということです。例えば、修正の際に誤って
public rules()
{
return array(
array('name, email', 'required'),
array('name, email', 'safe', 'on'=>'search'),
);
} のように「password」を削除してしまったとします。この場合、passwordの入力値がUserモデルに渡らず、問題となります。ハマると原因を探るのに以外と時間がかかるので注意が必要です。