Actualmente estoy tratando de usar el componente de formulario Symfony2 a través del microframework Silex.Componente de formulario de Symfony2: crear campos sin el nombre de formulario en el atributo de nombre
Mi formulario de acceso se genera de la siguiente manera:
$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;
La cuestión es que la forma resultante se crea de la siguiente manera:
<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>
Mientras que yo quiero el nombre y atributos id a ser tan sigue:
<div><input type="text" value="" name="username" id="username" class="text"></div>
...
<div><input type="password" value="" name="password" id="password" class="password"></div>
He recorrido la web y he descubierto consejos sobre el opti 'property_path' pero creo que esto tiene que ver con la clase utilizada para procesar los datos cuando se usa en el propio marco de Symfony2.
He estado a través de los archivos de formar el componente y el punto como el que esta se está creando está en:
Symfony/Componente/Formulario/Extensión/Core/Tipo/FieldType.php - línea 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;
}
...
Desafortunadamente, FormFactory utiliza FormBuilder que luego trabaja con la clase Form y no he tenido tiempo suficiente para analizar todo el funcionamiento interno del Componente.
Sé que los campos se agregan a la matriz 'hijos' dentro de FormBuilder con una lista de opciones correspondiente. Cuando se llama a la función getForm, se crea una instancia de un nuevo formulario y cada FieldType hijo se ingresa en el formulario utilizando el método add(). Este form-> add() método establece automáticamente el formulario como el padre de cada niño:
public function add(FormInterface $child)
{
$this->children[$child->getName()] = $child;
$child->setParent($this);
if ($this->dataMapper) {
$this->dataMapper->mapDataToForm($this->getClientData(), $child);
}
return $this;
}
sin empezar a anular estas clases sólo para eliminar esta ¿Alguien más sabe de la mejor forma de mostrar sólo el nombre de los campos ?
Es posible simplemente extraer 'nombre' en lugar de 'nombre_pleno' en el bloque form_div_layout.html.twig widget_attributes pero no estaba seguro de si esto era ideal (ya que el ID no se modifica) o si había otro método o opciones inyectables que harían el truco.
Ahhh, ahora por qué no miré en Github, eso hubiera tenido sentido. Gracias :) – thingygeoff
@thingygeoff para que pueda aceptar esta respuesta :) – j0k
¡Ah, ja! ha actualizado su respuesta, ¡una solución ideal! Gracias – thingygeoff