现在有:
2个数据模型:User.php,Pro
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['Pro file'])) { $modelA->attributes=$_POST['User']; $modelB->attributes=$_POST['Pro file']; if($model->validate() && $modelB->validate()) { if ($modelB->save(false)) { $modelA->pro file_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和Pro
可能有很多人不理解:
1.为什么会有2个$_POST,那是因为在视图里,$modelA的每一个input的name是数组:User["user_name"],User['user_pass']….
同理在$modelB里的每一个input的name是:Pro
所以表单提交到控制器动作create里的时候就能接收到2个POST。
2.if($modelA->validate()
&& $modelB->validate())这里是先验证数据,如果通过再save()。
如果你直接用if($modelA->save()
&&
$modelB->save()),可能会产生,A通过了,但是B没通过。于是数据库里User写进去了,但是Pro
3.由于前面已经验证通过了。所以后面的$modelA->save(false)里面加个false,表示保存之前不需要再验证了!
转自http://www.cnblogs.com/wuyunhua/articles/2297497.html
评论