Symfony 1.4 использует пост-валидатор в сообщении New action throws error - PullRequest
0 голосов
/ 17 февраля 2011

У меня есть следующее действие для формы.В определении MyForm я добавил пост-валидатор, так что я могу проверять два поля одновременно по определенному условию.Проблема возникает, когда после прохождения проверки symfony отправляет мне ошибку, а также сохраняет нулевые значения в новой записи в базе данных.Я публикую свой код здесь ... Моя форма имеет только два поля, и пользователь чаще всего выбирает каждое из них из двух списков, чтобы создать новую запись.Из-за ограничений схемы комбинация обоих полей уникальна.Кроме того, мне нужно проверить, что определенные комбинации этих полей не разрешены для создания новой записи.

actions.class.php:

  public function executeNew(sfWebRequest $request)
  {
    $this->form = new MyForm();
  }

  public function executeCreate(sfWebRequest $request)
  {
    $this->forward404Unless($request->isMethod(sfRequest::POST));
    $this->form = new MyForm();
    $this->processForm($request, $this->form, true);
    $this->setTemplate('new');
  }

  protected function processForm(sfWebRequest $request, sfForm $form, $new = false)
  {
    $form->bind($request->getParameter($form->getName()),
                $request->getFiles($form->getName()));
    if ($form->isValid())
      {
        $post = $form->save();
        $this->redirect('post/' . $post->getId());
      }
  }

MyForm.class.php

class MyForm extends BaseMyForm
{
  public function configure()
  {
      $this->widgetSchema['field1'] = new sfWidgetFormChoice(array('choices' => MyUtil::$field1_vaues));
      $this->widgetSchema['field2'] = new sfWidgetFormChoice(array('choices' => MyUtil::$field2_values));

      $this->mergePostValidator(new sfValidatorCallback(array('callback' => array($this, 'validateBothFields'))));
   }

  public function validateBothFields($validator, $values, $arguments)
  {
    if (MyUtil::fields_relation($values['field1'], $values['field2']))
      {
        throw new sfValidatorError($validator, "Fields relation invalid!");
      }
  }
}

Когда я закомментирую строку mergePostValidator, тогда все работает нормально, но тогда я не могу проверить условие не принимать определенную комбинацию двух моих полей.

И при использовании этого кодакак есть: если комбинация недействительна, все работает хорошо, форма снова появляется с 'Недопустимым отношением полей!'сообщение.Но если комбинация допустима, symfony выдает следующие ошибки:

Предупреждение: В foreach () указан неверный аргумент в / path / to / symfony / lib / plugins / sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php в строке 169

Исправляемая фатальная ошибка: * Аргумент 1, передаваемый в Doctrine_Record :: fromArray (), должен быть массивом, равным нулюВызывается в /path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php в строке 150 и определяется в / ṕath / to / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine /Doctrine / Record.php on line 1970 *

Предупреждение: Указан неверный аргумент для foreach () в / path / to / symfony / lib / plugins / sfDoctrinePlugin / lib / vendor/doctrine/Doctrine/Record.php в строке 1973

, а затем некоторые предупреждения / ошибки о невозможности изменить заголовки в ответ (но я не изменяю их самостоятельно, и, возможно, это просто$ this-> setTemplate ('new') в действии Создать метод ...

Я использую Symfony 1.4.9, но также попробовал с веткой разработки 1.4 с сервера SVN (rev 32070) и получил тот же результат.Apache 2.2, PHP 5.2.6

1 Ответ

3 голосов
/ 17 февраля 2011

Валидатор должен вернуть очищенное значение - то же самое для пост валидатора.Добавьте return $values; в конец вашей функции.

Ваша проблема в том, что вы пропустили это, поэтому позже null передается в вызов foreach (), вызывая первую ошибку.Та же причина для других.

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

...