Forms 在symfony2选项输入字段中维护过账订单(带有选项列表)

Forms 在symfony2选项输入字段中维护过账订单(带有选项列表),forms,symfony,Forms,Symfony,我在项目中使用Symfony2框架,并使用表单组件创建表单。我正在使用选择输入字段类型来允许用户选择多个选项,并且我正在使用一个插件来允许用户订购这些选项。 不幸的是,将表单发布到控制器时,这些选项的顺序没有得到维护。表单组件使用choices选项的顺序,请求具有正确的顺序 如何使用表单组件和选项输入字段类型维护过账订单 作为记录,我在Google、Stackoverflow和Github上进行了搜索,只发现了一个关于保持首选项顺序的问题。这个问题确实涉及到一个排序选项,但我在Symfony2文

我在项目中使用Symfony2框架,并使用表单组件创建表单。我正在使用选择输入字段类型来允许用户选择多个选项,并且我正在使用一个插件来允许用户订购这些选项。 不幸的是,将表单发布到控制器时,这些选项的顺序没有得到维护。表单组件使用
choices
选项的顺序,请求具有正确的顺序

如何使用表单组件和选项输入字段类型维护过账订单


作为记录,我在Google、Stackoverflow和Github上进行了搜索,只发现了一个关于保持首选项顺序的问题。这个问题确实涉及到一个排序选项,但我在Symfony2文档中找不到这个选项。

我试图解决同样的问题:需要选择几个组织并在列表中对它们进行排序

$form->getData()
之后,我的请求订单被更改

我制作了表单事件处理程序,发现数据在
FormEvents::PRE_SUBMIT
事件上的顺序正确,并将其保存在
$this->preSubmitData

之后,在
FormEvents::SUBMIT
event上,我从
$this->preSubmitData
以错误的顺序覆盖数据(实际上,这取决于选项的顺序)。(您可以从方法中删除数组\u merge


我不知道这是否可行,但您可以尝试将选项列表设置为表单的参数:
newmyform($choiceList)
。您可以在控制器中创建该默认列表。然后,在发布数据时,您可以尝试使用
$request->request->get('fieldName')
检索新的有序列表,并将其插入表单中。但这将包括安全漏洞。如果用户发送了一个无效的列表,这将是一个问题。嗨,哈金,你已经提到了安全问题,所以这对我没有帮助。
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
        ));
    }

}