Yii框架用一個表單蒐集多個模型數據

轉載自: http://www.fengbloger.net/feng/505.html

現在有:
2個數據模型:User.php,Profile.php分別表示用戶登錄信息和身份信息
1個控制器RegisterController.php
有1個視圖create.php,一個局部視圖:_form.php
in RegisterController.php:

public function actionCreate()
 {
     $modelA = new User;
     $modelB = new Profile;
     if(isset($_POST['User']) && isset($_POST['Profile']))
     {
         $modelA->attributes=$_POST['User'];
         $modelB->attributes=$_POST['Profile'];
         if($model->validate() && $modelB->validate())
         {
             if ($modelB->save(false))
             {
                      $modelA->profile_id = $modelB->id;
                       if ($model->save(false))
                       {
                             $this->redirect(array('view','id'=>$modelA->id));
                       }
               }
          }
     }
     $this->render('create',array(
         'modelA'=>$modelA,
         'modelB'=>$modelB,
     ));
 }

in create.php:

<?php echo $this->renderPartial('_form', array('modelA'=>$modelA,'modelB'=>$modelB)); ?>

in _form.php:

<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'User-form',
    'enableAjaxValidation'=>false,
)); ?>
    <p class="note">Fields with * are required.</p>
    <?php echo $form->errorSummary(array($modelA,$modelB)); ?>//注意這裏
    <div class="row">
        <?php echo $form->labelEx($modelA,'user_name'); ?>
        <?php echo $form->textField($modelA,'user_name'); ?>
        <?php echo $form->error($modelA,'user_name'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($modelA,'user_pass'); ?>
        <?php echo $form->textField($modelA,'user_pass'); ?>
        <?php echo $form->error($modelA,'user_pass'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($modelB,'status'); ?>
        <?php echo $form->textField($modelB,'status'); ?>
        <?php echo $form->error($modelB,'status'); ?>
    </div>
    <div class="row">
        <?php echo $form->labelEx($modelB,'address'); ?>
        <?php echo $form->textField($modelB,'address'); ?>
        <?php echo $form->error($modelB,'address'); ?>
    </div>
<?php $this->endWidget(); ?>

User.php和Profile.php不需要有特別的改動!
可能有很多人不理解:
1.爲什麼會有2個$_POST,那是因爲在視圖裏,$modelA的每一個input的name是數組:User["user_name"],User['user_pass']….
同理在$modelB裏的每一個input的name是:Profile['address'],Profile['status']…
所以表單提交到控制器動作create裏的時候就能接收到2個POST。

2.if($modelA->validate() && $modelB->validate())這裏是先驗證數據,如果通過再save()。

如果你直接用if($modelA->save() && $modelB->save()),可能會產生,A通過了,但是B沒通過。於是數據庫裏User寫進去了,但是Profile沒寫進去。

3.由於前面已經驗證通過了。所以後面的$modelA->save(false)裏面加個false,表示保存之前不需要再驗證了!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章