Symfony2设置默认选项字段选择

Mat*_*Mat 68 forms default symfony-forms symfony

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

$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()
Run Code Online (Sandbox Code Playgroud)

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


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

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

<option value="174" selected="yes">Dog</option>
Run Code Online (Sandbox Code Playgroud)

小智 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();
Run Code Online (Sandbox Code Playgroud)

在此示例中,"草稿"将设置为默认选定值.

  • 这似乎不适用于单选按钮.它可能只是我. (3认同)
  • 数据必须引用选择数组的键.如果你有多个选择:array('foo1'=>'bar1','foo2'=>'bar2',...)那么你必须指定'data'=> array('foo1','foo2',. ..).杰森,也许这就是你的问题所在. (2认同)

Car*_*all 57

如果您使用Cristian的解决方案,则需要将其注入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)
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

而你的控制器:

 // ...    

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

// ...
Run Code Online (Sandbox Code Playgroud)

来自Doctrine Docs:

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

  • Symfony2中预选选择字段的完美答案 (5认同)

小智 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)           

))
Run Code Online (Sandbox Code Playgroud)


Kji*_*jir 6

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

$m = new Member();
$m->setBirthDate(new \DateTime);
$form = $this->createForm(new MemberType, $m);
Run Code Online (Sandbox Code Playgroud)

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


Jon*_*han 5

如果你想传递 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,
    ]);
}
Run Code Online (Sandbox Code Playgroud)