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]
旧番号のままです。ここで何が間違っているのかわかりません。ステップをソートする別のアプローチも役立ちます。