登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

820716的博客-知识分享 向上的心!

知识分享 开阔向上的心胸! http://www.820716.net/blog

 
 
 

日志

 
 

Yii框架用一个表单搜集多个模型数据  

2013-11-22 15:36:56|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
老师好:
 

现在有:
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,表示保存之前不需要再验证了!

转自http://www.cnblogs.com/wuyunhua/articles/2297497.html

 
 

感谢您对我工作的理解和支持!


陈龙 QQ:84047848
  评论这张
 
阅读(842)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018