Как указать значения по умолчанию в форме Symfony

Я пытаюсь указать значение по умолчанию в форме, поэтому при создании объекта поле формы имеет значение (не пустое и не пустое). Однако, когда объект редактируется, он, очевидно, должен отображать сохраненное значение, а не значение по умолчанию.

Моя сущность инициализирует себя как часть конструкции, поэтому, когда сущность новая и еще не сохранена, эти значения должны быть установлены.

Как мне сообщить FormType использовать значение по умолчанию вместо сохраняемого состояния? Все, что я пытаюсь, кажется, предполагает, что это одно или другое, а не оба?

Как это делается в Symfony 3.2+???

РЕДАКТИРОВАТЬ |

контроллер:

public function newAction (Request $request)
{
    $quoteItem = new QuoteItem();

    $form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]);
    $form->add('QuoteFlight', QuoteFlightType::class);
}

Тип формы:

public function configureOptions (OptionsResolver $resolver)
{
    $resolver->setDefaults([
      //'data' => new \UniflyteBundle\Entity\QuoteFlight()
      'data_class' => QuoteFlight::class
    ]);
}


public function buildForm (FormBuilderInterface $builder, array $options)
{
      $builder
      ->add('specMajorSetupCharge', null, [
        //'empty_data' => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE,
        'data'  => QuoteFlight::SPEC_MAJOR_SETUP_CHARGE,
        'label' => '* Setups Charge'
      ])
      // ...
}

person Alex.Barylski    schedule 02.08.2017    source источник
comment
Как выглядит ваш код?   -  person Jim Wright    schedule 02.08.2017
comment
Извините - пропустил :)   -  person Alex.Barylski    schedule 02.08.2017
comment
Если я устанавливаю данные явно, то это то, что всегда отображается в форме, по существу, над записью значения объекта. Я не понимаю, почему значение объекта по умолчанию не используется при создании объекта - и то же самое, когда объект загружается из БД.   -  person Alex.Barylski    schedule 02.08.2017
comment
У вас есть доступ к объекту в buildForm?   -  person Jim Wright    schedule 02.08.2017
comment
Да, я только что осознал свою ошибку: o мой плохой. У меня есть форма, встроенная в другую форму, и две сущности для каждой. Объект, который я создавал, был самым внешним объектом, но форма, которую я тестировал, была привязана к самому внутреннему объекту. Сущность буквально не существовала, пока я не отправил форму. Обходной путь заключался в том, чтобы создать и установить самый внутренний объект перед привязкой родительского объекта к форме. Извини за это :)   -  person Alex.Barylski    schedule 02.08.2017
comment
Если вы не решили это, этот ответ, кажется, то, что вы ищете? stackoverflow.com/a/15529083/4878850   -  person Jim Wright    schedule 02.08.2017


Ответы (2)


http://symfony.com/doc/current/components/form.html#setting-default-values

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

$quoteItem = new QuoteItem();
$quoteItem->getQuoteFlight()->setSpecMajorSetupCharge(QuoteFlight::SPEC_MAJOR_SETUP_CHARGE).

$form = $this->createForm(QuoteItemType::class, $quoteItem);
// ...

Использование опции data не годится, потому что:

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

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

Поэтому рекомендуется явно задавать данные в подчеркнутом объекте при инициализации либо в __constructor(), либо перед привязкой объекта к форме.

person yceruto    schedule 02.08.2017
comment
Это было да :) - person Alex.Barylski; 02.08.2017

Чтобы ответить на мой собственный вопрос и избежать путаницы для кого-либо в будущем:

$quoteItem = new QuoteItem();

// THIS LINE WAS MISSING
$quoteItem->setQuoteFlight(new QuoteFlight()); 

$form = $this->createForm('UniflyteBundle\Form\QuoteItemType', $quoteItem, ['allow_extra_fields' => true]);
$form->add('QuoteFlight', QuoteFlightType::class);

Без добавленной строки сущность QuoteFlight была NULL при отображении формы во время создания.

person Alex.Barylski    schedule 02.08.2017