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