Возможна ли динамическая проверка Symonfy 1.4? - PullRequest
4 голосов
/ 31 августа 2010

Я пытаюсь создать форму, которая изменяет валидацию поля на основе опции выбора из поля формы html.

Пример: если пользователь выберет опцию 1 в раскрывающемся поле «опции», я хочу, чтобы поле «метрика» было проверено как sfValidatorInteger.Если пользователь выберет опцию 2 из поля «опции», я хочу, чтобы поле «метрика» проверялось как sfValidatorEmail и т. Д.

Так внутри публичной функции configure () {у меня есть оператор switch для захвата значения«параметры» и создайте валидатор на основе этого значения, возвращенного из «параметров».

1.) Как мне зафиксировать значение «options»?Я попробовал:

$this->getObject()->options
$this->getTaintedValues()

Единственное, что сейчас работает для меня, но это не совсем MVC:

$params = sfcontext::getInstance()->getRequest()->getParameter('options');

2.) Как только я получил эту информацию, какя могу присвоить значение "метрика" другому полю?(«Метрика» не является реальным столбцом в БД).Поэтому мне нужно присвоить значение «metric» для другого поля, например «email», «age» ... В настоящее время я занимаюсь этим в валидаторе записей, вот так, просто интересно, могу ли я присвоить значение в configure ():

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

public function checkMetric($validator, $values) {

}

Спасибо!

Ответы [ 3 ]

6 голосов
/ 01 сентября 2010

Вы хотите использовать почтовый валидатор.Попробуйте сделать что-то вроде этого в вашей форме:

public function configure()
{
  $choices = array('email', 'integer');
  $this->setWidget('option', new sfWidgetFormChoice(array('choices' => $choices))); //option determines how field "dynamic_validation" is validated
  $this->setValidator('option', new sfValidatorChoice(array('choices' => array_keys($choices)));
  $this->setValidator('dynamic_validation', new sfValidatorPass()); //we're doing validation in the post validator
  $this->mergePostValidator(new sfValidatorCallback(array(
    'callback' => array($this, 'postValidatorCallback')
  )));
}

public function postValidatorCallback($validator, $values, $arguments)
{
   if ($values['option'] == 'email')
   {
     $validator = new sfValidatorEmail();
   }
   else //we know it's one of email or integer at this point because it was already validated
   {
     $validator = new sfValidatorInteger();
   }
   $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']); //clean will throw exception if not valid
   return $values;
}
0 голосов
/ 08 мая 2012

Я получил ошибку проверки рядом с полем, бросив sfValidatorErrorSchema вместо sfValidatorError.

$values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);

... становится ...

try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}

Не уверен, что это лучший способ получить этот результат, но сейчас мне кажется, что он работает.

0 голосов
/ 01 сентября 2010

1) В пост-валидаторе к значениям можно получить доступ , используя параметр $ values ​​. Просто используйте $ values ​​['options'] и все будет хорошо ... или вы хотите получить доступ к этим значениям из другой части вашего кода? Я думаю, что $ this-> getObject () -> widgetSchema ['options'] тоже должно работать, когда ваша форма привязана к объекту.

2) Метод configure () вызывается в конце конструктора формы, поэтому значения еще не связаны и не доступны, если только вы не инициализируете форму с помощью объекта из БД (который не требует никакой проверки). Но если вы хотите инициализировать форму из $ _POST, имхо, безусловно, стоит использовать средство проверки почты.

...