2011-08-30 62 views
3

我使用这个建设我的元素:Zend框架 - 如何让空字段的表单元素

$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 - 我想允许将空字符串作为require字段的可接受值。

无论用法如何,我该如何将这个选项添加到我的元素?

+1

你能不能改变你的验证器' - > addValidator(“StringLength”,虚假,阵列(0,500)) '? – ChrisA

+0

是的,但是如何添加此选项呢? – Owen

+0

我很困惑。为什么你需要使用setRequired(true)?如果将其设置为false并添加验证程序,它就会完全按照您希望的方式进行操作:如果它为空或验证正确,它将起作用。如果它没有任何验证,尽管setRequired为false,表单仍未提交。 – riku

回答

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

您的代码应该已经这样做,setRequired(false)方法做你问什么,也就是说,如果没有遂以值校验器将无法运行。

你有你写的代码,一些验证错误信息或其他什么东西的任何问题?

更新

我已经改变了setRequired()来真的 - 我想允许空字符串作为一个需要现场的可接受值。

setRequired(true)中的语义是什么,并允许将空字符串作为有效值?或者,如果元素可以是空的,那么你需要什么?

你在编辑中所要求的是没有意义的,因为如果一个元素是必需的,它必须有一个不同于空字符串的值。如果您需要接受空字符串作为有效值,请使用setRequired(false)。当你的形式与价值或Zend_Form::getValues()Zend_Form_Element::getValue()会得到空字符串作为结果。

反正这里它是setRequired解释和setAllowEmptyfrom ZF manual

使用默认值,而没有经过值,或 传递一个空字符串,它验证一个元素,跳过所有验证和验证,以 TRUE 。

  • 器setAllowEmpty(假)留下两个其他提到的标志 不变,将验证对您 此元素定义的校验器链,无论()传递给isValid的价值。

  • setRequired(真)留下两个其他提到的标志不变, 将增加在验证链(如果没有 已经设置))之上的“NotEmpty”校验,与$ breakChainOnFailure标志设置。这 行为借给所需的标志语义含义:如果没有值通过, 我们立即使提交无效并通知用户,并且 阻止其他验证器运行我们已知的是无效数据 。

如果不希望这种行为,你可以通过一个 FALSE值setAutoInsertNotEmptyValidator($标志)将其关闭;这将使 阻止isValid()将'NotEmpty'验证程序置于 验证程序链中。

+0

我编辑了我的问题。我很想知道是否可以将此选项添加到我的元素,因为在另一种情况下我可能会发现它更好用。 – Owen

+0

@Owen我已更新我的答案以反映您的修改。 – Fabio

+0

@Fabio我和@Owen一样。我必须检查三个表单字段中的一个是否填充了数据。我写了一个自定义的验证器来检查这个,但是他没有被解雇,因为我需要添加'required => true'来使验证器工作。但是,在验证者被解雇之前,字段必须是空的。这是'setAllowEmpty()'方便的情况。 – piotrekkr

5

- > setRequired(false);

如果你想允许一个空字符串并将一个空字符串保存到数据库,这就足够了。

如果您希望字段是可选的,并保持在数据库空值,如果不给,添加:

->addFilter(new Zend_Filter_Null) 
+1

感谢您的过滤器。在您评论3年后保存我的一天。 – smozgur

+0

你做了我的一天。我正在寻找这么久...... – frgtv10

+1

对于每个人来说,现在到了这一点: 在Zend Framework 3中,类被称为'ToNull',可以设置为过滤器 – rogaa