【问题标题】:how to disable a field on update in Yii如何在 Yii 中禁用更新字段
【发布时间】:2014-04-04 09:54:32
【问题描述】:

我想在用户更新时禁用或设置只读字段,即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
     ));

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

【问题讨论】:

    标签: php yii


    【解决方案1】:

    那个验证规则是没有意义的。

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

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

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

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

    设置场景后,您可以通过以下几条规则轻松实施只读逻辑:

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

    【讨论】:

    • 值得注意:safe 验证器仅适用于批量分配,不会拒绝使用单独分配更新模型的属性 ($model->someAttribute)。
    • 没有unsafe validator - 第二行是多余的。
    • @bakavic 在 Yii 1 中有一个 unsafe 验证器(例如,参见 here),这个问题就是关于这个的。当我写这个答案时,Yii 2 甚至还没有发布。 =)
    • @Jon 道歉 - 两个框架之间的规则语法非常相似,所以我认为这个问题是关于 yii2 的。
    【解决方案2】:

    您生成的 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?

    【讨论】:

      【解决方案3】:

      这样更好!

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:
          <?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'));?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-05
            相关资源
            最近更新 更多