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

1 つのページに複数のフォームを含めることができますが、ネストすることはできません。ネストされたフォームは無効です。

于 2014-02-21T08:01:12.027 に答える
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 に答える
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 に答える