Добавьте текущее значение объекта к значениям типа выбора, если оно отсутствует


В настоящее время я конвертирую приложение в 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,
    ]);
}
Author: douvillema, 2018-01-03

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,
    ]);
});
 5
Author: matval, 2018-01-11 17:08:26