Symfony 1.4在保存之前检查数据库条目的表单值

时间:2010-11-28 18:14:22

标签: database validation forms symfony1 doctrine

我正在使用Symfony 1.4和Doctrine。 我有一个包含六个字段的表单:name,parent1,parent2,parent3,parent4,parent5 提交表单后,我想检查数据库中的两件事: 1.名称字段是唯一的 2. parent1,parent2,parent3,parent4和parent5的组合不在数据库中。这些值都是整数(来自相关表的主键),一些字段留空为0.它们根据用户输入的顺序进入数据库,所以我不关心顺序,但是喜欢在表单保存之前确保组合本身不存在。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

使用sfValidatorCallback。在表单类中,在setup()函数中添加以下内容:

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'YOURCALLBACKFUNCTIONNAME'))));

然后,您可以在同一个文件中创建它,即回调函数:

public function YOURCALLBACKFUNCTIONNAME($validator, $values) {
   //Validate form here
   //Access form items using  $values['FORMNAME'];
   //$error = new sfValidatorError($validator, 'A Error Message.');
   //$es = new sfValidatorErrorSchema($validator, array('FORMITEM' => $error);
   //throw $es;
   }

答案 1 :(得分:2)

实际上有一个专门用于此的Doctrine验证器,sfValidatorDoctrineUnique。在您的表单中,尝试:

public function configure()
{
  parent::configure();
  $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
      'model' => 'MyModelName',
      'column' => array('name')
  )));
  $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
      'model' => 'MyModelName',
      'column' => array('parent1', 'parent2', 'parent3', 'parent4', 'parent5')
  )));
}

答案 2 :(得分:0)

我知道你的问题是关于学说的,但对于那些正在寻找这个答案并使用Proepl的人来说,有Propel验证器:

另一个有用的与模型相关的验证器是sfValidatorPropelUnique验证器,它检查通过表单输入的新值是否与具有唯一索引的数据库列中的现有值冲突。例如,两个用户不能拥有相同的登录名,因此在使用表单编辑User对象时,必须在此列上添加sfValidatorPropelUnique验证器:

  

// Propel唯一验证器$ form-> setValidator('nickname',new   sfValidatorPropelUnique(array('model'=>'User','column'=>   'login')));