Значение поля выбора по умолчанию

У меня есть следующая форма:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('type', ChoiceType::class, array(
        'expanded' => true,
        'multiple' => false,

        'choices' => array(
            'Friend' => 'friend',
            'Guide' => 'guide'
        )
    ));
}

Как сделать так, чтобы флажок 'Друг' устанавливался по умолчанию при отображении формы?


person Alex Lomia    schedule 03.03.2016    source источник


Ответы (4)


Я думаю, вам следует попробовать вариант data, но это только в том случае, если у вас даже нет данных, сохраненных внутри вашего объекта, потому что он переопределит их.

Важно. Это удобно для действия создания, но не для действия редактирования.

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('type', ChoiceType::class, array(
            'expanded' => true,
            'multiple' => false,

            'choices' => array(
                'Friend' => 'friend',
                'Guide' => 'guide'
            ),
            'data' => 'friend'
        ));
    }

Официальная ссылка

Извлечь :

При создании формы в каждом поле изначально отображается значение соответствующего свойства доменного объекта формы (если объект привязан к форме). Если вы хотите переопределить начальное значение для формы или только отдельного поля, вы можете установить его в опции данных

ОБНОВИТЕ, ЕСЛИ ВАМ НУЖНО ПУСТОЕ ЗНАЧЕНИЕ:

Как ответ ниже, замените data на empty_data, если вам нужно в любом случае обновить значение по умолчанию.

person BENARD Patrick    schedule 03.03.2016
comment
Спасибо, это сработало! со строчными буквами 'data' => 'friend' - person Alex Lomia; 03.03.2016
comment
Не за что, я обновляю для будущих людей в той же ситуации, что и ваша. - person BENARD Patrick; 03.03.2016
comment
Я не думаю, что это безопасно: Из собственной документации symfony › Опция данных всегда переопределяет значение, взятое из данных домена (объекта) при рендеринге. Это означает, что значение объекта также переопределяется, когда форма редактирует уже сохраненный объект, что приводит к потере его сохраненного значения при отправке формы. - person user2268997; 08.07.2017
comment
НЕТ НЕТ НЕТ! Вопрос был о значении по умолчанию. Если вы укажете data, это не только не будет безопасно, но вы никогда не сможете редактировать свое значение: p (ожидайте, если вы измените его динамически)... Как указано в комментарии выше... не используйте это ! Вместо этого используйте empty_data! - person Romain Bruckert; 18.07.2017
comment
Я также думаю, что, как предлагает @Shadi Akil ниже, лучшим вариантом является установка значения по умолчанию для объекта (при использовании объектов для формы) - person Quisse; 22.01.2019
comment
Этот ответ вводит в заблуждение и может привести к неправильному поведению. Прежде чем принять решение, прочтите все приведенные выше предупреждения. @AlexanderLomia, вы должны снять отметку с этого ответа, так как это может не помочь другим. - person mr1031011; 12.02.2019
comment
@ mr1031011 Да, я думаю, я жду, пока спрашивающий отменит этот ответ, я не могу удалить его сам: Cannot delete the accepted answer сообщение - person BENARD Patrick; 12.02.2019
comment
Да, неправильный ответ, такое поведение не ожидается от вопроса - person Vincent Decaux; 07.09.2019

Используйте параметр поля формы empty_data. (не data, потому что он переопределит любые опубликованные данные, если вы не установите его динамически).

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
    ->add('type', ChoiceType::class, array(
        'expanded' => true,
        'multiple' => false,

        'choices' => array(
            'Friend' => 'friend',
            'Guide' => 'guide'
        ),
        'empty_data' => 'friend'
    ));
}

Другим вариантом для сложных случаев является использование событий динамической формы Sf.

person Romain Bruckert    schedule 18.07.2017
comment
Примечание: это не установит значение по умолчанию на дисплее, только когда вы отправите данные, если ничего не отправлено, оно примет это значение. - person Vincent Decaux; 07.09.2019
comment
Я люблю тебя, 3 дня потеряны, потому что я использую данные в PRE_SUBMIT для установки данных по умолчанию в моих полях ... и для моего плохого, когда я использую $event->setData($event->getForm()->getData()); в последнем моем событии PRE_SUBMIT... все данные записаны, и я думаю, что у меня все хорошо, но когда я отправляю, у меня возникает ошибка Составные формы ожидают массив или NULL при отправке Итак... Хороший способ для будущего разработчика, если вы хотите установите значение по умолчанию в полях формы, используйте empty_data;) - person Sinelc; 17.02.2021
comment
Ах ах, нет проблем, рад помочь! ;-) - person Romain Bruckert; 05.03.2021

Если вы не хотите переопределять значение для издания, вы можете сделать это:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        $form = $event->getForm();

        $form->add(
            'type', 
            ChoiceType::class,
            [
                'expanded' => true,
                'multiple' => false,
                'choices' => [
                    'Friend' => 'friend',
                    'Guide' => 'guide'
                ],
                'data' => $event->getData() ?: 'friend'
            ]);
    });
}
person Fabien Salles    schedule 26.07.2018
comment
ИМХО, это лучший подход, так как только он выбирает значение по умолчанию в форме, сохраняя при этом существующие значения при редактировании, тогда как empty_value срабатывает только при сохранении данных. Чтобы процитировать документацию по empty_value: It does not set an initial value if none is provided when the form is rendered in a view. - person krom; 29.08.2018
comment
Я сделал что-то подобное в Symfony 5 (с add() вне обработчика событий), и это работало хорошо, пока я не захотел поместить поле в форму с inherited_data, потому что «Формы с установленным параметром inherit_data не могут иметь *_SET_DATA слушателей событий». [ doc]. Я думаю, что я просто установлю значение по умолчанию в JavaScript, так как оно мне нужно только при создании новых объектов. - person user1738984; 27.05.2020
comment
Для этого есть метод setData. Я создаю массив с данными и вызываю его следующим образом: if(!empty($formData['edit'])) { $form-›setData($formData['edit']); } - person Patryk Godowski; 09.04.2021

Я думаю, что было бы лучше установить начальные значения в конструкторе Entity:

public function __construct()
{
    $this->exercises = new ArrayCollection();

    $this->setTitle("WOCHE#") ;

    $this->setYear(date('Y'));

    $this->setWeekInCalendar(Week::getCurrentWeekInCalendar());
}
person Shadi Akil    schedule 01.08.2018
comment
я не думаю, что размещение логики в конструкторе является хорошей практикой, лучше использовать фабрику или сеттеры - person medunes; 26.07.2020