В проекте Symfony2, как я могу передать массив как значение для метода отправки

В проекте Symfony2, как я могу передать массив как значение для метода отправки?

Моей форме нужно 7 параметров, поэтому, когда я делаю это handleRequest(), она работает нормально, заполняя форму вручную, но если я пытаюсь использовать массив и submit(), это не удается.

Обратите внимание, что массив, который я передаю методу отправки, находится в другом порядке, не имеет токена и имеет 8 значений вместо 7.

И, конечно же, я не использую метод handleRequest.

Но ключ массива $data[0] совпадает с именем свойств объекта.

$addForm = $this->createForm('ns_add', $entity);
$addForm->submit($data[0]);

EDIT: почти хорошо, с:

$addForm = $this->container->get('form.factory')->createNamed(null, 'ns_add', $entity);

Все параметры передаются в форму, я вижу это в профилировщике Symfony (инструмент под каждым приложением Symfony), но у меня все еще есть одна ошибка: токен CSRF недействителен. Пожалуйста, попробуйте повторно отправить форму.

Поскольку все 7 моих полей заполнены + 1 поле отправки, у меня пропущено только поле «_token», поэтому я пытаюсь добавить его в свой $data[0], но он не отображается в var_dump моего массива, но если я добавлю ключ, отличный от «_token», появляется (и вызывает ошибку: не разрешено или не указано дополнительное поле).

Вот я и подумал, что это из-за жетона моей первой формы. На самом деле настоящая форма представляет собой текстовую форму с 7 входами, но я создал кнопку экспорта, которая извлекает конфигурацию объекта, который я экспортирую.

И тогда, когда я загружаю файл через форму, содержащую конфигурацию, у меня уже есть ТОКЕН. Это вид РАЗДЕЛА ФОРМЫ в профилировщике:

ns_zippedfile [ns_zippedfile]
    file [file]
    ok [submit]
    _token [hidden]
(no name) [ns_add]
    name [text]
    adapter [choice]
    dbname [text]
    host [text]
    port [text]
    username [text]
    password [password]
    submit [submit]

Так что, может быть, мне нужно найти способ не объединять формы, этот раздел без имени меня смущает.


person ricko zoe    schedule 07.03.2016    source источник
comment
var_dump($data) пожалуйста   -  person Arthur Khusnullin    schedule 07.03.2016
comment
@ArturVesker $data - это просто индекс массива ассоциативного массива, поэтому я использую $data[0] для доступа к нему, теперь я пытаюсь использовать те сеттеры объекта экземпляра объекта, чтобы создать весь полный объект и передать его методу отправки, но все же не т работать :/   -  person ricko zoe    schedule 07.03.2016
comment
Можете ли вы показать поля формы ns_add?   -  person Arthur Khusnullin    schedule 07.03.2016
comment
Поля такие же, как у ключей массива data[0], но в другом порядке, а это дополнительный ключ.   -  person ricko zoe    schedule 07.03.2016


Ответы (2)


Пытаться

$addForm = $this->container->get('form.factory')->createNamed(null, 'ns_add', $entity);

вместо

$addForm = $this->createForm('ns_add', $entity);

Не заботьтесь о порядке полей.

Вы можете отключить защиту CSRF, если она не нужна:

$addForm = $this->container->get('form.factory')->createNamed(null, 'ns_add', $entity, ['csrf_protection' => false]);
person Arthur Khusnullin    schedule 07.03.2016
comment
Где вы берете данные для $data[0]? Я обновляю свой ответ о csrf - person Arthur Khusnullin; 08.03.2016
comment
Из данных, которые я получаю через содержимое импортированного файла через форму (форма, которую вы видите при редактировании моего вопроса ns_zippedfile [ns_zippedfile] file [file] ok [submit] _token [hidden]...) - person ricko zoe; 08.03.2016

Я решил свою проблему,

$addForm = $this->container->get('form.factory')->createNamed(null, 'ns_add', $entity);

было хорошо, но вместо параметра null я бы лучше поставил то же значение, что и параметр 2, ns_add . Работает отлично.

$addForm = $this->container->get('form.factory')->createNamed('ns_add', 'ns_add', $entity);

N.B.: Не забудьте сгенерировать токен и сохранить его в массиве данных для поля:

$data[0]['_token'] = $this ->get('form.csrf_provider') ->generateCsrfToken('ns_add') ;

N.B.2:ns_add, вот имя моей формы, просмотрите getName() метод вашей формы класса EntityType.

person ricko zoe    schedule 08.03.2016