3

ポップアップで開いているフォームがあるので、フォームを ajax 検証で検証したいのですが、送信ボタンをクリックするとページが更新されるため、検証エラーは発生しません。

ファイルを閲覧する:

 <?php $form = ActiveForm::begin([
        'id' => 'signup-form',
        'enableAjaxValidation' => true,
        //'action' => Url::toRoute('user/ajaxregistration'),
        'validationUrl' => Url::toRoute('user/ajaxregistration')

]); ?>

 <div class="col-md-12">
                    <div class="formbox">
                      <div class="inputbox signup">
                        <div class="input-group"> <span class="input-group-addon"><i class="glyphicon name"></i></span>
                          <?= Html::textInput('userFullName', '', ['placeholder' => "Name",'class'=>'form-control']); ?>
                        </div>

 <?php ActiveForm::end(); ?>

コントローラ ファイル:

public function actionValidate() {

    $model = new SignupForm;

    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model); \Yii::$app->end();

    }


}

モデルコード:

 return [

            ['userFullName', 'trim'],
            ['userFullName', 'required'],


        ];

ページが更新されず、検証エラーが発生するようにするにはどうすればよいか教えてください

4

2 に答える 2

7

ActiveFields なしで ActiveForm を使用しています。これは、モデル内で定義された検証ルールがテキスト入力に割り当てられていないことを意味します。私はあなたの問題の実装を書きました:

モデル:

use Yii;
use yii\base\Model;

class ExampleForm extends Model
{
    // this 'virtual attribute' defines a form field
    public $userFullName;

    // validation rules
    public function rules()
    {
        return [
            ['userFullName', 'trim'],
            ['userFullName', 'required'],
        ];
    }

}

コントローラ:

use models\ExampleForm;
use yii\web\Response;
use yii\widgets\ActiveForm;

public function actionExample()
{
    $model = new ExampleForm;

    // validate any AJAX requests fired off by the form
    if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);
    }

    if ($model->load(Yii::$app->request->post())) {

        // code to process form data goes here.. This will execute on a form submission.

    }

    return $this->render('example-form', [
        'model' => $model,
    ]);
}

意見:

<?php
use yii\widgets\ActiveForm;
use yii\helpers\Html;

$this->title = 'Example';
?>
<div class="exampleForm">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>Please fill out the form.</p>

    <!-- this form will submit via POST to the same action that renders it -->
    <?php $form = ActiveForm::begin() ?>

        <!-- this is an active field. Any validation rules for the 'userFullName' field -->
        <!-- that have been defined within the $model object will be applied to this field -->
        <!-- the validation has also been set to validate via ajax within the $options array -->
        <!-- read more about ActiveFields here: http://www.yiiframework.com/doc-2.0/yii-widgets-activefield.html -->
        <?= $form->field($model, 'userFullName', ['enableAjaxValidation' => true]) ?>

        <div class="form-group">
            <?= Html::submitButton('Submit!', ['class' => 'btn btn-primary']) ?>
        </div>

    <?php ActiveForm::end(); ?>

</div>

ajax リクエストが送信されているかどうか、またはフォームが検証されているかどうかを確認する最善の方法は、Chrome 開発者ツールを確認し、[ネットワーク] タブに移動してアクティビティを調べることです。

于 2016-11-10T23:53:17.917 に答える
1

renderAjax() メソッドを使用します。

 if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return ActiveForm::validate($model);

 }else {
            return $this->renderAjax('YourViewFileName', [
                'model' => $model,
            ]);
        }
于 2016-11-08T17:58:16.930 に答える