2011-11-04 14 views
11

Estoy usando Symfony2 y CraueFormFlowBundle para crear un formulario de varios pasos. Todo va bien, excepto el campo de mi correo electrónico repetido. No puedo, por el bien de mí, encontrar cómo poner las etiquetas que quiero. Estoy renderizando el formulario yo solo en la vista de Twig usando form_widget (...) y escribiendo las etiquetas. Posiciono todo siguiendo lo que mi cliente quiere. Ahora, desea ver las etiquetas de correo electrónico como "E-mail *" y "Confirmar correo electrónico *" (las estrellas, ya que son necesarias). Si represento los elementos repetidos usando form_row(), los errores ya no se muestran en el formulario (pero tengo control sobre las etiquetas, ajuste). La única forma de mostrar errores (no me preguntes por qué), es mediante el uso de form_widget (form.giver.email) que apunta a todo el objeto de elemento repetido. El problema es que usar form_widget para representar todo el elemento repetido no me da control sobre las etiquetas.Symfony2 forma etiquetas personalizadas de elementos repetidos

Al representar todo el elemento repetido, imprime las etiquetas usando los parámetros "first_name" y "second_name". No puedo poner letras mayúsculas ni guiones ni estrellas en estos parámetros por razones obvias. Si trato de configurar la etiqueta en el conjunto de opciones, esa etiqueta se pasa a ambos campos como se describe en el documento de Symfony2 ...

Intenté imprimir usando ".first" y ".second" en twig, pero Aparece un error que indica que estos no existen en FormView.

¡Ahora todo lo que quiero es poder configurar las dos etiquetas por separado! Aquí está mi código actual:

$builder->add('email', 'repeated', array(
     'type' => 'email', 
     'first_name' => 'email', 
     'second_name' => 'confirm', 
     'invalid_message' => 'The e-mails you provided did not match.', 
     'error_bubbling' => false 
    )); 

Esto imprime las etiquetas como "correo electrónico" y "confirmar". Aquí está utilizando el conjunto de "opciones":

$builder->add('email', 'repeated', array(
     'type' => 'email', 
     'first_name' => 'email', 
     'second_name' => 'confirm', 
     'invalid_message' => 'The e-mails you provided did not match.', 
     'error_bubbling' => false, 
     'options' => array(
      'label' => "TESTTT" 
     ), 
    )); 

Esto imprimirá la etiqueta "TESTTT" en ambos campos repetidos. ¿Hay algo que pueda hacer al respecto? Como se mencionó anteriormente, el uso de form_row() no muestra los errores en el envío del formulario si los correos electrónicos no son iguales o si están en blanco. Así que estoy obligado a usar form_widget() y representar todo el objeto repetido.

Gracias de antemano por su tiempo.

Respuesta

5

Uso

$formView->getChild('passwordFieldName')->getChild('second')->set('label', 'Enter password again'); 
+4

Si uno está trabajando dentro de la 'FormBuilder' (o Formulario Tipos) la sintaxis sería '$ formBuilder-> get ('passwordFieldName') -> get ('second') -> setAttribute ('label', 'Enter password again');' – Nick

0

¿Intenta agregar el nombre del campo y la etiqueta en el archivo de las traducciones? P. ej. CraueFormFlowBundle.en.yml

6
{{ form_label(form.password.confirmpassword, 'Confirm Password') }} 
-1

cualquiera que se pregunte por qué la personalización repated entradas de formulario no funciona, mira esto:

$builder->add('username', 'text') 
      ->add('email', 'email') 
      ->add('password', 'repeated'); 

le dará "primero" y "segunda" contraseñas, que se pueden llamar de acuerdo con:

{{ form_errors(form.password.first) }} 
{{ form_widget(form.password.first) }} 
{{ form_label(form.password.first) }} 

{{ form_errors(form.password.second) }} 
{{ form_widget(form.password.second) }} 
{{ form_label(form.password.second) }} 

Pero esto:

$builder->add('username', 'text') 
      ->add('email', 'email') 
      ->add('password', 'repeated', 
      array('type' => 'password', 
       'first_name'=>'Password', 
       'second_name' =>'Confirm password')); 

NO SERÁ !!!

2
$builder->add('username', 'text') 
      ->add('email', 'email') 
      ->add('password', 'repeated', 
      array('type' => 'password', 
       'first_name'=>'Password', 
       'second_name' =>'Confirm password')); 

es incorrecto, mejor tratar

$builder->add('username', 'text') 
      ->add('email', 'email') 
      ->add('password', 'repeated', 
      array('type' => 'password', 
       'first_name'=>'first', 
       'second_name' =>'second')); 

y usted será capaz de utilizar:

{{ form_errors(form.password.first) }} 
{{ form_widget(form.password.first) }} 
{{ form_label(form.password.first) }} 

{{ form_errors(form.password.second) }} 
{{ form_widget(form.password.second) }} 
{{ form_label(form.password.second) }} 
11

No es más fácil y de forma correcta:

->add('plainPassword', 'repeated', array(
    'type' => 'password', 
    'invalid_message' => "some.error.message", 
    'first_name' => 'somecoorectname', // (optional). 'first' value by default. 
    'first_options' => array(
     'label' => 'label.for.future.translate' // Custom label for element 
    ) 
    /* 
     The same way for Second field 
    */ 
)) 

Disfruta !

+0

Esto no funciona k con Symfony2.0. Está en la rama principal (> = 2.1?) Pero no en la rama 2.0. – flu

+1

Sí, esto solo funciona con Symfony 2.1. El otro método mencionado en la respuesta aceptada ya no funciona en 2.1. – smoove

+0

genial, funciona como un encanto! Mi código: $ builder-> add ('contraseña', 'repetido', matriz ( 'tipo' => 'contraseña', 'first_name' => "contraseña", 'second_name' => "confirmpass" , 'invalid_message' => "contraseñas no coinciden", 'first_options' => array ('label' => 'password'), 'second_options' => array ('label' => 'repeat password'))); – thorinkor

4

El siguiente ejemplo funcionó para mí.

  • Aquí la declaración 'tipo':

    $builder->add('username', 'text') 
         ->add('email', 'email') 
         ->add('password', 'repeated', 
         array('type' => 'password')); 
    
  • Y aquí la 'rama' utilizar

    {{ form_errors(form.password.first) }} 
    {{ form_widget(form.password.first) }} 
    {{ form_label(form.password.first, 'Password') }} 
    
    {{ form_errors(form.password.second) }} 
    {{ form_widget(form.password.second) }} 
    {{ form_label(form.password.second, 'Confirm password') }} 
    
Cuestiones relacionadas