我有一個字段客戶代碼。如果列表框的值是staff,則它將被禁用,如果列表框值爲admin,則將被禁用。 如果管理員的情況下,客戶代碼是必需的。但在員工的情況下,客戶代碼被禁用,並且不需要應用任何規則。如果該字段未禁用,則爲代碼字段創建規則
如何做到這一點?
我有一個字段客戶代碼。如果列表框的值是staff,則它將被禁用,如果列表框值爲admin,則將被禁用。 如果管理員的情況下,客戶代碼是必需的。但在員工的情況下,客戶代碼被禁用,並且不需要應用任何規則。如果該字段未禁用,則爲代碼字段創建規則
如何做到這一點?
我可以想到兩種方式,或這些的組合。兩者都需要一些調整了完美的結果,但他們都還不錯:
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的文本標籤。
我試過了,場景工作正常。非常感謝您的詳細解答! – ASD
我認爲你可以用場景做到這一點,但我不確定... http://www.yiiframework.com/wiki/266/understanding-scenarios/ – llamerr