我在项目中使用Symfony2框架并使用Form组件创建表单。我使用选择输入字段类型来启用用户多选选项,并且我使用插件使用户能够订购这些选项。
不幸的是,在将表单发布到控制器时,不保留这些选项的顺序。 Form组件使用choices
选项的顺序,请求具有正确的顺序。
如何使用表单组件和选择输入字段类型维护发布的订单?
为了记录,我在Google,Stackoverflow和Github上进行了搜索,但我发现了一个关于保持preferred_choices
(https://github.com/symfony/symfony/issues/5136)顺序的问题。这个问题确实涉及sort
选项,但我无法在Symfony2文档中找到此选项。
答案 0 :(得分:1)
我试图解决同样的问题:需要选择几个组织并在列表中对它们进行排序。
在$form->getData()
我的请求订单被更改后。
我创建了表单事件处理程序,发现数据在FormEvents::PRE_SUBMIT
事件中的顺序正确,我将其保存在$this->preSubmitData
中。
之后,在FormEvents::SUBMIT
事件中,我用$this->preSubmitData
覆盖错误顺序的数据(实际上,它取决于来自选项的顺序)。 (您可以从方法中删除array_merge )
class PriorityOrganizationSettingsType extends AbstractType {
private $preSubmitData;
/**
* @param FormBuilderInterface $builder
* @param array $options
* @throws \Exception
*/
public function buildForm(FormBuilderInterface $builder, array $options)
$builder
->add('organizations', 'choice', array(
'multiple' => 'true',
'required' => false,
'choices' => $this->getPriorityOperatorChoices(),
'attr' => [
'class' => 'multiselect-sortable',
'style' => 'height: 350px; width:100%;'
]
))
;
$builder->addEventListener(FormEvents::SUBMIT, array($this, 'submitEvent'));
$builder->addEventListener(FormEvents::PRE_SUBMIT, array($this, 'preSubmitEvent'));
}
public function preSubmitEvent(FormEvent $event) {
$this->preSubmitData = $event->getData();
}
public function submitEvent(FormEvent $event) {
$event->setData(array_merge(
$event->getData(),
$this->preSubmitData
));
}
}