4

我创建了以下嵌套表单数组;

return array(

    'elements' => array(
        'contact' => array(
            'type' => 'form',
            'elements' => array(
                'first_name' => array(
                    'type' => 'text',
                ),
                'last_name' => array(
                    'type' => 'text',
                )
            ),
        ),
        'lead' => array(
            'type' => 'form',
            'elements' => array(
                'primary_skills' => array(
                    'type' => 'textarea',
                ),
            ),
        ),
    ),

    'buttons' => array(
        'save-lead' => array(
            'type' => 'submit',
            'label' => 'Create',
            'class' => 'btn'
        ),
    )
);

我有这样的查看页面

echo $form->renderBegin();
echo $form['lead'];
echo $form['contact'];
echo $form->buttons['save-lead']; 
echo $form->renderEnd();

我的 actionCreate 是这样的

$form = new CForm('application.views.leads.register');
$form['lead']->model = new Lead;
$form['contact']->model = new Contact;

// how can i perform ajax validation only for $form['contact']
$this->performAjaxValidation($model); 

//if contact form save btn is clicked
if ($form->submitted('save-lead') && $form['contact']->validate() &&

    $form['lead']->validate()
) {

    $contact = $form['contact']->model;
    $lead = $form['lead']->model;
    if ($contact->save()) {
        $lead->contact_id = $contact->id;
        if ($lead->save()) {
            $this->redirect(array('leads/view', 'id' => $lead->id));
        }
    }
}

ajax验证方法是

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

所以我的问题是如何分别对 $form['contact'] 和 $form['lead'] 元素执行 ajax 验证?

4

3 回答 3

1

一个页面中可以有多个表单,但它们不应嵌套。嵌套表单无效。

于 2014-02-21T08:01:12.027 回答
0

嵌套表单无效。您可以使用场景在不同的实例中验证表单。

例子:

`if ($form->submitted('save-lead'){
    $form->scenario = 'save-lead';
    if($form->validate()) {
    $form->save();
    }
} else {
    $form->scenario = 'contact';
    if($form->validate()){
      $form->save();
    }
}
$this->render('_form', array('form'=>$form);`
于 2015-01-06T09:03:51.157 回答
0

您应该进行自己的验证

在您的控制器的 actionCreate 和 actionUpdate 中,您必须添加(我有主模型“Invoice”和辅助“InvoiceDetails”,并且 InvoiceDetails 可能有多个表单)。但是表单当然不能嵌套!

     public function actionCreate()
    { 
     ...
     $PostVar = 'Invoices';
     if (Yii::app()->request->isAjaxRequest)
                { //    if ajax
                $this->performAjaxValidation($model, strtolower($PostVar) . '-form');
                $PostVar = ucfirst($PostVar);

                if (isset($_POST[$PostVar]))
                {
                    $model->attributes = $_POST[$PostVar];
                    $dynamicModel = new InvoiceDetails(); //your model
                    $valid = self::validate($model, $dynamicModel);


                    if (!isset($_POST['ajax']))
                    {

                        if (isset($_POST['InvoiceDetails']))
                        {
                            $allDetails = array();
                            $allDynamicModels = $_POST['InvoiceDetails'];

                            //your own customization
                            foreach ($allDynamicModels as $key => $value)
                            {
                                $InvDet = InvoiceDetails::model()->findByPk($_POST['InvoiceDetails'][$key]['id']);
                                if (!isset($InvDet))
                                {
                                    $InvDet = new InvoiceDetails();
                                }
                                $InvDet->attributes = $_POST['InvoiceDetails'][$key];
                                $InvDet->save();
                                $allDetails[] = $InvDet;
                            }
                        }

                        $model->invoicedetails = $allDetails;

                        if ($model->save())
                        {
                            echo CJSON::encode(array('status' => 'success'));
                            Yii::app()->end();
                        }
                        else
                        {
                            echo CJSON::encode(array('status' => 'error saving'));
                            Yii::app()->end();
                        }
                    }
                    // Here we say if valid
                    if (!isset($valid))
                    {
                        echo CJSON::encode(array('status' => 'success'));
                    }
                    else
                    {
                        echo $valid;
                    }

                    Yii::app()->end();


                }
                else
                {

                    $this->renderPartial('_form', ...);

                }
            }
            else
            {
                // not AJAX request

                $this->render('_form', ...));


            }
于 2014-09-22T06:48:16.883 回答