бросить новый sfValidatorError в действие Symfony - PullRequest
0 голосов
/ 07 января 2012

Я сгенерировал с помощью Doctrine просто действие:

protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
    if ($form->isValid())
    {
      $test = $form->save();

      $this->redirect('test/show?id='.$test->getId());
    }
  }

Возможно ли добавить для этого sfValidatorError ? Например:

    protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

if(strtotime('now') % 2){
               throw new sfValidatorError('aaa', 'bbb', array();
            } 

        if ($form->isValid())
        {
          $test = $form->save();

          $this->redirect('test/show?id='.$test->getId());
        }
      }

Это, конечно, не работает, потому что sfValidatorError должен расширять sfValidatorBase. Возможно ли сделать это в Symfony 1.4?

1 Ответ

1 голос
/ 08 января 2012

Я предполагаю, что вы просто хотите добавить новый валидатор, а не выдавать sfValidatorError (особенно если sfValidatorError должен иметь ссылку на sfValidator, который его выбросил)

к сожалению, у меня нет среды для тестирования этих фрагментов кода, но они дадут вам общие понятия.

сначала: создайте свой класс валидатора

class timestampIsNotEvenValidator extends sfValidatorBase {
    protected function doClean($value) {
        if(strtotime('now') % 2){
           throw new sfValidatorError($this, 'timestamp is not even');
        }
        return $value; //this return is critical!
    }
}

затем: добавьте валидатор к вашей форме (но лучше сделайте это в методе настройки форм):

protected function processForm(sfWebRequest $request, sfForm $form)
{
    $form->mergePostValidator(new timestampIsNotEvenValidator());
    $form->bind(...);

    if ($form->isValid()) { //false if timestampIsNotEventValidator throwed sfValidatorError
    }

затем вы можете отобразить глобальные ошибки (генерируемые пост-валидатором) в вашем шаблоне, вызвав

//indexSuccess.php
$form->renderGlobalErrors();

или если вы хотите связать ошибку с конкретным полем вашей формы (например, еслиу вас есть тип «поля» в вашей форме, и вы хотите, чтобы ошибка, выдаваемая глобальным валидатором, отображалась как ошибка «поля», а не глобальная) вы можете изменить свой валидатор:

//i dont know if following solution is the best one there is, but it works
class timestampIsNotEvenValidator extends sfValidatorBase {
    protected function doClean($value) {
        if(strtotime('now') % 2){
           throw new sfValidatorErrorSchema($this, array(
               'field' => new sfValidatorError($this, 'timestamp is not even')
           ));
        }
        return $value; //this return is critical!
    }
}

и для справки - после валидатораполучит массив значений всех полей формы в качестве аргумента $ value в чистом методе.

...