从验证器中排除字段的最佳方法


Best approach on excluding fields from a validator

我通过扩展Zend_Form创建我的表单。我用一种形式表示addAction()editAction()。当我想在编辑过程中删除元素时,我可以通过$form->removeElement('x')轻松地做到这一点。

但是,从验证器中删除字段的最佳方法是什么?

1)删除并添加新设置的验证器

//Controllers editAction()
$form->removeValidator('Db_NoRecordExists');
$form->addValidator('Db_NoRecordExists', true, array(
  'table'=>'table', 
  'field'=>'field',
  'exclude'=>array(
    'field'=>'id',
    'value'=>$this->_getParam('id')
  )
));

2)向表单中注入编辑ID

//Forms Contstructor
public function __construct($idToEdit=0, $options=null)
{
   $this->setIdToEdit($idToEdit);
   parent::__construct($options);
}
//within init()
$formField->addValidator('Db_NoRecordExists', true, array(
  'table'=>'table', 
  'field'=>'field',
  'exclude'=>array(
    'field'=>'id',
    'value'=>$this->getIdToEdit()
  )
));
//Controller calling the form like this:
$form = new Custom_Form($this->_getParam('id'), $options);

3)还有别的吗?也许我还遗漏了别的东西,虽然这两个想法对我来说都不太好。

为了更简洁地使用SO,这里的答案是post

//SOLUTION好吧,所以在浏览zend源代码(应该在问之前这样做…)我找到了最好的解决方案(我猜)。抽象数据库验证类得到了一个函数setexinclude(),这样我们就可以在一个漂亮的流中使用它:

//Inside Controller before valling $form->isValid()
$form->getElement('x')->getValidator('Db_NoRecordExists')->setExclude(array(
  'field'=>'some_id',
  'value'=>$idToEdit
))