Symfony2设置默认选项字段选择

时间:2011-11-09 23:33:39

标签: forms symfony default symfony-forms

我正在以下列方式创建表单:

$form = $this->createFormBuilder($breed)
             ->add('species', 'entity', array(
                  'class' => 'BFPEduBundle:Item',
                  'property' => 'name',
                  'query_builder' => function(ItemRepository $er){
                      return $er->createQueryBuilder('i')
                                ->where("i.type = 'species'")
                                ->orderBy('i.name', 'ASC');
                  }))
             ->add('breed', 'text', array('required'=>true))
             ->add('size', 'textarea', array('required' => false))
             ->getForm()

如何设置物种列表框的默认值?


感谢您的回复,我道歉,我想我应该重新解释一下我的问题。一旦我有一个从模型中检索的值,如何为物种选择列表中的相应值将该值设置为SELECTED =“yes”?

因此,TWIG视图中的选择选项输出如下所示:

<option value="174" selected="yes">Dog</option>

12 个答案:

答案 0 :(得分:110)

您可以从'data'属性定义默认值。这是抽象“字段”类型(http://symfony.com/doc/2.0/reference/forms/types/field.html

的一部分
$form = $this->createFormBuilder()
            ->add('status', 'choice', array(
                'choices' => array(
                    0 => 'Published',
                    1 => 'Draft'
                ),
                'data' => 1
            ))
            ->getForm();

在此示例中,“草稿”将被设置为默认选定值。

答案 1 :(得分:59)

如果使用Cristian's解决方案,则需要将EntityManager注入到FormType类中。这是一个简化的例子:

class EntityType extends AbstractType{
    public function __construct($em) {
        $this->em = $em;
    }

    public function buildForm(FormBuilderInterface $builder, array $options){
         $builder
             ->add('MyEntity', 'entity', array(
                     'class' => 'AcmeDemoBundle:Entity',
                     'property' => 'name',
                     'query_builder' => function(EntityRepository $er) {
                         return $er->createQueryBuilder('e')
                             ->orderBy('e.name', 'ASC');
                     },
                     'data' => $this->em->getReference("AcmeDemoBundle:Entity", 3)
        ));
    }
}

你的控制器:

 // ...    

 $form = $this->createForm(new EntityType($this->getDoctrine()->getManager()), $entity);

// ...

来自Doctrine Docs

  

方法EntityManager#getReference($ entityName,$ identifier)允许您获取对已知标识符的实体的引用,而无需从数据库中加载该实体。例如,当您想要与具有标识符的实体建立关联时,这可用作性能增强。

答案 2 :(得分:23)

解决方案:对于类型实体使用选项“data”但值是一个对象。即:

$em = $this->getDoctrine()->getEntityManager();

->add('sucursal', 'entity', array
(

    'class' => 'TestGeneralBundle:Sucursal',
    'property'=>'descripcion',
    'label' => 'Sucursal',
    'required' => false,
    'data'=>$em->getReference("TestGeneralBundle:Sucursal",3)           

))

答案 3 :(得分:5)

我认为你应该简单地使用$breed->setSpecies($species),例如我的表格:

$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);

并将我的默认选择设置为当前日期。外部实体的工作方式应该相同......

答案 4 :(得分:3)

如果你想传入一个Doctrine实体数组,试试这样的东西(Symfony 3.0 +):

protected $entities;
protected $selectedEntities;

public function __construct($entities = null, $selectedEntities = null)
{
    $this->entities = $entities;
    $this->selectedEntities = $selectedEntities;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('entities', 'entity', [
        'class' => 'MyBundle:MyEntity',
        'choices' => $this->entities,
        'property' => 'id',
        'multiple' => true,
        'expanded' => true,
        'data' => $this->selectedEntities,
    ]);
}

答案 5 :(得分:3)

我认为您不应该使用data选项,因为这不仅仅是设置默认值。 您还要覆盖在创建期间传递给表单的任何数据。所以基本上,你是破碎的 支持该功能。 - 当您让用户创建数据时可能无关紧要,但是当您使用时确实很重要 希望(有一天)使用表格来更新数据。

请参阅http://symfony.com/doc/current/reference/forms/types/choice.html#data

我相信在表单创建过程中传递任何默认数据会更好。在控制器中。

例如,您可以传入一个类并在类本身中定义默认值。 (使用默认Symfony\Bundle\FrameworkBundle\Controller\Controller时)

$form = $this->createForm(AnimalType::class, [
    'species' => 174 // this id might be substituted by an entity
]);

或者在使用对象时:

$dog = new Dog();
$dog->setSpecies(174); // this id might be substituted by an entity

$form = $this->createForm(AnimalType::class, $dog);

使用工厂时更好: (狗可能从动物延伸)

$form = $this->createForm(AnimalType::class, DogFactory::create());

这将使您能够将表单结构和内容彼此分离并制作 你的形式可以在更多情况下重复使用。

或者,使用preferred_choices选项,但这会产生将默认选项移到表单顶部的副作用。

请参阅:http://symfony.com/doc/current/reference/forms/types/choice.html#preferred-choices

$builder->add(
    'species', 
    'entity', 
    [
        'class' => 'BFPEduBundle:Item',
        'property' => 'name',
        'query_builder' => ...,
        'preferred_choices' => [174] // this id might be substituted by an entity
     ]
 );

答案 6 :(得分:2)

我不确定你在这里做错了什么,当我使用表单类构建表单时,Symfony负责在列表中选择正确的选项。以下是我的一个表单的示例。

在编辑操作的控制器中:

$entity = $em->getRepository('FooBarBundle:CampaignEntity')->find($id);

if (!$entity) {
throw $this->createNotFoundException('Unable to find CampaignEntity entity.');
}


$editForm = $this->createForm(new CampaignEntityType(), $entity);
$deleteForm = $this->createDeleteForm($id);

return $this->render('FooBarBundle:CampaignEntity:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    ));

广告系列实体类型类(src:Foo \ BarBundle \ Form \ CampaignEntityType.php):

namespace Foo\BarBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Doctrine\ORM\EntityRepository;

class CampaignEntityType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
        ->add('store', 'entity', array('class'=>'FooBarBundle:Store', 'property'=>'name', 'em'=>'my_non_default_em','required'  => true, 'query_builder' => function(EntityRepository $er) {return $er->createQueryBuilder('s')->orderBy('s.name', 'ASC');}))
        ->add('reward');
    }
    public function getName()
    {
        return 'foo_barbundle_campaignentitytype';
    }
}

答案 7 :(得分:2)

来自文档:

public Form createNamed(string|FormTypeInterface $type, string $name, mixed $data = null, array $options = array())

mixed $ data = null是默认选项。例如,我有一个名为status的字段,我实现了它:

$default = array('Status' => 'pending');

$filter_form = $this->get('form.factory')->createNamedBuilder('filter', 'form', $default)
        ->add('Status', 'choice', array(
            'choices' => array(
                '' => 'Please Select...',
                'rejected' => 'Rejected',
                'incomplete' => 'Incomplete',
                'pending' => 'Pending',
                'approved' => 'Approved',
                'validated' => 'Validated',
                'processed' => 'Processed'
            )
        ))->getForm();

答案 8 :(得分:2)

设置symfony2单选按钮的默认选项

            $builder->add('range_options', 'choice', array(
                'choices' => array('day'=>'Day', 'week'=>'Week', 'month'=>'Month'),
                'data'=>'day', //set default value 
                'required'=>true,
                'empty_data'=>null,
                'multiple'=>false,
                'expanded'=> true                   
        ))

答案 9 :(得分:1)

表单应自动将species-&gt; id值映射到选定的实体选择字段。例如,如果您的某个Breed实体与名为'breed_species'的连接表中的Species实体具有OnetoOne关系:

class Breed{

    private $species;

    /**
    * @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed")
    */
    private $breedSpecies;

    public function getSpecies(){
       return $breedSpecies->getSpecies();
    }

    private function getBreedSpecies(){
       return $this->$breedSpecies;
    }
}

表单类中的“species”字段应该从传递给表单的Breed类中的“species”属性对象中获取species-&gt; id值。

或者,您可以通过使用SetData()显式将种类实体传递到表单中来显式设置值:

    $breedForm = $this->createForm( new BreedForm(), $breed );
    $species   = $breed->getBreedSpecies()->getSpecies();

    $breedForm->get('species')->setData( $species );

    return $this->render( 'AcmeBundle:Computer:edit.html.twig'
                        , array( 'breed'     => $breed
                               , 'breedForm' => $breedForm->createView()
            )
    );

答案 10 :(得分:0)

您可以使用此表单在要编辑的模型中定义正确的默认值,也可以指定 empty_data 选项,以便代码变为:

$form = $this
    ->createFormBuilder($breed)
    ->add(
        'species',
        'entity',
        array(
            'class'         => 'BFPEduBundle:Item',
            'property'      => 'name',
            'empty_data'    => 123,
            'query_builder' => function(ItemRepository $er) {
                return $er
                    ->createQueryBuilder('i')
                    ->where("i.type = 'species'")
                    ->orderBy('i.name', 'ASC')
                ;
            }
        )
    )
    ->add('breed', 'text', array('required'=>true))
    ->add('size', 'textarea', array('required' => false))
    ->getForm()
;

答案 11 :(得分:-1)

您可以使用“preferred_choices”并将要选择的名称“推”到列表顶部。然后默认选择它。

'preferred_choices' => array(1), //1 is item number

entity Field Type