Подтвердить что ты не робот

Symfony2 Form Component - создание полей без имени форм в атрибуте name

В настоящее время я пытаюсь использовать компонент формы Symfony2, хотя микрофрейм Silex.

Моя форма входа создается следующим образом:

$app = $this->app;

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(),
    'password' => new Assert\NotBlank(),
));

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint));

$form = $builder
    ->add('username', 'text', array('label' => 'Username'))
    ->add('password', 'password', array('label' => 'Password'))
    ->getForm()
;

return $form;

Проблема заключается в том, что создаваемая форма создается следующим образом:

<fieldset>
    <input type="hidden" value="******" name="form[_token]" id="form__token">
    <section class="">
        <label class=" required" for="form_username">Username</label>
        <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div>
    </section>
    <section class="">
        <label class=" required" for="form_password">Password</label>
        <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div>
    </section>
    <section>
        <div><button class="fr submit">Login</button></div>
    </section>
</fieldset>

В то время как я хочу, чтобы атрибуты имени и идентификатора были следующими:

<div><input type="text" value="" name="username" id="username" class="text"></div>
...
<div><input type="password" value="" name="password" id="password" class="password"></div>

Я просмотрел веб-сайт и обнаружил совет по параметру "property_path", но я считаю, что это связано с классом, используемым для обработки данных, когда он используется в самой существующей структуре Symfony2.

Я прошел через файлы компонента формы, и точка, в которой это задано, находится в:

Symfony/Component/Form/Extension/Core/Type/FieldType.php - строка 71

public function buildView(FormView $view, FormInterface $form)
{
    $name = $form->getName();

    if ($view->hasParent()) {
        $parentId = $view->getParent()->get('id');
        $parentFullName = $view->getParent()->get('full_name');
        $id = sprintf('%s_%s', $parentId, $name);
        $fullName = sprintf('%s[%s]', $parentFullName, $name);
    } else {
        $id = $name;
        $fullName = $name;
    }
    ...

К сожалению, FormFactory использует FormBuilder, который затем работает с классом Form, и у меня не было достаточно времени для анализа всей внутренней работы Компонента.

Я знаю, что поля добавляются в массив "children" в FormBuilder с соответствующим списком параметров. Когда вызывается функция getForm, создается новая форма, и каждый дочерний тип FieldType вводится в форму с использованием метода add(). Этот метод Form- > add() автоматически устанавливает форму как родительский элемент для каждого дочернего элемента:

public function add(FormInterface $child)
{
    $this->children[$child->getName()] = $child;

    $child->setParent($this);

    if ($this->dataMapper) {
        $this->dataMapper->mapDataToForm($this->getClientData(), $child);
    }

    return $this;
}

Не начинать переопределять эти классы, просто чтобы удалить это, кто-нибудь еще знает о лучшем методе только отображения имени полей?

В блоке form_div_layout.html.twig widget_attributes можно просто вытащить 'name' вместо 'full_name', но я не был уверен в том, было ли это идеально (поскольку идентификатор остался неизменным) или если был другой метод или варианты инъекций, которые могли бы сделать трюк.

4b9b3361

Ответ 1

Вместо функции createBuilder используйте:

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint));

Первый параметр - это имя формы.

Пример самого Бернхарда Шуссека в fooobar.com/questions/271785/...

Ответ 2

В Symfony3 переопределите AbstractType:: getBlockPrefix в дочернем классе для возврата null.

Ответ 3

Если вы не используете дочерние формы, вы можете установить метод getName вашей формы как пустую строку:

class FormType extend AbstractType {
    // ...

    public function getName() {
        return '';
    }
}