Symfony2 Form Component - создание полей без имени формы в атрибуте имени - PullRequest
24 голосов
/ 07 декабря 2011

В настоящее время я пытаюсь использовать компонент формы 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>

Принимая во внимание, что атрибуты name и id должны быть следующими:

<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 / Компонент / Форма / Расширение / Ядро / Тип / 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, создается новая форма Form, и каждый дочерний 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, но я не был уверен относительно того, было ли это идеально (так как идентификатор остается неизменным) или был другой метод или инъекционные опции, которые помогут.

Ответы [ 3 ]

27 голосов
/ 29 марта 2016

В Symfony3 переопределите AbstractType :: getBlockPrefix в дочернем классе, чтобы вернуть ноль.

24 голосов
/ 07 декабря 2011

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

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

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

Пример сам Бернхард Шуссек на https://stackoverflow.com/a/13474522/520114

7 голосов
/ 18 января 2013

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

class FormType extend AbstractType {
    // ...

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