Symfony2 Ustawianie domyślnego wyboru pola wyboru

Tworzę formularz w następujący sposób:

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

Jak mogę ustawić domyślną wartość listy gatunków?


Dziękuję za odpowiedź, przepraszam, myślę, że powinienem sformułować swoje pytanie. Jak ustawić tę wartość jako SELECTED = " yes " dla odpowiedniej wartości na liście wyboru gatunku?

Tak, że wyjście opcji select z widoku gałązki będzie wyglądać tak:

<option value="174" selected="yes">Dog</option>
Author: Gordon, 2011-11-09

12 answers

Jeśli użyjesz roztworu Cristiana, musisz wstrzyknąć EntityManager do swojej klasy FormType. Oto uproszczony przykład:

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

I twój kontroler:

 // ...    

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

// ...

Z Doktryny Docs :

Metoda EntityManager # getReference ($entityName, $identifier) pozwala uzyskać odniesienie do encji, dla której identyfikator jest znany, bez ładowania tego encji z bazy danych. Jest to przydatne, na przykład, jako zwiększenie wydajności, gdy chcesz utworzyć powiązanie z podmiotem, dla którego masz identyfikator.

 60
Author: Carrie Kendall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:03:02

Możesz zdefiniować wartość domyślną z atrybutu 'data'. Jest to część abstrakcyjnego typu "pole" ( 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();

W tym przykładzie, 'Draft' będzie ustawiony jako domyślna wybrana wartość.

 113
Author: bentidy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-13 14:20:18

Rozwiązanie: dla encji typu użyj opcji "data", ale wartość jest obiektem. ie:

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

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

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

))
 23
Author: Cristian Camilo Diaz Agudelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 09:59:26

Myślę, że powinieneś po prostu użyć $breed->setSpecies($species), na przykład w mojej formie mam:

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

I ustawia mój domyślny wybór na bieżącą datę. Powinno działać w ten sam sposób dla podmiotów zewnętrznych...

 7
Author: Kjir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-05 15:19:10

Jeśli chcesz przekazać tablicę encji doktryn, spróbuj czegoś takiego (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,
    ]);
}
 4
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-31 12:04:51

Myślę, że nie powinieneś używać opcji data, ponieważ robi to więcej niż tylko ustawianie wartości domyślnej. Nadpisujesz również wszelkie dane przekazywane do formularza podczas tworzenia. Więc w zasadzie, łamiesz wsparcie dla tej funkcji. - Co może nie mieć znaczenia, kiedy pozwalasz użytkownikowi tworzyć dane, ale ma znaczenie, gdy chcesz (kiedyś) użyć formularza do aktualizacji danych.

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

Uważam, że lepiej byłoby przekazać wszelkie domyślne dane podczas tworzenia formularza. W kontrolerze.

Na przykład, możesz przekazać klasę i zdefiniować domyślną wartość w samej klasie. (przy użyciu domyślnego Symfony\Bundle\FrameworkBundle\Controller\Controller)

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

Lub podczas używania obiektów:

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

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

Jeszcze lepiej, gdy korzystasz z fabryki: (gdzie pies prawdopodobnie wywodzi się od zwierzęcia)

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

To pozwoli Ci oddzielić od siebie strukturę formy i treść oraz dokonać twoja forma może być wielokrotnego użytku w większej liczbie sytuacji.


Lub użyj opcji preferred_choices, ale spowoduje to przesunięcie domyślnej opcji na górę formularza.

Zobacz: 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
     ]
 );
 3
Author: Maurice,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 12:09:04

Nie jestem pewien, co robisz źle tutaj, kiedy buduję formularz za pomocą klas form Symfony dba o wybranie odpowiedniej opcji na liście. Oto przykład jednego z moich formularzy, który działa.

W kontrolerze dla akcji edycji:

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

Klasa typu entity kampanii (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';
    }
}
 2
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-18 00:50:30

From the docs:

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

Mixed $data = null jest domyślną opcją. Na przykład mam pole o nazwie status i zaimplementowałem je tak:

$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();
 2
Author: Hard-Boiled Wonderland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 11:29:35

Ustawienie domyślnego wyboru przycisku radiowego 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                   
        ))
 2
Author: SudarP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-31 05:01:42

Formularz powinien automatycznie mapować wartość species - > id do wybranego pola wyboru encji. Na przykład, jeśli masz podmiot rasy, który ma związek OnetoOne z podmiotem gatunku w tabeli łączenia o nazwie "breed_species":

class Breed{

    private $species;

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

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

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

Pole "species" w klasie formularza powinno pobierać wartość species->id z obiektu "species" atrybutu w klasie rasy przekazanego do formularza.

Alternatywnie, można jawnie ustawić wartość przez jawne przekazywanie gatunków encja do formularza za pomocą 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()
            )
    );
 1
Author: Onshop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 03:48:49

Możesz albo zdefiniować właściwą wartość domyślną w modelu, który chcesz edytować za pomocą tego formularza, albo możesz określić opcję empty_data , aby Twój kod stał się:

$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()
;
 0
Author: Herzult,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-10 07:43:05

Możesz użyć "preferred_choices" i "push" nazwę, którą chcesz wybrać na górę listy. Wtedy zostanie wybrany domyślnie.

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

Typ Pola Entity

 -1
Author: repincln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 21:31:07