我希望在用户更新时禁用或将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
));
但不明白为什么这会显示错误。
答案 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'));?>