【问题标题】:Zend framework - how to allow empty field for form elementZend 框架 - 如何允许表单元素为空字段
【发布时间】:2011-08-30 11:52:06
【问题描述】:

我正在为我的元素使用这种结构:

$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 - 我希望允许空字符串作为要求字段的可接受值。

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

【问题讨论】:

  • 你能把你的验证器改成->addValidator('StringLength', false, array(0,500)) 吗?
  • 是的,但是我该如何添加这个选项呢?
  • 我很困惑。为什么需要使用 setRequired(true)?如果您将其设置为 false 并添加验证器,它会完全按照您的意愿执行操作:如果它为空或经过正确验证,它就会工作。如果它未能通过任何验证,尽管 setRequired 为 false,但不会提交表单。

标签: zend-framework zend-form


【解决方案1】:

->setRequired(false);

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

如果您希望该字段是可选的,并且如果没有给出任何内容,则在数据库中保留空值,添加:

->addFilter(new Zend_Filter_Null)

【讨论】:

  • 感谢过滤器。在您发表了 3 年的评论后,我的日子好过。
  • 对于大家来说这是怎么回事:在 Zend Framework 3 中,该类被称为 ToNull 并且可以设置为过滤器
【解决方案2】:
$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() 获取表单值时,您将获得空字符串作为结果。

反正这里是setRequiredsetAllowEmptyfrom ZF manual的解释:

使用默认值,在不传递值的情况下验证元素,或者 为它传递一个空字符串,跳过所有验证器并验证到 真的。

  • setAllowEmpty(false) 留下另外两个提到的标志 不变,将根据您定义的验证器链进行验证 此元素,无论传递给 isValid() 的值如何。

  • setRequired(true) 保持其他两个提到的标志不变, 将在验证器链的顶部添加一个“NotEmpty”验证器(如果没有 已设置)),并设置了 $breakChainOnFailure 标志。这个 行为借出所需的标志语义含义:如果没有传递任何值, 我们立即使提交无效并通知用户,并且 阻止其他验证器在我们已经知道的东西上运行 无效数据。

如果你不想要这种行为,你可以通过传递一个 setAutoInsertNotEmptyValidator($flag) 的 FALSE 值;这将 防止 isValid() 将 'NotEmpty' 验证器放在 验证者链。

【讨论】:

  • 我编辑了我的问题。我很想知道是否可以将此选项添加到我的元素中,因为我可能会在另一种情况下找到更好的用途。
  • @Fabio 我遇到了和@Owen 一样的情况。我必须检查三个表单字段之一是否填充了数据。我编写了一个自定义验证器来检查这一点,但他没有被解雇,因为我需要添加 required => true 以使验证器工作。但是在验证器被触发之前,字段必须不为空。是setAllowEmpty()派上用场的情况。
猜你喜欢
  • 1970-01-01
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多