【问题标题】:How is the best way to use zend framework filters in forms?在表单中使用 zend 框架过滤器的最佳方式是什么?
【发布时间】:2012-06-16 18:16:40
【问题描述】:

所以,我在 Zend Framework 的表单中使用过滤器时遇到了问题。

当您在表单元素上设置过滤器时,它会以各种方式过滤提供给元素的数据。因此,如果我在表单上调用 isValid(),'Int' 过滤器会将字符串“1”转换为 int 1。但如果我将元素的值设置为字符串“1”,该值仍将转换为一个整数 1。

这种行为给我带来了问题。例如,根据企业的规则,所有浮点值必须乘以 100 才能保存到 db(是的,这很糟糕)。所以,我为此创建了一个过滤器,10 变为 1000。但是当填充表单时,1000 变为 100000。

我想要一种方法来做到这一点,而无需在模型中进行工作,仅在表单中进行。所以,我想创建一个标志,指定何时调用过滤器。

有没有更好的方法来做到这一点?我发誓我确实四处寻找过,但我什么也没找到。

谢谢。

【问题讨论】:

    标签: php forms zend-framework frameworks filter


    【解决方案1】:

    数据库中的内容和模型中的内容是模型层的一部分。在这种情况下,映射器应该负责转换。你不应该把它移到表单上,实际上它是视图层的一部分,而不是其他任何东西。

    【讨论】:

    • 可能是这样,但并非全部如此。 Zend_Form 是一个工具,它为我们做了一些枯燥而费力的工作。我认为验证器是模型工作的一部分,过滤器、表单生成等是视图工作的一部分。因此,Zend_Form 应该有一种方法来指定过滤器的使用,给我们更完整的功能和更少的工作。
    • @DenisLins 好的,Zend_Form 是一件很奇怪的事情 ;) 但是,您没有使用 Zend_Form 验证输入,是吗?与验证相比,这与将输入带入净化表单并将输入带入持久表单的关系相同。
    • 我同意 KingCrunch 的观点,即映射器应该进行这种转换,而不是表单。大概当您从数据库中提取值时,您会将它们除以 100 - 如果不在映射器中,您在哪里有这个逻辑?
    【解决方案2】:

    我猜最好的方法是设置一个标志并扩展 getvalue 和 setvalue。

    setValue 总是将数字除以每 100,而 getValue 总是在存在标志(这意味着过滤器)时将其相乘。

    【讨论】:

    • 这可能是最好的解决方案,但是当直接应用于框架时。现在这样做意味着扩展 Zend_Form_Element 类,并重写所有表单元素以扩展该类,我认为这给了我们太多工作要做。此外,当某些元素的某些部分发生变化时,将来可能会成为问题。
    • 对于框架范围的解决方案,这将是唯一的方法。但是你可以扩展有问题的元素,毕竟它不是一般情况并且被特定情况使用。一个框架应该提供一个通用的解决方案,而开发人员应该根据他们的特定需求来扩展它。但我明白你的意思。由于过滤器已经到位,因此有时您希望使用输入不受 em 影响。他们应该双向工作,但这需要每个过滤器都有一个恢复方法。确实是一个不错的功能。
    【解决方案3】:

    如果你真的想在表单中做这种过滤,你根本不需要弄乱 Zend_Form_Element_*。只需写一对filters。 Zend_Form 使用 Zend_Filter 中可用的过滤器。
    Zend_filter 有一个可扩展的接口,用于构建您自己的过滤器,与 Zend_Validate 相同。
    编写过滤器后,您可以在需要它们的任何地方使用它们。 Zend_Form 用于过滤输入并在您的模型中将数据过滤回原始数据。

    祝你好运。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多