Слушатель событий формы Symfony для полей коллекции

Я использую прослушиватель событий для динамического изменения данных на основе пользовательского ввода. Каждый раз, когда я использую события PRE_SET_DATA и PRE_SUBMIT для набора данных и выбора полей. Вот простой пример действий из PRE_SUBMIT:

// Pre set share locations by share day
if (array_key_exists('shares', $data)) {
    foreach ($data['shares'] as $key => $share) {
        if ($share['pickUpDay'] !== null) {
            $shareType = $form->get('shares')->get($key);

            $locations = $this->em->getRepository('AppBundle:Member\Location')->getLocationsByDay($client, $data['shares'][$key]['pickUpDay']);
            $this->addLocationField($shareType, $locations);
         }
     }
 }

Неважно, что внутри функции addLocationField, она работает правильно.

Когда я делаю $form->get('shares'), это мое поле коллекции, тогда мне нужно ->get(child) этой коллекции и установить данные полей и варианты выбора прямо в этот дочерний элемент. Когда я динамически добавляю коллекцию, Symfony показывает ошибку:

Ребенок "n" не существует.

И эта проблема возникает только тогда, когда я пытаюсь получить данные новой коллекции, которая была добавлена ​​динамически. Поэтому я не могу перейти к полю коллекции и изменить варианты, поэтому получаю сообщение об ошибке, что моего нового значения нет в списке выбора.

Интересно, что у $data['shares'] есть все данные для новых элементов коллекции, а у $form->get('shares') нет:

var_dump(count($event->getData()['shares'])) - return 1;  
var_dump(count($form->get('shares'))) - return 0;

Означает ли это, что мой PRE_SUBMIT работает до того, как появится функциональность коллекции Symfony?

Кто-то знает, как это исправить?


person Valentine Murnik    schedule 14.09.2017    source источник


Ответы (1)


Я знаю, что ваш вопрос «старый», и вы, вероятно, нашли решение, но вы были в правильном направлении, когда сказали:

Означает ли это, что мой PRE_SUBMIT работает до того, как появится функциональность коллекции Symfony?

Ваша новая коллекция еще не отправлена ​​и отсутствует в модели см. эту часть документа

Чтобы сделать то, что вы хотите, вы должны использовать событие SUBMIT

NB: вы не можете добавить какое-либо поле на POST_SUBMIT

person Julien Bourdic    schedule 20.09.2017