在symfony2选择输入字段中维护已过帐的订单(带有选项列表)

时间:2015-08-03 06:58:21

标签: forms symfony

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

如何使用表单组件和选择输入字段类型维护发布的订单?

为了记录,我在Google,Stackoverflow和Github上进行了搜索,但我发现了一个关于保持preferred_choiceshttps://github.com/symfony/symfony/issues/5136)顺序的问题。这个问题确实涉及sort选项,但我无法在Symfony2文档中找到此选项。

1 个答案:

答案 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
        ));
    }

}