如何对Symfony2表单集合项进行排序

时间:2013-06-15 17:20:45

标签: forms symfony doctrine-orm symfony-forms formcollection

我有一个实体Recipe,其中包含分配给。

的步骤的表单集合

用户可以使用拖放和一些javascript对步骤进行排序。 为了保存新订单,我在每个步骤中添加了一个字段step_number,然后由javascript自动填充。

为确保步骤以正确的顺序显示,我在配方实体中使用@ORM\OrderBy({"step_number" = "ASC"})

唯一的问题是:如果用户提交表单并有一些错误,表单会再次显示,但不会按正确的步骤顺序显示,因为它们不是从数据库中提取的。

我尝试通过使用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]仍有旧号码。 我不知道我在这里做错了什么。 对步骤进行排序的另一种方法也是有帮助的。

1 个答案:

答案 0 :(得分: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