也许我有一个非常愚蠢的问题,但我是Symfony2的新手,我想知道我是否可以用Symfony Form组件构建一个搜索表单,就像我处理注册表一样。
我的搜索表单将有一个国家选择字段、俱乐部选择字段、性别单选按钮字段、级别选择字段和提交按钮。
是否可以使用表单组件来实现这一点,或者做类似的事情——最好直接在视图中构建搜索表单?
我一直在寻找这方面的信息,但什么也没找到。
以下是我的SearchPlayerType.php的外观。
<?php
namespace AppBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Form'FormEvents;
use Doctrine'ORM'EntityRepository;
class SearchPlayersType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('country', 'entity', array(
'placeholder' => 'Choose a country',
'class' => 'AppBundle:Country',
'property' => 'name',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('c')->orderBy('c.name', 'ASC');
},
))
->add('club', 'entity', array(
'placeholder' => 'Choose a club',
'class' => 'AppBundle:Club',
'property' => 'name',
'query_builder' => function(EntityRepository $er){
return $er->createQueryBuilder('c')->orderBy('c.name', 'ASC');
},
))
->add('gender', 'entity', array(
'class' => 'AppBundle:Gender',
'property' => 'name',
'expanded' => true
))
->add('level', 'rating', array(
'label' => 'Playing Level',
'stars' => 5))
;
}
public function getName()
{
return 'SearchPlayer';
}
如果可以这样做,我不知道我的数据类需要是的哪个实体
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle'Entity'Usuario'
));
}
}
?>
您可以使用两种方法:您可以为搜索表单创建一个特定于表单的模型,该模型要么是一个具有公共属性的非常瘦的对象;或者,您可以在表单选项中删除data_class
的条目,这将使表单切换为返回数组而不是对象(文档)。
前者是一种更面向对象的方式,允许您添加验证注释,而无需将其嵌入表单中,这种方式还意味着您可以添加getter和setter,它们可以非常容易地转换搜索数据,而不会弄乱控制器。所以你的模型看起来像:
namespace MyBundle'Form'Model;
class SearchModel
{
public $country;
public $club;
// ...
}
备选方案只是:
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
// don't set 'data_class' in here
));
}
然后,当您执行$form->getData()
时,您只会得到一个数组,而不是一个对象。