Установка данных с помощью прослушивателя событий и события FormEvent::PRE_SET_DATA в Symfony2
Я пытаюсь изменить некоторые данные в форме, основанной на других данных в форме. Из документов:
Событие FormEvents::PRE_SET_DATA отправляется в начале метода Form::setData(). Может использоваться для:
- Изменить данные, приведенные во время предварительного населения
- Изменить форму в зависимости от предварительно заполненных данных (динамическое добавление или удаление полей).
Эта жирная линия заставила меня поверить, что в моем случае должно быть возможно сделать что-то вроде следующего buildForm
функция:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventListener(\Symfony\Component\Form\FormEvents::PRE_SET_DATA,
function(\Symfony\Component\Form\FormEvent $event) use ($options) {
if ($options['default_to_nickname']) {
$securityContext = $this->container->get('security.context');
$nickname = null;
if ($securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
$user = $securityContext->getToken()->getUser();
$nickname = $user->getNickName();
if (isset($nickname))
{
$options['data'] = $nickname;
//$event->setData($nickname); //this doesn't work either
}
}
}
}
);
}
Тем не менее, ни options['data'] = $nickname;
ни $event->setData($nickname);
в результате заполнить форму правильными данными. Я вижу, что данные устанавливаются в объекте FormEvent при вызове $event->setData($nickname);
, но когда форма действительно отображается, данные не были установлены. Я ожидаю что-то не то? Я изучил, может ли что-то еще изменить это после этого, и нет. Любая помощь будет приветствоваться!
1 ответ
Вы должны позвонить $event->getForm()->get('your_property')->setData($nickname)
, замещать get()
метод по add($property, $type, ['data' => $nickname])
если свойство еще не существует.
Смотрите: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html