フィールドcustomercodeがあります。リストボックスの値がstaffの場合は無効になり、リストボックスの値がadminの場合は有効になります。adminの場合、customercodeが必要です。ただし、スタッフの場合、カスタマーコードは無効になり、ルールを適用する必要はありません。
どうやってするか?
私は2つの方法、またはそれらの組み合わせを考えることができます。どちらも完璧な結果を得るには微調整が必要ですが、かなり良いです:
1)シナリオ:2つのフィールド/属性があることに注意してください:テキスト/ドロップダウンコントローラー内:
public function actionScenario()
{
$model=new ScenarioForm;
// if it is ajax validation request
if(isset($_POST['ajax']) && $_POST['ajax']==='scenario-form')
{
if($_POST['ScenarioForm']['dropdown'] == 'admin')
$model->scenario = 'admin';
echo CActiveForm::validate($model);
Yii::app()->end();
}
// collect user input data
if(isset($_POST['ScenarioForm']))
{
$model->attributes=$_POST['ScenarioForm'];
if($model->dropdown == 'admin')
$model->scenario = 'admin';
// validate user input
$model->validate();
//do other stuff
}
// display the login form
$this->render('scenario', array('model'=>$model));
}
ご覧のとおり、ドロップダウン値がadminかどうかを確認します。もしそうなら、私はモデルのシナリオを「admin」に変更します。モデルルールには、次のものがあります。
public function rules()
{
return array(
array('dropdown', 'required'),
array('text', 'required', 'on' => 'admin'),
);
}
ご覧のとおり、テキストはシナリオが管理者の場合にのみ必要です。ドロップダウンに管理者がいて、テキストフィールドに何も表示されておらず、フォームを送信すると、適切なエラーが発生します。ユーザーがドロップダウンを変更したときに、即時のajaxフィードバックが必要な場合は、ビューで次のようにすることができます。
<?php echo $form->labelEx($model,'dropdown'); ?>
<?php echo $form->dropDownList($model,'dropdown', array('admin' => 'Admin', 'staff' => 'Staff!')); ?>
<?php echo $form->error($model,'dropdown', array('afterValidateAttribute' => 'js:function(form, attribute, data, hasError)
{
mSettings = $.fn.yiiactiveform.getSettings(form);
$.fn.yiiactiveform.updateInput(mSettings.attributes[1], data, form)
}')); ?>
ドロップダウンのエラーの3番目のパラメーターは、ドロップダウンがajaxで検証された後に呼び出されるコールバックなど、いくつかのhtmlオプションを含む配列です。通常、ajax-validationを実行すると、現在のフィールドのみが更新されます(すべてのエラーが発生した場合でも)。したがって、コールバックで、テキストフィールドのエラーも更新する必要があることを指定します。ドロップダウンでadminを選択すると(起動時ではなく)、エラーが発生することがわかります。
テキストフィールドに必要な*が得られず、すぐに警告が表示されるため、完全ではありません。Yiiactiveformに、警告ではなく、フィールド装飾を描画する機能があるかどうかはわかりません。しかし、おそらくそれを拡張してそれを行うか、コールバックでカスタムjsを使用することができます。送信後に通常の検証が必要な場合は、カスタムJavascriptを使用して必要なクラスをテキストラベルに追加することもできます。現時点では、CActiveFormの属性に特別なパラメーターがあるかどうかはわかりません。
2)カスタム検証ルール。1つと似ていますが、シナリオは使用しません(ただし、ビューではjsコールバックを使用します)。代わりに、ドロップダウンのカスタム検証ルールを作成し、それをルール配列に配置します。ドロップダウンが変更されると、テキストフィールドにエラーが追加されます。
public function check_dropdown($attribute,$params){
if($this->$attribute=="admin"){
$this->addError('text', 'Please enter Text!');
$this->clearErrors('text');
}
}
public function check_text($attribute,$params){
if($this->$attribute!=""){
$this->clearErrors('text');
}
}
ここでは、コントローラーでシナリオを設定する必要はありません。しかし、あなたは必要なルールを失います。アスタリスクが欠落している場合も、ここで同じ問題が発生します。
おそらく方法1を使用します。完全な警告が必要ない場合は、JSONからエラーメッセージを読み取り、それが正しいかどうかを確認して、テキストのラベルに正しいクラスを適用する必要があります。コールバック関数のカスタムJavascript。