5

Yiiモデルには2つの関連フィールドがあります。それらはitems_perとitems_periodです。

items_perは、特定の期間に処理されるアイテムの数を反映する整数です。

items_periodは、その期間の秒数です(秒、分、時間のラベルが付いたオプションのあるドロップダウン)。items_perにitems_periodを掛けると、「itemspersecond」になります。

1秒あたりのアイテム数が特定の量を超えることを制限するようにカスタム検証ルールを設定しました。これはすべて正常に機能し、items_perフィールド(ぼかし時)の値を変更すると、ajax検証を使用して適切なエラーメッセージが表示されます。

items_periodフィールドが変更されるたびにitems_perフィールドの検証がトリガーされる必要があります(100 /秒は許可されない場合がありますが、100 /分は許可されます)。

items_perドロップダウンにonchange関数を追加して、items_perフィールドで「blur」または「change」をトリガーしようとしましたが、検証のためのajaxリクエストが行われないようです。検証をトリガーするためだけにフォームを送信することはできません。エラーが発生せず、ユーザーの準備が整う前にレコードを保存するだけでよい可能性があるためです。

あるフィールドに別のフィールドでajax検証をトリガーさせる方法についての提案はありますか?

4

2 に答える 2

5

を拡張するカスタムバリデーターを定義すると、AJAX介して、プレーンリクエストの検証をクライアント側(JSを使用)ですべて1つのパッケージにまとめることができますCValidator

「プレーン」検証の場合、正しい属性名とパラメーターを使用してバリデーターを設定し、validateAttributeメソッドをオーバーライドします。

クライアント側の検証では、メソッドをさらにオーバーライドしますclientValidateAttribute。フォームでクライアント検証が有効になっている場合、入力を検証するためにカスタムJSが自動的に呼び出されます。オーバーライド内から、このコンテキストで実行されるJSコードを出力します。

function(value, messages, attribute) {
    // your code goes here
    // value: current value of attribute
    // messages: array of strings (validation errors) you should append to
    // attribute: name of the attribute
}

を使用して、このフレームワークで組み込みのバリデーターがどのように機能するかを確認できます。も参照してくださいCActiveForm.clientOptions

AJAX検証の場合、検証のためにフォームを送信できます。ajax=something特別なパラメーターを含める(たとえば)か、1つを除外する(たとえば、送信ボタンの値を含めない)ように検証を構成するという考え方です。実際、YiiはすべてのAJAX検証リクエストにパラメーターを自動的に含めることでこれをすでに行っています!ajax=formId

このようにして、常に検証するが、必要なときにのみ保存するコントローラーコードを簡単に記述できます。この例は、YiiリファレンスにもありますCActiveForm(「AJAX検証リクエストに応答するには、次のクラスコードが必要です:」を検索してください)。

最後に、を呼び出すことにより、Javascriptを使用して任意の属性の検証ステータスをプログラムで設定できます$.fn.yiiactiveform.updateInput。これを行う場合は$.fn.yiiactiveform.updateSummary、同様に電話してYiiを模倣し続けることをお勧めします。

于 2012-07-13T11:25:05.597 に答える
5

次のjavascript関数を作成しました。これは、特定のフィールドを変更するときに手動で呼び出します。すべてのフォーム要素に対してajax検証を実行します。

/ **
 * @author marcovtwout
 *指定されたフォームで完全なajax検証を強制的に実行します。
 *@paramオブジェクト$formjQueryフォームオブジェクト
 * /
PerformFullAjaxValidation = function($ form){
    var settings = $ form.data( "settings");
    $ .each(settings.attributes、function(){
        this.status = 2; //ajax検証を強制します
    });
    $ form.data( "settings"、settings);

    //ajax検証をトリガーします
    $ .fn.yiiactiveform.validate($ form、function(data){
        $ .each(settings.attributes、function(){
            $ .fn.yiiactiveform.updateInput(this、data、$ form);
        });
        $ .fn.yiiactiveform.updateSummary($ form、data);
    });
}
于 2013-02-27T11:34:58.613 に答える