【问题标题】:Maintain posted order in symfony2 choice input field (with choice list)维护 symfony2 选择输入字段中的发布顺序(带有选择列表)
【发布时间】:2015-08-03 06:58:20
【问题描述】:

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

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

作为记录,我在 Google、Stackoverflow 和 Github 上进行了搜索,但只发现了一个关于保持 preferred_choices (https://github.com/symfony/symfony/issues/5136) 的顺序的问题。这个问题确实提到了sort 选项,但我在 Symfony2 文档中找不到这个选项。

【问题讨论】:

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

标签: forms symfony


【解决方案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
        ));
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2013-05-09
    相关资源
    最近更新 更多