Форма добавления поля Symfony без префикса

Мне нужно одно скрытое поле в моей форме symfony без префикса. В этом поле хранится некоторая информация, необходимая мне для воссоздания типа формы в моем слушателе. Я не хочу перебирать все параметры $request, чтобы получить правильную форму, поэтому я хочу добавить простое поле без префикса. Это должно быть обработано в конструкторе форм, потому что интерфейс не является частью пакета.

Текущий упрощенный код:

$builder->add('firstName'; TextType::class);
$builder->add('lastName'; TextType::class);
// ...
// field without prefix
$builder->add('someValue', HiddenType::class, ['mapped' => false]);

Ожидаемый результат:

<input type="text" name="form_name[firstName]" />
<input type="text" name="form_name[lastName]" />
<!-- ... -->
<input type="hidden" name="someValue" /> <!-- without prefix -->

Дело в том, что мне нужно получить к нему доступ с помощью $request->request->get('someValue'). Поскольку мое имя формы является динамическим, я не могу получить доступ к массиву.

Это возможно?


person Alexander Schranz    schedule 07.12.2016    source источник
comment
Хотя большинство вещей возможны, эта заставит вас рвать на себе волосы. Префикс используется для сопоставления опубликованных данных с помощью handleRequest. Вы действительно не можете просто заставить его уйти и ожидать, что компонент формы будет работать. Я не совсем следил за вашим вариантом использования, но если это значение только для чтения, которое не нужно обрабатывать компонентом формы, вы можете просто выдать html-код прямо в своем шаблоне ветки.   -  person Cerad    schedule 07.12.2016
comment
@Cerad, как сказано, внешний интерфейс не является частью пакета, и я не хочу, чтобы каждому создателю темы формы приходилось добавлять эти значения каждый раз при создании формы.   -  person Alexander Schranz    schedule 07.12.2016


Ответы (2)


Да, ты можешь. Посмотрите здесь

Пример:

use Symfony\Component\OptionsResolver\OptionsResolver;

class TaskType extends AbstractType
{
    // buildForm() method: add your fields here

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'      => 'AppBundle\Entity\Task',
            'csrf_protection' => true,
            'csrf_field_name' => 'formKey',
            // a unique key to help generate the secret token
            'csrf_token_id'   => 'task_item',
        ));
    }

    // ...
}

LE:

Я немного покопался, чтобы узнать больше об этой проблеме. И мне не удалось найти правильный способ переопределить только атрибут name для определенного поля формы. Итак, я заканчиваю:

1. Добавьте новый атрибут name для этого поля, но вы получите два атрибута name, и я не проверял, какой из них будет использоваться. Я предполагаю, что первый.

{{ form_row(form.someValue, { attr:{ name:'someValue' } } }}

//This will look like:
 <input type="hidden" id="category_someValue" name="category[someValue]" name="someValue" />

И если вы посмотрите на исходную страницу, вы увидите последний атрибут name красным цветом. Думаю, не так хорошо.

2. Используйте в своем классе Type метод getBlockPrefix(), который переопределит весь префикс формы:

// AppBundle/Form/FormType.php
public function getBlockPrefix()
{
    return ''; // return an empty string here
}

А теперь удалите attr, добавленный для вашего поля, и поставьте только это:

{{ form_row(form.someValue) }}

Но теперь все поля формы больше не будут иметь этот form_name[first_name] атрибут имени, а только name="first_name". Таким образом, ваше скрытое поле будет иметь: name="someValue".

Но, пожалуйста, дайте нам знать, если вы найдете лучшее решение (в идеале, правильное).

person Dan Costinel    schedule 07.12.2016
comment
Я не хочу интегрировать токен csrf, мне нужно просто скрытое поле без префикса. Чтобы получить к нему доступ с помощью $request->request->get('someValue'). переименует поле, чтобы сделать его более понятным. - person Alexander Schranz; 07.12.2016

Я не знаю, возможно ли это (думаю, что нет). Можно ли решить вашу проблему с помощью метода getName() вашего FormType? Пример:

// Controller
$form = $this->createForm(YourType::class, $yourObject);
// Get all parameters related to the form
$data = $request->request->get($form->getName());
// Output 'someValue'
echo $data['someValue'];
person W0rma    schedule 07.12.2016
comment
Форма создается динамически, и для ее создания требуется $request->request->get('someValue');. Имя неизвестно формы, потому что это также динамически. - person Alexander Schranz; 07.12.2016