我有一个实体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]
还是有旧号码。我不知道我在这里做错了什么。对步骤进行排序的不同方法也会有所帮助。