Validation Yii中一个属性的多个验证

Validation Yii中一个属性的多个验证,validation,yii,Validation,Yii,我想验证多个CValidator类上的属性 更具体地说,我希望电子邮件地址由电子邮件验证器验证,但我也希望它是必需的 我当然可以定义两个不同的规则,如下所示: array('email', 'email'), array('email', 'required'), 但是当我将输入留空时,验证只会返回一个错误,说明该字段是必需的,但不会返回一个错误,说明它必须是电子邮件地址。当我填写非电子邮件字符串时,它会返回电子邮件验证错误 我尝试将验证程序组合到一个数组中,并使用逗号分隔的字符串,但这不起作

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

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

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

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

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


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

实际上,模型验证返回所有验证错误,但是
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 ?>

//显示错误

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

如果我没有弄错,您可能会遇到错误消息的问题。我想你们可以用下面的方法来展示信息

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

希望这能帮助您……

从用户界面的角度来看,指定电子邮件为空时无效毫无意义。您告诉他们,当电子邮件为空时,需要该电子邮件;当该电子邮件不是空的但不是电子邮件时,则该电子邮件无效。这两种做法对我来说都很困惑

我个人只使用:

array('email', 'email', 'allowEmpty' => FALSE),
使用errorsummary()方法:

编辑: 更改了对CHTML的引用

在您的视图中,添加

<?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属性。A. 识别名为“firstError”的特殊选项,该选项设置为true时, 将使错误摘要仅显示的第一条错误消息 每个属性。如果未设置或为false,则所有错误消息 将显示。此选项从1.1.3版开始提供


注意,如果您使用的是Ajax验证,那么您将只得到第一个错误,在字段旁边,您可以使用验证程序的
skipOnError
属性

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

$model->hasrerrors('attr')
返回布尔右键?所以,我不能循环通过它…对。编辑了我的答案。这不起作用。仍然只返回了一个错误,因此我猜如果一个规则返回false,验证过程将停止。验证器不会返回false或true,而是向您的模型添加错误。查看CModel类的validate()方法。此外,如果您查看CEmailValidator,您会注意到默认情况下allowEmpty属性为true。您应该在规则数组中将其更改为false:array('email','email','allowEmpty'=>false),我已经在使用此方法,但它只给我该属性的第一条错误消息,当然还有其他属性的错误消息。而不是,这就是我想要的,一个属性的多个错误消息,除了其他属性的错误消息。