所以我有一个搜索栏表单,我需要临时连接到传统的非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');
}
答案 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;
});
});