【问题标题】:Yii2 whenClient validation issueYii2 whenClient 验证问题
【发布时间】:2015-07-16 07:17:27
【问题描述】:

由于某种原因,我无法让条件规则“必需”起作用。即使我将条件降低为“始终返回 false”,required-validation 似乎也会检查这个不必要的字段:

public function rules() {
    return [
        [['order_id', 'product_id', 'quantity'], 'required'],

        ['product_date', 'required', 
         'whenClient' => "function(attribute, value) {
                              return false;
                          }"
        ],  

       // more rules here
        [['date_create', 'date_update', 'product_date'], 'safe'],
        // more rules here
    ];
}

在表单提交时 save() 失败并且 $model->getErrors() 指向 product_date 作为必要字段。我错过了什么?提前谢谢你。

【问题讨论】:

  • 确定我需要的是更复杂的客户端检查,我只是不明白为什么它在最简单的情况下无法正常工作..

标签: conditional yii2 rule required


【解决方案1】:

您还应该将服务器端条件添加到规则中(文档:when):

['product_date', 'required',
 'when'       => function ($model) {
                     return false;
                 },
 'whenClient' => "function(attribute, value) {
                      return false;
                  }"
],  

whenClient 仅适用于客户端的 JS。当表单被提交时,验证也必须在服务器上完成(或跳过)。如果你有whenClient 定义,通常你应该有一个when 定义。 when 的定义更为重要,whenClient 只是为了改善用户体验。

查找更多信息here

【讨论】:

  • 谢谢,罗布施。但是我可以以某种方式跳过服务器端验证并仍然使用客户端吗?或者,如果我使用“whenClient”,我也必须使用“when”(不仅仅是在其中返回“true”,将验证委托给“whenClient”,而是实际验证用户输入)?
  • 我认为您可以使用whenClient 而不使用when,但我不知道您为什么要这样做。正如您可能知道的那样,客户端验证并不安全。无论如何,当前的行为符合预期:客户端不检查product_date(因为whenClient)。如果该字段在浏览器中为空并被发送到没有when 的服务器,则 required-validator 会将其标记为错误。但是如果有 whendefinition,像 whenClient 一样工作,你不会收到验证错误,因为 required 被覆盖了。
【解决方案2】:

替换

['product_date', 'required', 

    'whenClient' => "function(attribute, value) {
        return false;
    }"
    ],

['product_date', function(attribute, value) {
        return false;
    }],

【讨论】:

  • 不,function(attribute, value) {return false;} 是 JS 代码,因此必须包含在字符串中。
猜你喜欢
  • 1970-01-01
  • 2018-01-24
  • 2018-03-12
  • 2015-05-22
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多