Yiiでモデルに入力値を渡す際の注意

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モデルに渡らず、問題となります。ハマると原因を探るのに以外と時間がかかるので注意が必要です。

投稿日:
カテゴリー: php タグ: