Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Yii CForm,嵌套表单Ajax验证_Yii_Nested Forms - Fatal编程技术网

Yii CForm,嵌套表单Ajax验证

Yii CForm,嵌套表单Ajax验证,yii,nested-forms,Yii,Nested Forms,我已经创建了以下嵌套表单数组 return array( 'elements' => array( 'contact' => array( 'type' => 'form', 'elements' => array( 'first_name' => array( 'type' => 'text',

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

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();
$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));
        }
    }
}
我的动作是这样的

echo $form->renderBegin();
echo $form['lead'];
echo $form['contact'];
echo $form->buttons['save-lead']; 
echo $form->renderEnd();
$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验证

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

您应该自己进行验证

在控制器的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', ...));


            }

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

例如:

`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);`

你已经解决这个问题了吗?这里也有同样的问题。您可以向提交按钮添加一个名称,并检查它是否存在于您的控制器中<代码>然后在控制器中
如果(isset($_请求['submit-contact']){echo CActiveForm::validate($contact);Yii::app()->end();}