Лучший подход к исключению полей из валидатора - PullRequest
2 голосов
/ 20 октября 2011

Я создаю свои формы через расширение 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) Добавление идентификатора редактирования в форму

//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) Что-то еще? Может быть, есть еще что-то, чего мне не хватает, хотя мне почему-то обе идеи кажутся мне не слишком хорошими.

1 Ответ

0 голосов
/ 18 июня 2012

Для более чистого использования SO вот ответ в виде поста

// РЕШЕНИЕ Хорошо, поэтому, просматривая исходный код Zends (должен был это сделать, прежде чем спрашивать ...), я нашел лучшее решение (я полагаю). Абстрактные классы проверки БД получили Функция setExclude (), поэтому мы можем использовать ее в хорошем потоке:

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