Yii:検証規則(スクリプト)を動的に変更する

この小さなトピックでは、Yiiフレームワークのコンテキストでの1つの非常に簡単なレシピ(多くの人がおそらく知っている)についてお話したいと思います。 フォームの検証ルールを動的に変更することです-アプリケーションのユーザーの選択に応じて検証ルールが変更される場合、たとえば、リストまたはインストールされたチェックボックスから値を選択することによって行われます。



実用的な必要性から、Webインターフェイスを備えた1つの単純なコンタクトセンターを作成するときに、このソリューションを適用するように促されました。 例が出ないように、同じCCの例を使用してこのレシピの使用方法を簡単に説明します。 ご存じのとおり、KCオペレーターの主な活動は、顧客からの電話と顧客への発信電話を受信することです。 通話の結果に基づいて、オペレーターはシステムに特定のデータを入力する必要があります-クライアントとの会話の結果、それに基づいてチケットのステータスとそれを操作するさらなるロジックが決定されます(繰り返し通話の予約、その他の手順、チケットを閉じるなど)。 問題は、一部のフォームフィールド(読み取り-モデル属性)が「親」ステータスに応じて入力されるか空白になる必要があることです。 たとえば、コールの技術ステータスが「リダイヤル/無効な番号」の場合、「クライアントとの会話の結果」フィールドは記入する意味がないことは明らかです(テクニカルステータスは、システムではなくオペレーターが設定する必要がありますが、コールの受信者は突然になる可能性があります)クライアントではありません-番号のエラーなど)。 同時に、技術ステータス「成功したダイヤル」が設定されている場合、「クライアントとの会話の結果」フィールドに入力する必要があります。 繰り返しますが、会話の結果によっては、追加のフィールド(「コールバック」ステータスの「コールバック日」フィールドなど)を入力する必要がある場合があります。



当然、フォームの特定のフィールドの値に応じて、フォーム全体の検証ルールも変更したいです。 実際には、このタスクは非常に使いやすいですが、私のような場合には非常に便利です。



だから:

1.通話フォームの検証のためのいくつかのシナリオを作成します。

まず、すべてのシナリオで必要なフィールドのルールを作成します。

public function rules(){ //... array('call_status', 'required', 'on'=>'callSubmit, invalidNumberSubmit, validCallSubmit, successCallSubmit...' //... 'message'=>' "{attribute}"    .'), }
      
      





最初のルールは問題を提起しないと思います-呼び出しの技術的ステータスはフォームの最上位の値です-どんなシナリオでも必要です。

私たちは一般から特定へと進み続けます:

 //.. Inside rules() method array('talk_status', 'required', 'on'=>'successCallSubmit, secondCall,...') /*   ,        */
      
      





次に、より特殊なケースのルールを定義します。

 //.. Inside rules() method array('new_call_date', 'required', 'on'=>'secondCall') /*     " "*/
      
      







したがって、一般的な場合と特定の場合の両方で、必要な検証ルールをすべて実行できます。 問題は小さいままです。フォームで選択した値に応じて検証ルールが変更されることを確認してください。 おそらく既に推測されているように、このウィジェットはすぐに使用できるシンプルで明確なAjax検証を可能にするため、CActiveFormを使用します。

例として簡単なフォームを作成しましょう:



  <?php $form=$this->beginWidget('CActiveForm', array( 'id'=>'call-submit-form', 'enableAjaxValidation'=>true, 'clientOptions'=>array( 'validateOnChange'=>true, 'validateOnSubmit'=>true ), //   )); ?>
      
      







関心のあるオプションのうち、「enableAjaxValidation」、「validateOnChange」、「validateOnSubmit」に注意する必要があります。 これらのオプションの目的は疑問を投げかけるものではなく、名前から明らかだと思います。 続ける:



 <div class='control-group'> <?php echo $form->labelEx($model,'call_status'); ?> <?php echo $form->dropDownList($model,'call_status', CHtml::listData( CallStatuses::model()->findAll(),'id','title' ) ); ?> <?php echo $form->labelEx($model,'talk_status'); ?> <?php echo $form->dropDownList($model,'talk_status', CHtml::listData(TalkStatuses::model()->findAll(),'id','title' ), )); ?> <?php echo $form->error($model,'call_status'); ?> <?php echo $form->error($model,'talk_status'); ?> </div> <div class='control-group'> <?php echo $form->label($model,'new_call_date'); ?> <?php //     $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'attribute'=>'new_call_date', 'model'=>$model, //... ), )); ?> </div>
      
      







たくさんのフィールドで退屈することはありません。例としては3つで十分だと思います。 私たちがやるべきことは、検証ルールを動的に変更するための機能を実際に実装することです(読み取りスクリプト)。



実際、この機能は最も単純なロジックに基づいています:この値を選択した後にフォームを検証する各フィールド値にスクリプトを割り当てる必要があります(この場合、CActiveForm :: dropDownList()メソッドによって作成されたリストから値を選択するとき)。 これは非常に簡単な解決策であり、主な目的はアイデアを伝えることであるため、詳細にこだわらずOOP方式で実装を作成することはしません。



代わりに、簡単にするために、適切なコードをコントローラークラスのperformAjaxValidation()メソッドに直接配置します。 以下は、標準のperformAjaxValidation()メソッドと、次の形式をとるメソッドのわずかに変更されたコードです。



 //Inside controller public function actionSaveCall(){ /*     'callSubmit',       - 'call_status' -   . */ $model=new Calls('callSubmit'); $this->performCallAjaxValidation($model); if( isset($_POST['Calls']) ) { $model->attributes = $_POST['Calls']; if( $model->save() ) $this->redirect( Yii::app()->user->returnUrl ); } } protected function performAjaxValidation($model) { if(isset($_POST['ajax']) && $_POST['ajax']==='calls-form') { $callStatusesScenarios = array( Calls::CALL_FAIL=>'validCallSubmit', Calls::SUCCESS_CALL=>'successCallSubmit', Calls::WRONG_NUMBER=>'invalidNumberSubmit'); if( !empty($_POST['Calls']['call_status']) && !empty( $callStatusesScenarios[ $_POST['Calls']['call_status'] ] ) ){ $model->setScenario ( $callStatusesScenarios[ $_POST['Calls']['call_status'] ] ); } echo CActiveForm::validate($model); Yii::app()->end(); } }
      
      







コードからわかるように、「call_status」フィールドの値に応じてスクリプトを変更するだけです。 オペレーターがフォームで「Successful dialer」ダイヤラーステータスを選択すると、検証中のモデルシナリオは「successCallSubmit」に変わり、フォームからの会話ステータスを期待します-結果として、「Successful dialer」を選択すると、オペレーターはフォームを送信できなくなります。 [会話結果]フィールドに入力するまで。 同時に、ダイヤラーのステータスが「間違った番号」の場合、フォームは追加フィールドなしで送信されます。 同じ原則をさらに適用することができます-会話のステータスとその追加フィールドなど。



このアプローチの適用は、入力に必要なフィールドの数とタイプがユーザーの選択によって異なる場合に役立ちます。 ちょっとしたしゃれをおaび申し上げます。素晴らしいYiiフレームワークの開発にご成功をお祈りします。



All Articles