如何在Yii中禁用更新字段

时间:2014-04-04 09:54:33

标签: php yii

我希望在用户更新时禁用或将readOnly设为字段,即username。当注册用户更新他们的信息时,他们将看到该用户名被禁用。我试过基于this回答,但它对我不起作用而不是错误User has an invalid validation rule. The rule must specify attributes to be validated and the validator name. 我在规则中写道:

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

,格式为:

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

但不明白为什么这会显示错误。

5 个答案:

答案 0 :(得分:7)

验证规则毫无意义。

错误消息告诉您缺少验证程序名称:

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

但即使你为验证者名称填写了一些东西,它仍然无法工作,因为Yii中没有具有readOnly属性的验证器;此角色由safe属性播放。

在以安全方式更新时使某些字段为只读(即用户无法覆盖的字段)意味着您必须查看提交的数据,并单独确定 如果数据包含现有模型的PK(告诉您是否正在添加或更新),并根据该模型设置模型的方案。如果您不这样做,您的用户可以轻松地操纵发送到服务器的HTTP请求并绕过只读逻辑。

设置方案后,您可以使用几条规则轻松强制执行只读逻辑:

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

答案 1 :(得分: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?

答案 2 :(得分:1)

这种方式更好!

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

答案 3 :(得分:0)

我们可以使用下面的代码,因为它可以用于创建和更新两者:

<?php echo $form->textField($model,'promo_code', ($model->scenario == 'update') ? array('size'=>60,'maxlength'=>1000,   'readOnly'=>'readOnly') :array('size'=>60,'maxlength'=>1000)); ?>

答案 4 :(得分: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'));?>