2014-04-04 83 views
4

我想在用戶更新時禁用或只讀字段,即username。當註冊用戶更新他們的信息時,他們會看到該用戶名禁用。我試圖根據this答案,但它不爲我而給了一個錯誤User has an invalid validation rule. The rule must specify attributes to be validated and the validator name. 我在規則中寫道工作:如何禁用Yii更新的字段

array('username', 'readOnly'=>true, 'on'=>'update'), 

和形式:

echo $form->textFieldRow($model,'username',array(
     'class'=>'span5', 
     'maxlength'=>45, 
     'readOnly'=>($model->scenario == 'update')? true : false 
    )); 

但不明白爲什麼這個顯示錯誤。

回答

7

驗證規則沒有意義。

錯誤消息告訴您該校驗器名丟失:

array('username', 'ValidatorNameGoesHere', 'readOnly'=>true, 'on'=>'update'), 

但是,即使你的東西填寫驗證名字它仍然是行不通的,因爲在Yii中沒有驗證具有readOnly屬性;該角色由safe屬性播放。

使某些字段只讀以安全的方式更新時(即一個用戶不能覆蓋),意味着你將不得不看提交的數據,確定獨立如果數據包括的PK一個現有的模型(告訴你是否添加或更新)並基於此設置模型的場景。如果您不這樣做,您的用戶可以輕鬆地操縱發送到服務器的HTTP請求,並繞過只讀邏輯。

場景設置,你可以很容易地與一對夫婦的規則執行只讀邏輯後:

array('username', 'safe', 'except'=>'update'), 
array('username', 'unsafe', 'on'=>'update'), 
+1

值得注意的是:'safe'驗證僅適用於質量分配,也不會否認更新模型的屬性與個人分配('$ model-> someAttribute')。 – Wirone

+0

沒有['unsafe'驗證器](http://www.yiiframework.com/doc-2.0/yii-validators-validator.html) - 第二行是多餘的。 – bakavic

+0

@bakavic在Yii 1中有一個'unsafe'驗證器(例如見[這裏](http://www.yiiframework.com/wiki/533/safe-and-unsafe-model-validators-massive-assignments/)) ,這個問題是關於。當我寫這個答案時,Yii 2還沒有被釋放。=) – Jon

3

你生成的HTML代碼是不正確的。

This is incorrect: <input id='username' readonly='true'> 
This is correct: <input id='username' readonly='readonly'> 

因此,更改您的代碼

echo $form->textFieldRow($model,'username',array(
     'class'=>'span5', 
     'maxlength'=>45, 
     'readOnly'=>($model->scenario == 'update')? "readonly" : "" 
    )); 

參考文獻:http://www.w3.org/TR/html-markup/input.text.html#input.text.attrs.readonly

參考文獻:What is the correct readonly attribute syntax for input text elements?

1

這樣就更好了!

echo $form->textFieldRow($model,'username',array(
    'class'=>'span5', 
    'maxlength'=>45, 
    'readOnly'=>($model->scenario == 'update')? "readonly" : false 
)); 
0

我們可以使用下面的代碼,因爲它會在創建工作,並更新兩個:

<?php echo $form->textField($model,'promo_code', ($model->scenario == 'update') ? array('size'=>60,'maxlength'=>1000, 'readOnly'=>'readOnly') :array('size'=>60,'maxlength'=>1000)); ?> 
0
<?PHP echo $form->textFieldRow($model,'username', ($model->isNewRecord)?array('class' => 'form-control','span'=>5,'maxlength'=>255):array('class' => 'form-control','span'=>5,'maxlength'=>255,'readOnly'=>'readOnly'));?>