September 17th, 2015

манул

(no subject)

Понадобилось мне сделать многошаговую форму (multistep form) aka wizard в Symfony2. Оказывается, это не так просто, как кажется.

Во-первых, стандартных средств для работы с формами недостаточно. В Symfony всё слишком заабстрагировано, так что непосредственно управлять действиями, которые ты хочешь совершить, нельзя. Когда пытаюсь из первой формы передать управление контроллеру второй формы, Symfony считает, что форма _уже_ завершена, т.к. я нажал кнопку submit (судя по всему, она скрыто передаёт какое-то поле с этим признаком) - и вторая форма не отображается, а сразу отрабатывается, как завершённая.

Далее, пришлось искать расширение для этой цели. Нашёл некий Craue Formflow Bundle, установил. Вроде бы работает, но наткнулся на другую засаду. Во второй форме мне нужно показывать набор единообразных полей в количестве, заданном в первой форме. Набор единообразных полей в Symfony реализуется типом поля collection. Пробую - не работает, зараза. Говорит, что это поле лишнее (мол, в классе данных такого поля нет), и выдаёт его значение = null.

Вчера весь день провёл в чтении нараспев священных текстов документации и шаманских плясках с бубном - ничего не помогло. Сегодня с утра на свежую голову сделал ещё одно шаманское па: зарезервировал заранее в этом поле массив размером 100, а потом его обрезал до нужного размера. Помогло! Эта зараза (craue formflow bundle) _запоминает_ размер поля, заданный при инициализации, и выставляет его именно такого размера, несмотря на то, что в процессе перехода от первой формы ко второй этот размер поменялся. Ну а поскольку раньше я инициализировал это поле массивом нулевого размера, она и резала его до нуля. Причём теперь мне необходимо обрезать этот массив до нужного мне размера два раза: в первый раз при переходе ко второй форме (иначе вторая форма выведет мне 100 полей, а мне столько не нужно), а во второй раз - после завершения второй формы (иначе craue formflow bundle расширяет обрезанный массив опять до размера 100).

И самое главное: в документации об этом - ни слова.

P.S. Ненавижу свою работу.