formularios formulario estructura elementos ejemplo codigo forms symfony silex

forms - estructura - Componente de formulario Symfony2: creación de campos sin el nombre de los formularios en el atributo de nombre



formularios html css (3)

Actualmente estoy tratando de usar el componente de formulario Symfony2 a través del microframework Silex.

Mi formulario de inicio de sesión 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;

El problema es que el formulario resultante se está creando 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 quiero que los atributos de nombre e id sean los siguientes:

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

Recorrí la Web y descubrí consejos sobre la opción ''property_path'', pero creo que esto tiene que ver con la clase utilizada para procesar los datos cuando se usan en el propio marco de Symfony2.

He revisado los archivos de Componente de formulario y el punto en el que se está configurando está en:

Symfony / Component / Form / Extension / Core / Type / 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 funciona 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 método Form-> add () establece automáticamente el formulario como padre de cada hijo:

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 comenzar a anular estas clases solo para eliminar esto, ¿alguien más sabe cuál es el mejor método para mostrar el nombre de los campos?

Es posible simplemente extraer "nombre" en lugar de "nombre completo" 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 inyectable opciones que harían el truco.


En Symfony3, anule AbstractType :: getBlockPrefix en clase secundaria para devolver nulo.


En lugar de usar la función createBuilder:

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

El primer parámetro es el nombre del formulario.

Ejemplo del propio Bernhard Schussek en https://.com/a/13474522/520114


Si no está utilizando formularios secundarios, puede establecer el método getName de su formulario como cadena vacía:

class FormType extend AbstractType { // ... public function getName() { return ''''; } }