使用Symfony2表单组件实现搜索表单

时间:2015-11-12 08:46:55

标签: php forms symfony

也许我有一个非常愚蠢的问题,但我是Symfony2的新手,我想知道我是否可以使用Symfony表单组件构建搜索表单,就像我使用注册表单一样。

我的搜索表单将包含国家/地区选择字段,俱乐部选择字段,性别单选按钮字段,级别选择字段和提交按钮。

是否可以使用表单组件执行此操作或者执行此类操作最好直接在视图中构建搜索表单?

我一直在寻找有关此事的信息,但我没有找到任何信息。

以下是我的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';
}

如果可以这样做,我不知道我的data_class需要什么实体

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Usuario'
    ));
}
}
?>

1 个答案:

答案 0 :(得分:1)

你可以用两种方式:你可以为你的搜索表单创建一个特定于表单的模型,它将是一个非常瘦的具有公共属性的对象;或者您可以在表单选项中删除data_class的条目,这会将表单切换为返回数组而不是对象(documentation)。

前者是OO的更多操作方式,允许您添加验证注释而无需在表单中嵌入这些注释,这也意味着您可以添加可轻松转换搜索数据的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()时,你只会得到一个阵列而不是一个物体。