Symfony2 Configurando uma seleção de campo de escolha padrão

Estou criando um formulário da seguinte maneira:

$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() 

Como posso definir um valor padrão para a checkbox de listview de espécies?


Obrigado pela sua resposta, peço desculpas, acho que eu deveria reformular minha pergunta. Uma vez que tenho um valor que recupero do modelo, como defino esse valor como SELECTED = “yes” para o valor correspondente na lista de opções de espécies?

Então, essa opção de seleção de saída da visualização TWIG apareceria da seguinte forma:

 Dog 

Se você usar a solução de Cristian , você precisará injetar o EntityManager em sua class FormType. Aqui está um exemplo simplificado:

 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) )); } } 

E o seu controlador:

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

Do Doctrine Docs :

O método EntityManager # getReference ($ entityName, $ identifier) ​​permite obter uma referência a uma entidade para a qual o identificador é conhecido, sem carregar essa entidade do database. Isso é útil, por exemplo, como um aprimoramento de desempenho, quando você deseja estabelecer uma associação a uma entidade para a qual você possui o identificador.

Você pode definir o valor padrão do atributo ‘data’. Isso faz parte do tipo de “campo” abstrato ( 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(); 

Neste exemplo, ‘Rascunho’ seria definido como o valor selecionado padrão.

a solução: para a entidade de tipo use a opção “data”, mas value é um object. ie:

 $em = $this->getDoctrine()->getEntityManager(); ->add('sucursal', 'entity', array ( 'class' => 'TestGeneralBundle:Sucursal', 'property'=>'descripcion', 'label' => 'Sucursal', 'required' => false, 'data'=>$em->getReference("TestGeneralBundle:Sucursal",3) )) 

Eu acho que você deveria simplesmente usar $breed->setSpecies($species) , por exemplo na minha forma eu tenho:

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

e isso define minha seleção padrão para a data atual. Deve funcionar da mesma maneira para entidades externas …

Se você quiser passar em uma matriz de entidades do Doctrine, tente algo como isto (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, ]); } 

Não tenho certeza do que você está fazendo errado aqui, quando eu construo um formulário usando classs de formulário, o Symfony se encarrega de selecionar a opção correta na lista. Aqui está um exemplo de um dos meus formulários que funciona.

No controlador para a ação de edição:

 $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(), )); 

A class de tipo de entidade de campanha (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'; } } 

Dos docs:

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

mixed $ data = null é a opção padrão. Por exemplo, eu tenho um campo chamado status e o implementei assim:

 $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(); 

Definindo a opção padrão para o botão de opções do 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 )) 

O formulário deve mapear o valor de species-> id automaticamente para o campo de seleção de entidade selecionado. Por exemplo, se você tiver uma entidade Raça que tenha um relacionamento OnetoOne com uma entidade Espécie em uma tabela de junit chamada ‘raça_espécies’:

 class Breed{ private $species; /** * @ORM\OneToOne(targetEntity="BreedSpecies", mappedBy="breed") */ private $breedSpecies; public function getSpecies(){ return $breedSpecies->getSpecies(); } private function getBreedSpecies(){ return $this->$breedSpecies; } } 

O campo ‘species’ na class form deve pegar o valor species-> id do object de atributo ‘species’ na class Breed passado para o formulário.

Como alternativa, você pode definir explicitamente o valor explicitamente passando a entidade species para o formulário usando 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() ) ); 

Eu não acho que você deve usar a opção de data , porque isso faz mais do que apenas definir um valor padrão. Você também está substituindo todos os dados que estão sendo passados ​​para o formulário durante a criação. Então, basicamente, você está quebrando o suporte para esse recurso. – O que pode não importar quando você está permitindo que o usuário crie dados, mas importa quando você deseja (algum dia) usar o formulário para atualizar dados.

Consulte http://symfony.com/doc/current/reference/forms/types/choice.html#data

Eu acredito que seria melhor passar qualquer dado padrão durante a criação do formulário. No controlador.

Por exemplo, você pode passar em uma class e definir o valor padrão em sua própria class. (ao usar o padrão Symfony\Bundle\FrameworkBundle\Controller\Controller )

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

Ou quando usar objects:

 $dog = new Dog(); $dog->setSpecies(174); // this id might be substituted by an entity $form = $this->createForm(AnimalType::class, $dog); 

Ainda melhor quando se usa uma fábrica: (onde o cão provavelmente se extende do animal)

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

Isso permitirá que você separe estrutura de formulário e conteúdo um do outro e torne seu formulário reutilizável em mais situações.


Ou use a opção preferred_choices , mas isso tem o efeito colateral de mover a opção padrão para o topo do formulário.

Consulte: 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 ] ); 

Você pode definir o valor padrão correto no modelo que deseja editar com este formulário ou pode especificar uma opção empty_data para que seu código se torne:

 $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() ; 

Você pode usar “preferred_choices” e “push” o nome que deseja selecionar no topo da lista. Em seguida, ele será selecionado por padrão.

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

Entidade Tipo de Campo