在Symfony表单类中过滤表单输入

时间:2012-02-14 14:12:22

标签: php forms validation symfony1 symfony-1.4

我想使用strtolower()函数过滤表单中的某些字段。不幸的是,我找不到任何这样做的例子。

如何编写这样的过滤器,将输入小写,检查数据库是否存在元素,然后决定是否添加记录?

2 个答案:

答案 0 :(得分:1)

在您的表单中,您可以覆盖doSave()方法,以执行您需要执行的任何未通过表单验证方法完成的手动干预。

例如:

public function doSave($con = null) {

  $employee = $this->getObject();
  $values = $this->getValues();

  // do your filter
  $this->values['name'] = strtolower($values['name']); 
  parent::doSave($con);
  }

答案 1 :(得分:1)

1)新的项目自定义验证器(我们将在这里使用它像值过滤器):

<强> /lib/validator/MyProjectStringLowerCase.class.php

<?php

class MyProjectStringLowerCase extends sfValidatorBase
{
  /**
  * @see sfValidatorBase
  */
  protected function doClean($value)
  {
     return strtolower($value);
  }
}

2)将其绑定到字段:

$this->setWidget('my_field_name', new sfWidgetFormInputText());
$this->validatorSchema['my_field_name'] = new MyProjectStringLowerCase();

如果您已经在该字段上有一些验证器,您可以通过这种方式将它们合并到组合验证器中:

$this->validatorSchema['my_field_name'] = new sfValidatorAnd(array(
    $this->validatorSchema['my_field_name'], // the original field validator
    new MyProjectStringLowerCase(),
));

组合验证器命令输入值如何通过它们流入,因此如果要在第二次验证中过滤值,请将MyProjectStringLowerCase设置为第一个。

此方法与使用后期处理(例如doSave())之间存在2个不同之处:

  1. 此处的值将在每次发送后进行过滤(并将显示 过滤显示表单错误)
  2. 您可以非常干净,轻松地在其他领域或形式中重复使用它 你的项目