2011-12-07 22 views
21

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.

Respuesta

24

En lugar de la utilización de 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 por el propio Bernhard Schussek en https://stackoverflow.com/a/13474522/520114

+0

Ahhh, ahora por qué no miré en Github, eso hubiera tenido sentido. Gracias :) – thingygeoff

+0

@thingygeoff para que pueda aceptar esta respuesta :) – j0k

+0

¡Ah, ja! ha actualizado su respuesta, ¡una solución ideal! Gracias – thingygeoff

7

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

class FormType extend AbstractType { 
    // ... 

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

En Symfony3, anular AbstractType :: getBlockPrefix en clase infantil para devolver nulo.

Cuestiones relacionadas