How to use single form to collect data for two or more models (CActiveForm and Ajax Validation edition)

With Yii you can use one CActiveForm for collecting data for two or more models with ajax validation and client validation.

According this article you can also create a form with ajax validation for both models.

You have two models $a and $b.

create.php

<?php $form = $this->beginWidget('CActiveForm', array(
    'id'=>'user-form',
    'enableAjaxValidation'=>true,
)); ?>

<?php echo $form->errorSummary(array($a,$b)); ?>

<div class="row">
    <?php echo $form->labelEx($a,'firstName'); ?>
    <?php echo $form->textField($a,'firstName'); ?>
    <?php echo $form->error($a,'firstName'); ?>
</div>
<div class="row">
    <?php echo $form->labelEx($b,'lastName'); ?>
    <?php echo $form->textField($b,'lastName'); ?>
    <?php echo $form->error($b,'lastName'); ?>
</div>

<?php $this->endWidget(); ?>

controller:

public function actionCreate()
{
    $a=new User;
    $b=new Info;

    $this->performAjaxValidation(array($a,$b));
    if(isset($_POST['User'],$_POST['Info']))
    {
        // populate input data to $a and $b
        $a->attributes=$_POST['User'];
        $b->attributes=$_POST['Info'];
        
        // validate BOTH $a and $b
        $valid=$a->validate();
        $valid=$b->validate() && $valid;
        
        if($valid)
        {
            // use false parameter to disable validation
            $a->save(false);
            $b->save(false);
            
            $this->redirect('index');
        }
    }
    $this->render('create',array('a'=>$a,'b'=>$b));
}

protected function performAjaxValidation($models)
{
    if(isset($_POST['ajax']) && $_POST['ajax']==='user-form')
    {
        echo CActiveForm::validate($models);
        Yii::app()->end();
    }
}

Thats all, now you have form with 2 models and ajaxValidation.

Links

16 0
33 followers
Viewed: 72 482 times
Version: 1.1
Category: How-tos
Written by: RusAlex
Last updated by: Darwin Wen
Created on: Jul 20, 2011
Last updated: 12 years ago
Update Article

Revisions

View all history

Related Articles