【问题标题】:Multiple validation on one attribute in YiiYii 中一个属性的多重验证
【发布时间】:2014-04-08 08:30:47
【问题描述】:

我想验证多个 CValidator 类的属性。

更具体地说,我希望电子邮件验证器验证电子邮件地址,但我也希望它是必需的。

我当然可以定义两个单独的规则,如下所示:

array('email', 'email'),
array('email', 'required'),

但是当我将输入留空时,验证只返回一个错误,说明该字段是必需的,但它不会返回一个错误,说明它必须是一个电子邮件地址。当我填写非电子邮件字符串时,它会返回电子邮件验证错误。

我尝试将验证器和逗号分隔的字符串组合在一个数组中,但这不起作用。所以我想唯一的选择是使用自定义验证方法。

但是我怎样才能在这个方法中使用内置的CValidator 验证器呢?我该如何构建它,让这两个规则同时验证,而不是一次验证一个?

【问题讨论】:

    标签: validation yii


    【解决方案1】:

    如果我让你正确,你有错误消息的问题。我认为您可以使用以下方法来显示消息。

    array('email', 'email', 'message' => 'Please provide valid email.'),
    array('email', 'required', 'message' => 'Email is required. Please provide valid email.'),
    

    希望这对你有帮助....

    【讨论】:

      【解决方案2】:

      用户界面明智地指定电子邮件在留空时无效是没有意义的。您告诉他们电子邮件为空时是必需的,或者当电子邮件不是空的但不是电子邮件时无效。两者都做对我来说似乎很困惑。

      我个人只是使​​用:

      array('email', 'email', 'allowEmpty' => FALSE),
      

      【讨论】:

        【解决方案3】:

        使用errorsummary()方法:

        编辑: 更改了对 CHTML 的引用

        http://www.yiiframework.com/doc/api/1.1/CHtml#errorSummary-detail

        在你看来,添加

        <?php echo CHtml::errorSummary($model, NULL, NULL, array ('firstError' => false));
              ...
        <div class="row">
            <?php echo $form->labelEx($model,'email'); ?>
            <?php echo $form->textField($model,'email'); ?>
            <?php echo $form->error($model,'email'); ?>
        </div>
        

        来自文档

        要在容器 div 标记中呈现的其他 HTML 属性。一个 识别名为“firstError”的特殊选项,当设置为真时, 将使错误摘要仅显示第一个错误消息 每个属性。如果未设置或为 false,则所有错误消息 将显示。此选项从 1.1.3 版本开始可用。

        请注意,如果您使用的是 Ajax 验证,那么您只会在字段旁边收到第一个错误

        【讨论】:

        • 我已经在使用这个方法,但它只给了我属性的第一条错误消息,当然还有其他属性的错误消息。除了其他属性的错误消息之外,不是,这就是我想要的,单个属性的多个错误消息。
        【解决方案4】:

        实际上模型验证会返回所有验证错误,但CActiveForm::error 方法只显示所选属性的第一个错误。我猜你现在使用这样的东西:

        <?php echo $form->error($model,'attr'); ?>
        

        但应该使用

        <?php if ($model->hasErrors('attr')) : ?>
            <?php $errorList = $model->getErrors('attr'); ?>
            <?php foreach ($errorList as $error) : ?>
                // display error
            <?php endforeach ?>
        <?php endif ?>
        

        您还可以编写自己的辅助方法来显示单个属性的所有错误。

        【讨论】:

        • $model-&gt;hasErrors('attr') 返回一个布尔值对吗?所以,我不能遍历它...
        • 对。编辑了我的答案。
        • 这不起作用。仍然只返回一个错误,所以我猜如果一个规则返回 false,验证过程就会停止。
        • 验证器不会返回 false 或 true,它们会向您的模型添加错误。查看 CModel 类的 validate() 方法。
        • 此外,如果您查看 CEmailValidator,您会注意到默认情况下为 true 的 allowEmpty 属性。您应该在规则数组中将其更改为 false:array('email', 'email', 'allowEmpty'=>false),
        【解决方案5】:

        您可以使用验证器的skipOnError 属性。

        array('email', 'email', 'skipOnError' => false),
        array('email', 'required', 'skipOnError' => false),
        

        【讨论】:

          猜你喜欢
          • 2011-03-17
          • 1970-01-01
          • 1970-01-01
          • 2013-04-09
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 2013-01-17
          • 2014-10-18
          相关资源
          最近更新 更多