Zend框架 - 如何允许表单元素为空字段

3
我正在使用以下结构来创建我的元素:
$freetext = $this->CreateElement('textarea', 'freetext')
            ->setLabel('Comments')
            ->setAttrib('class','input-textarea')
            ->setOptions(array('rows' => '2', 'cols'=>'30'))
            ->addValidator('StringLength', false, array(0,500))
            ->addFilter('HtmlEntities')
            ->addFilter('StripTags')
            ->setRequired(true);

我希望在这里添加一个"allowEmpty",但是找不到正确的语法。我希望像这样做一些事情:
...    ->addValidator('allowEmpty', false, true)

但这并不起作用。

编辑:我已将setRequired()更改为true - 我想允许空字符串作为必填字段的可接受值。

无论如何,我如何将此选项添加到我的元素中?


1
你能否将你的验证器更改为 ->addValidator('StringLength', false, array(0,500)) - ChrisA
是的,但我怎么才能添加这个选项呢? - Owen
我有点困惑。为什么你需要使用setRequired(true)?如果你将其设置为false并添加验证器,它会完全按照你想要的方式工作:如果为空或已正确验证,则可以正常工作。如果未通过任何验证,则表单不会被提交,尽管setRequired为false。 - riku
2个回答

6

->setNullable(true);

如果你想允许空字符串并将其保存到数据库中,那么仅需使用此代码。

如果你想要在没有输入内容时将该字段设置为空值(null),那么请添加以下代码:

->addFilter(new Zend_Filter_Null)

1
感谢您提供的筛选器。在三年后看到您的评论,真是救了我的一天。 - smozgur
1
对于所有来到这个点的人:在Zend Framework 3中,该类被称为 ToNull ,可以设置为过滤器。 - rogaa

3
$freetext = $this->CreateElement('textarea', 'freetext')
            ->addValidator('StringLength', false, array(10,500))
            ->setRequired(false);

您的代码应该已经做到了这一点,setRequired(false)方法可以实现您所要求的功能,即如果没有提交值,则不会运行验证器。

您是否对自己编写的代码有任何问题,例如某些验证错误消息或其他问题?

更新

我将setRequired()更改为true-我想允许空字符串作为需要字段的可接受值。

setRequired(true)和允许空字符串作为有效值时的语义是什么?或者更好的说,如果元素可以为空,您需要什么?

您在编辑中提出的问题是没有意义的,因为如果一个元素是必需的,它必须具有与空字符串不同的值。如果您需要接受空字符串作为有效值,请使用setRequired(false)。当您使用Zend_Form::getValues()Zend_Form_Element::getValue()获取表单值时,将获得空字符串作为结果。

无论如何,这里是关于setRequiredsetAllowEmpty的解释来自ZF手册
使用默认值,如果没有传递值或传递一个空字符串,则跳过所有验证器并将验证结果设置为TRUE。
调用setAllowEmpty(false) 并保留两个其他标记不变,将针对此元素定义的验证器链进行验证,而不考虑传递给isValid()方法的值。
调用setRequired(true) 并保留两个其他标记不变,将在验证器链的顶部添加一个“NotEmpty”验证器(如果尚未设置任何验证器),并将 $breakChainOnFailure 标志设置。这种行为使所需标记具有语义含义:如果没有传递值,则立即使提交无效并通知用户,并防止其他验证器在我们已知是无效数据的情况下运行。
如果不想要这种行为,则可以通过将FALSE值传递给 setAutoInsertNotEmptyValidator($flag) 方法来关闭它。这将防止 isValid() 在验证器链中放置“NotEmpty”验证器。

我编辑了我的问题。我很好奇是否可以将此选项添加到我的元素中,因为在另一种情况下我可能会找到更好的用途。 - Owen
@Fabio,我和@Owen有同样的情况。我需要检查三个表单字段中是否填入了数据。我编写了一个自定义验证器来检查这个问题,但是它没有被触发,因为我需要添加required => true才能使验证器工作。但是在验证器被触发之前,该字段必须不为空。这时就可以使用setAllowEmpty()方法了。 - piotrekkr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接