Добавьте текущее значение объекта к значениям типа выбора, если оно отсутствует
В настоящее время я конвертирую приложение в Symfony 3.3 и ломаю голову над тем, как я могу добиться следующего.
У меня есть поле ChoiceType
, называемое Responsible
(String
значения), который заполняется из представления базы данных. Я ожидаю увидеть, что поле Responsible
уже заполнено при переходе в режим редактирования, что происходит, когда значение записи Responsible
является частью значений поля Responsible
.
Но с тех пор значения изменились, поэтому, когда я начинаю редактировать существующую запись, она будет отображаться как Пожалуйста, выберите , если значение не является частью уже заполненных значений.
Моя цель - добавить это отсутствующее значение в значения полей Responsible
, чтобы оно было предварительно выбрано, но я пока не смог найти, как это сделать.
Я попытался посмотреть, есть ли возможность в ChoiceType
документация, но, похоже, для этого мне нужно перейти к событиюonPreSetData
, но даже там я могу найти только способ динамического добавления полей, а не значений в существующие поля.
Как кто-нибудь узнал, как это сделать, и какой "правильный" способ это сделать?
Спасибо.
Редактировать: Благодаря ответу @matval, не хватало только чего-то, что нужно было найти, если текущее значение указано в выборе, чтобы у нас не было повторяющихся значений, таких как if (!array_key_exists($entity->getResponsible(), $choices))
.
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// Some preceding code...
// onPreSetData
->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSet'))
}
/**
* On pre set event.
*
* @param FormEvent $event
* @throws \Exception
*/
public function onPreSet(FormEvent $event)
{
// Get entity & form
$entity = $event->getData();
$form = $event->getForm();
// Fill choices with responsibles from the users table
$choices = $this->fillResponsibles();
// If the key does not exists in the choices, add it.
if (!array_key_exists($entity->getResponsible(), $choices)) {
$choices[$entity->getResponsible()] = $entity->getResponsible();
}
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
'placeholder' => '-- Please Select --',
'label' => 'Responsible',
'required' => false,
]);
}
1 answers
События формы - это правильный способ сделать это. Они являются лучшим способом создания динамичных форм. Как вы можете видеть в документе symfony, вам следует добавить свое поле Responsible
во время события PRE_SET_DATA
.
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$entity = $event->getData();
$choices = ... // populate from db
$choices[] = $entity->getResponsible();
$form = $event->getForm();
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
]);
});
Если вы хотите сохранить динамическое поле Responsible
в своем типе формы (возможно, повторно использовать для действия создания), вы все равно можете использовать то же событие. Все, что вам нужно сделать, это удалить поле и добавить его снова.
$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
$entity = $event->getData();
$choices = ... // populate from db
$choices[] = $entity->getResponsible();
$form = $event->getForm();
$form->add('responsible', ChoiceType::class, [
'choices' => $choices,
]);
});