В настоящее время я пытаюсь использовать компонент формы 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', но я не был уверен в том, было ли это идеально (поскольку идентификатор остался неизменным) или если был другой метод или варианты инъекций, которые могли бы сделать трюк.