2011-06-14 8 views
15

En el componente de formulario Symfony2 ¿es posible crear atributos personalizados?¿Es posible crear atributos de campo de formulario personalizados en Symfony 2?

La razón por la que pregunto es porque estoy trabajando en un cierto caso límite donde read_only no será suficiente.

Aquí está el escenario: Necesito vincular los datos en función del resultado de algún análisis de lógica externa. Esto es crucial porque puedo tener campos que están deshabilitados por defecto, pero según la lógica externa, los campos pueden activarse. No puedo usar las secuencias de comandos del cliente para producir este resultado, tiene que estar deshabilitado en el atributo de formulario.

Si comienzo con el campo como read_only, se deshabilitará, pero nunca podré enlazar datos a él. Entonces, dado el resultado de mi lógica externa antes mencionada, no podré usar read_only. Así que esto no me deja otra opción más que usar un atributo diferente que desactivará el campo.

¿Es posible crear un atributo personalizado para producir este efecto deshabilitado?

+0

¿Qué es este "análisis de lógica externa"?Por lo que veo, está buscando hacer un campo de formulario opcionalmente requerido en base a otros criterios, pero no describe cuál es ese criterio, por lo que es difícil determinar exactamente dónde debería estar la solución. ¿Es el resultado de una llamada AJAX, una actualización de formulario o algo interno a su controlador? –

Respuesta

19

No estoy seguro de haber entendido su pregunta correctamente; ¿Desea agregar atributos arbitrarios a sus etiquetas de entrada de formulario? Por ejemplo:

<input type="text" name="myInput" myAttr="myValue" /> 

Si esto es lo que quiere hacer, entonces esto es posible, de este modo:

$form = $this->createFormBuilder($someObj) 
     ->add('myInput', 'text', array(
      'attr' => array('myAttr' => 'myValue') 
     ) 
     ->getForm(); 

La documentación está aquí:

http://symfony.com/doc/2.0/reference/forms/types/field.html

+0

Intenté esta solución para establecer el valor del nombre de atributo de mi campo de entrada. Pero cuando imprimí mi formulario e inspeccioné los elementos, el valor del nombre del conjunto se asignó a la etiqueta para ese campo. Cambio el valor del atributo a 'clase' y funcionó. ¿Cómo es que ese atributo de nombre no funciona como se espera a diferencia del atributo de clase? – Floricel

+1

@Floricel, el atributo 'name' de su entrada viene determinado por el primer argumento de' $ builder-> add ($ inputName, $ type) ', por lo que no tiene sentido intentar anularlo con' opción attr' Podría ser que el primer argumento para 'add()' siempre anule 'attr ['name']'. –

+0

Esta debería ser la respuesta aceptada –

0

Su limitación no es Symfony, su limitación es HTML y HTTP. Desafortunadamente, una vez que la solicitud HTTP se cumple, una vez que los datos se envían al navegador, no hay nada que un servidor pueda hacer para cambiar lo que se procesa (bueno, casi nada, siempre hay Skynet). La única opción es JavaScript (y eso puede hacer mucho si no están ejecutando Lynx).

Vi su question en Grupos de Google y basándome en la combinación de ambos, puedo decirle que solo tiene dos opciones.

  • Puede hacer que la opción aparezca como respuesta a la primera respuesta que tenga del navegador.
  • Puede usar JavaScript y luego manejar cualquier falla en el lado del servidor.

¿Tu mejor apuesta? Creo que los usuarios apreciarán la opción de JavaScript. Es una buena política validar la información del usuario del lado del servidor de todos modos. Obviamente, avísele al usuario lo antes posible validando con JavaScript, pero de todos modos deberá verificar su entrada en el servidor.

Por cierto, para deshabilitar un campo de formulario en Symfony, las instrucciones paso a paso son here.

+0

La opción de solo lectura no funciona porque, en Symfony2 (no en Symfony1) si el campo es read_only, no será posible vincular los datos al campo deshabilitado, que es la razón por la que quiero desactivar mi propio atributo personalizado para que se puede desactivar sin ser solo de lectura. Usar Javascript para deshabilitar el campo es solo una solución porque el documento html aún será semánticamente incorrecto. –

Cuestiones relacionadas