4

Recipeステップのフォーム コレクションが割り当てられたエンティティがあります。

ユーザーは、ドラッグ アンド ドロップといくつかの JavaScript を使用してステップを並べ替えることができます。新しい注文を保存するために、step_number各ステップにフィールドを追加しました。フィールドは、javascript によって自動的に入力されます。

ステップが正しい順序で表示されるようにするため@ORM\OrderBy({"step_number" = "ASC"})に、Recipe エンティティで使用します。

唯一の問題は、ユーザーがフォームを送信してエラーが発生した場合、フォームが再度表示されますが、データベースから取得されていないため、正しい順序で表示されないことです。

次のような eventListener を使用してコレクションを手動で注文することで、これを解決しようとしました。

$builder->get('steps')->addEventListener(FormEvents::SUBMIT, function(FormEvent $event){
                $steps = $event->getData();

                $steps[1]->setStepnumber('8');//does not affect the rendered form
                $event->setData($steps);

                \Doctrine\Common\Util\Debug::dump($event->getData());
                //add some logic to sort the steps

});

ダンプは次のようになります。

array(2) {
  [0]=>
  object(stdClass)#1212 (8) {
    ["__CLASS__"]=>
    string(29) "CoBo\RecipeBundle\Entity\Step"
    ["id"]=>
    int(244)
    ["recipe"]=>
    string(31) "CoBo\RecipeBundle\Entity\Recipe"
    ["step_number"]=>
    string(1) "2"
    ["description"]=>
    string(3) "test description 1"
  }
  [1]=>
  object(stdClass)#1220 (8) {
    ["__CLASS__"]=>
    string(29) "CoBo\RecipeBundle\Entity\Step"
    ["id"]=>
    int(245)
    ["recipe"]=>
    string(31) "CoBo\RecipeBundle\Entity\Recipe"
    ["step_number"]=>
    string(1) "8"
    ["description"]=>
    string(4) "test description 2"

  }
}

ただし、の変更は$steps[1]->setStepnumber('8');レンダリングされたフォームには影響しません。step[1]旧番号のままです。ここで何が間違っているのかわかりません。ステップをソートする別のアプローチも役立ちます。

4

1 に答える 1

2

FormEvents::PRE_SET_DATA代わりに使用する必要があります。設定しFormEvents::POST_SUBMITたデータがフォームデータに再度設定されないためです。したがって、変更されたデータは表示されません。

https://github.com/symfony/Form/blob/master/Form.phpを見て、どのフォーム イベントがどの操作の後にディスパッチされるかを確認してください。

公式フォームイベントのドキュメントもご覧ください。

http://symfony.com/doc/current/components/form/form_events.html

于 2015-08-05T07:10:31.520 に答える