2012-05-14 80 views
0

我有一個字段客戶代碼。如果列表框的值是staff,則它將被禁用,如果列表框值爲admin,則將被禁用。 如果管理員的情況下,客戶代碼是必需的。但在員工的情況下,客戶代碼被禁用,並且不需要應用任何規則。如果該字段未禁用,則爲代碼字段創建規則

如何做到這一點?

+0

我認爲你可以用場景做到這一點,但我不確定... http://www.yiiframework.com/wiki/266/understanding-scenarios/ – llamerr

回答

6

我可以想到兩種方式,或這些的組合。兩者都需要一些調整了完美的結果,但他們都還不錯:

1)方案: 請注意,我有兩個字段/屬性:文本/下拉 在你的控制器:

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;如果是這樣,我將模型的場景更改爲「管理員」。在模型規則中,我有:

public function rules() 
{ 
     return array(
       array('dropdown', 'required'), 
       array('text', 'required', 'on' => 'admin'), 
     ); 
} 

您會發現,文本僅在情景爲admin時才需要。如果您現在在下拉菜單中顯示了管理員,並且文本字段中沒有任何內容,並提交表單,您將得到正確的錯誤。如果你想瞬間,阿賈克斯反饋,當用戶改變的下拉列表中,你可能會在你看來想要這個:

<?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) 
    }')); ?> 

錯誤的下拉第三個參數是包含多個HTML選項,例如asthe回調數組在下拉菜單使用ajax進行驗證後調用。通常情況下,只有當您執行ajax驗證時更新當前字段(即使您獲得所有錯誤)。所以我們在回調中指定也應更新文本字段的錯誤。您現在將會看到,當您在下拉列表中選擇管理員時(不是在啓動時),您會看到一個錯誤。

這不是完美的,因爲你沒有得到你需要的*文本字段,並立即得到警告。我不確定Yiiactiveform是否具有繪製現場裝飾的功能,而不是警告。但是你可以擴展它來做到這一點,或者在回調中使用自定義的js。 如果您在提交後只需要正常驗證,則還可以將所需的類添加到帶有自定義Javascript的文本標籤。目前我不確定CActiveForm在屬性中是否有特殊參數。

2)自定義驗證規則。 與此類似,儘管您不使用場景(但仍然是視圖中的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的文本標籤。

+0

我試過了,場景工作正常。非常感謝您的詳細解答! – ASD

相關問題