0

フォームに対して次のアクションがあります。MyForm の定義では、ポスト バリデータを追加して、特定の条件で一度に 2 つのフィールドを検証できるようにしました。問題は、検証に合格した後、symfony がエラーを送信し、データベースの新しいレコードに null 値を格納する場合に発生します。ここにコードを投稿します...私のフォームには2つのフィールドしかなく、ユーザーは2つのリストからそれぞれを選択して新しいレコードを作成します。スキーマの制限により、両方のフィールドの組み合わせは一意です。また、このフィールドの特定の組み合わせが新しいレコードの作成に許可されていないことを検証する必要があります。

アクション.クラス.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 行をコメントアウトすると、すべて正常に動作しますが、2 つのフィールドの特定の組み合わせを受け入れないという条件を検証できません。

そして、このコードをそのまま使用すると、組み合わせが無効な場合、すべて正常に機能し、「フィールドの関係が無効です!」というフォームが再び表示されます。メッセージ。しかし、組み合わせが有効な場合、symfony は次のエラーをスローします:

警告: 169 行目の /path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php の foreach() に無効な引数が指定されました

キャッチ可能な致命的なエラー: *Doctrine_Record::fromArray() に渡される引数 1 は、150 行目の /path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php で呼び出される、null を指定した配列でなければなりません/ṕath/to/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php の 1970 行で定義されています*

警告: 1973 行目の /path/to/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Record.php の foreach() に無効な引数が指定されました

そして、ヘッダーを応答に変更できないことに関するいくつかの警告/エラー (ただし、私は自分で変更していません。おそらく、アクション Create メソッドの $this->setTemplate('new') だけです...

私は Symfony 1.4.9 を使用していますが、SVN サーバー (rev 32070) の 1.4 開発ブランチでも試してみましたが、同じ結果が得られました。アパッチ 2.2、PHP 5.2.6

4

1 に答える 1

3

バリデーターはクリーンな値を返す必要があります - ポストバリデーターと同じです。return $values;関数の末尾にa を追加します。

あなたの問題はこれがないことに起因するため、後で null が foreach() 呼び出しに渡され、最初のエラーが発生します。他の方も同じ理由です。

Null 値が格納されるのは、フォームに渡されたすべての値を実質的にゼロにするためです。

于 2011-02-16T22:43:08.217 に答える