Symfony表单选项自定义获取URL

时间:2013-07-15 20:04:04

标签: forms symfony get symfony-2.1

所以我有一个搜索栏表单,我需要临时连接到传统的非symfony页面。 当前的获取URL看起来如下(url-decoding)

http://localhost:9090/lagacy_page?query=test&platforms[]=Mac,Windows

但我需要让网址看起来像以下

http://localhost:9090/lagacy_page?query=test&platforms=Mac,Windows

Symfony正在将平台变成一个阵列,如果有办法强迫它成为逗号分隔列表,那么有没有人不这样做?

这是buildForm方法

/**
 * method to build search bar form
 *
 * @param \Symfony\Component\Form\FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    // the platform selector
    $builder->add('platform', 'choice',
        ['choices' => [
            Platforms::ALL => 'All Software', // TODO: need to translate this
            Platforms::WINDOWS => 'Windows',
            Platforms::MAC => 'Mac',
            Platforms::IOS => 'iOS',
            Platforms::ANDROID => 'Android',
        ],
        'multiple' => true,
        'expanded' => true]);

    // the actual search bar
    $builder->add('query', 'search');

}

2 个答案:

答案 0 :(得分:0)

您将希望覆盖Symfony2呈现选择字段的方式。

该文档包含大量有关how to customize Form rendering的信息。

如果只有搜索表单的选择类型需要这样,您需要create a custom type以避免与您网站的其他形式发生冲突。

简而言之,如果您使用第一个文档覆盖choice类型并且不使用自定义类型,则每个choice类型将使用相同的行为(您将为搜索表单创建的行为) )你可能不希望这样。

一个简单的替代解决方案是将自定义form_div_layout.html.twig文件直接应用于表单对象。与其他表单没有任何冲突,因为您只是为搜索表单使用自定义模板。

阅读文档后,我的回答会更有意义,您将能够解决问题。

答案 1 :(得分:0)

你必须使用两个表单元素,因为Symfony以正确的方式执行它(根据HTML规范)

/**
 * method to build search bar form
 *
 * @param \Symfony\Component\Form\FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    // the platform selector
    $builder->add('platform_choice', 'choice',
        ['choices' => [
            Platforms::ALL => 'All Software', // TODO: need to translate this
            Platforms::WINDOWS => 'Windows',
            Platforms::MAC => 'Mac',
            Platforms::IOS => 'iOS',
            Platforms::ANDROID => 'Android',
        ],
        'multiple' => true,
        'expanded' => true,
        'attr' => [
            'class' => 'platform-sorce'
        ])
    ->add('platform', 'hidden', [
        'attr' => [
            'class' => 'real-platform'
        ]
    ]);

    // the actual search bar
    $builder->add('query', 'search');
}

然后添加JS更新隐藏字段,因为'platform_choice'已禁用且不会发送。

$(function(){
     var $real_platform = $('.real-platform'),
         $platform_source = $('.platform-source');

     $platform_source.change(function(){
         $real_platform.val($(this).val().join(',');
     });

     $('#your-form").submit(function(){
         $platform_source.attr('disabled', true);

         return true;
     });
});