4

我看过其他问题/谷歌搜索了这个。我的问题是,当我提交带有notEmpty验证器的空文本框的表单时,它不会触发错误。

首先,我想看看我是否理解 和 之间的notEmpty区别setRequired。据我了解,notEmpty如果提交了元素并且值为空,则验证器会出错。也就是说,如果 POST 数据中不存在条目(对于表单),则如果该元素不是必需的,则不会生成错误。就像它只在元素被设置时运行。除非另有说明,否则该setRequired方法将自动notEmpty在幕后添加验证器。这确保了元素的条目必须存在并且不能为空。正确的?

现在,我尝试在我添加notEmpty验证器的表单中使用此逻辑,如下所示:

$username = new Zend_Form_Element_Text('txtUsername');
$username->addValidator(new Zend_Validate_NotEmpty(), true);

其他文本字段也是如此。如果我在不输入值的情况下提交表单,我的 POST 数据如下所示:

(
    [txtUsername] => 
    [txtPassword] => 
    [txtRepeatPassword] => 
)

但是,isValid仍然评估为true并且不会生成错误消息。为什么?由于元素在 POST 数据中有一个条目,验证器不应该notEmpty确定值是空的吗?如果我使用setRequired(true),它会按我的意愿工作。当值为空字符串时,它确定用户名不为空,这让我感到很困惑。:-)

提前致谢。

4

1 回答 1

7

我同意这有点令人困惑。原因是所有表单元素都有一个allowEmpty标志(默认为 true),如果值为空则跳过验证。它以这种方式工作,因为否则,将验证器添加到可选元素将是一个真正的痛苦,例如:

$dateOfBirth = new Zend_Form_Element_Text('dob');
$dateOfBirth->setLabel('Date of birth (optional)');
$dateOfBirth->addValidator(new Zend_Validate_Date());
$form->addElement($dateOfBirth);

如果用户选择不输入他们的出生日期,这将始终无法验证,因为 '' 不是有效日期。默认情况下,使用该allowEmpty标志,它可以按您预期的方式工作(它只验证输入日期的日期)。

调用setRequired(true)添加了一个NotEmpty验证器,但它也将allowEmpty标志设置为 false。我建议你坚持这种方法。或者,您也可以通过设置标志来工作:

$username = new Zend_Form_Element_Text('txtUsername');
$username->addValidator(new Zend_Validate_NotEmpty());
$username->setAllowEmpty(false);
于 2012-07-28T13:04:20.667 回答