2012-07-28 99 views
3

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

首先,我想看看我是否了解notEmptysetRequired之间的区别。据我所知,验证器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并生成任何错误消息。为什么? notEmpty验证程序不应该确定这些值是空的,因为该元素在POST数据中有条目吗?如果我使用setRequired(true),它的工作原理就是我想要的。它只是我脑海中的混乱,它确定用户名不是空的,当这个值是一个空字符串。 :-)

在此先感谢。

回答

5

我同意这有点令人困惑。原因是所有表单元素都有一个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); 
+0

我事先看到'setAllowEmpty',但我认为这只是另一种使用'notEmpty'的方法。你用可选的元素说明了一点。谢谢你的回答。 – Andy0708 2012-07-28 13:46:50