Symfony2 Настройка выбора поля по умолчанию

65

Я создаю форму следующим образом:

$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>
  • 0
    @ Я не уверен, что выбранный ответ (видите, что я там сделал?) Самый лучший?
Теги:
forms
default
symfony-forms

12 ответов

56
Лучший ответ

Если вы используете решение 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)
        ));
    }
}

И ваш контроллер:

 // ...    

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

// ...

Из Doctrine Docs:

Метод EntityManager # getReference ($ entityName, $identifier) ​​позволяет получить ссылку на объект, для которого известен идентификатор, без загрузки этого объекта из базы данных. Это полезно, например, для повышения производительности, когда вы хотите установить связь с сущностью, для которой у вас есть идентификатор.

  • 5
    Идеальный ответ для предварительного выбора поля выбора в Symfony2
  • 1
    Это также будет работать для создания массива, который можно использовать для «предпочитаемого_чёта» для типа поля сущности.
Показать ещё 3 комментария
108

Вы можете определить значение по умолчанию из атрибута 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();

В этом примере "Черновик" будет установлен как выбранное по умолчанию значение.

  • 0
    Это сработало для меня. Я предоставил массив значений по умолчанию в атрибуте «data», и это тоже сработало. Спасибо!
  • 3
    Это не похоже на радио кнопки. Это может быть только я.
Показать ещё 2 комментария
23

решение: для типа сущность использует опцию "данные", но значение - это объект. то есть:

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

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

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

))
5

Я думаю, вы должны просто использовать $breed->setSpecies($species), например, в моей форме:

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

и устанавливает мой выбор по умолчанию на текущую дату. Должен работать одинаково для внешних объектов...

  • 0
    Моя проблема точно такая же, как и с DateType, но моя история заключается в том, чтобы добавить "" => "Выбрать ..." в качестве опции по умолчанию, чтобы принудительно сделать правильный выбор для даты рождения. Я могу выбрать вариант «Показать» в параметрах, но не использовать его по умолчанию. Каждый раз, когда я пытаюсь это сделать, Symfony жалуется, что ожидает аргумент типа DateTime. Я на более старой версии Symfony2; Я думаю, что они улучшили это с новой опцией заполнителя.
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,
    ]);
}
  • 1
    Хорошее решение, прекрасно работает при рендеринге сущностей в виде флажков, и когда мне нужно установить некоторые из них отмеченными, основываясь на определенном значении свойства сущности.
  • 0
    не будет работать в Symfony 2.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                   
        ))
  • 1
    Не работает, если вы редактируете существующую сущность, эта опция будет всегда выбрана
  • 0
    используйте empty_data вместо data чтобы установить значение по умолчанию и все еще иметь возможность редактировать сущность.
2

Из документов:

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

mixed $data = null - это параметры по умолчанию. Так, например, у меня есть поле, называемое статусом, и я реализовал его так:

$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

Я не уверен, что вы здесь делаете неправильно, когда я создаю форму с помощью классов форм, 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';
    }
}
  • 0
    Я думаю, что я, возможно, создаю формы неправильно, большое спасибо за ваш пример, я попробую и дам вам знать, как это происходит!
  • 0
    Привет, Крис, я немного озадачен тем, как ты, кажется, создаешь две формы в одном представлении. Можно ли опубликовать пример шаблона веточки и как вы обращаетесь к двум формам внутри шаблона веточки?
Показать ещё 2 комментария
1

Я не думаю, что вы должны использовать параметр 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);

Еще лучше при использовании factory: (где собака, вероятно, простирается от животного)

$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
     ]
 );
1

Форма должна автоматически отображать значение вида- > id в выбранное поле выбора объекта. Например, если у вас есть объект Breed, который имеет отношение OnetoOne с объектом Species в таблице соединений, называемой "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;
    }
}

Поле "вид" в классе формы должно поднять значение вида → 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()
            )
    );
0

Вы можете использовать "preferred_choices" и "push" имя, которое вы хотите выбрать в верхней части списка. Затем он будет выбран по умолчанию.

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

entity Тип поля

  • 4
    использование свойства предпочитаемое_движение приводит к переносу имени в начало списка, но по умолчанию оно не выбирается. Поскольку в шаблоне TWIG установлено значение по умолчанию, например: {{form_widget (form.species, {'empty_value': 'Please select ...'})}} значение "Please Select ..." выбирается по умолчанию, и если вы щелкнете по списку, пункт 'предпочитаемый_выбор' будет первым выбором, доступным под
  • 0
    Согласитесь, это неправильный ответ во многих случаях.
Показать ещё 1 комментарий
0

Вы можете определить правильное значение по умолчанию в модели, которую хотите изменить с помощью этой формы, или указать опцию empty_data​​strong > , чтобы ваш код стал:

$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
    свойство empty_data, похоже, ничего не делает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню