drupal-header

Aplicar un theme, plantilla o template a formularios en Drupal 6

Supongamos que tenemos un formulario que creamos para que se vea en la URL
http://www.ejemplo.com/themed_form

El formulario definido en el modulo tendría una pinta como la siguiente:

Y el hook_menu tendría una pinta como esta:

Y la función para aplicar sobre la url seria:

El formulario se va a dibujar correctamente y lo podemos maquetar con CSS si queremos, pero, y si además de los elementos del formulario tenemos que meterle mas HTML ¿que hacemos?.

¿Modificamos la función que define al formulario metiéndole markups por todos lados?. Pues no.

¿Entonces cual es la forma en la que los formularios en drupal 6 se maquetan?:

Fácil. Agregas una linea mas en la definición del formulario como esta:

Como se puede ver, lo que estoy haciendo es renderizar uno a uno los elementos del formulario.

En el ejemplo anterior recordaras que hicimos algo así como “drupal_render($form)”. Bueno lo que pasa allí básicamente es que toma el array que definiste en la función y lo convierte en HTML, Y como nosotros queremos poder renderizar las partes del formulario por separado la teoría dice que si en lugar de mandar el array entero, mandamos un pedasito, debería funcionar, y es justamente lo que ha pasado en el segundo ejemplo.

pero falta algo acá.. el resto del formulario. Sin ir mas lejos falta el botón de envío, los token, el form_id (lo pueden ver el el código fuente de la pagina renderizada).

Eso pasa porque nosotros ya podemos controlar cuales elementos vamos a mandar a renderizar por separado, pero no le hemos dicho que hacer con el resto. Solucionemos esto agregando esta linea al justo debajo de las anteriores:

Guardar, probar, Alegrarse.

Ahora solo nos queda aprovechar que estamos parados en una plantilla y agregar el HTML que nos haga falta para poder darle la forma que queramos:

[htmlphp]


< ?php echo drupal_render($form[“apellido”]); ?>
< ?php echo drupal_render($form[“mail”]); ?>
< ?php echo drupal_render($form[“telefono”]); ?>
< ?php echo drupal_render($form[“nombre”]); ?>


< ?php echo drupal_render($form); ?>

[/htmlphp]

Para rematar el asunto, hice un modulito de ejemplo que podes descargar activar y probar en la url http://tuservidor.de.desarrollo.com/themed_form

Descargar módulo de ejemplo

Bueno espero que les sirva. Bye.

9 Comments

  • Juan 13/04/2010

    Gracias por el artículo, sencillo y útil. Añadiría un apunte, y es que dentro del theme se puede acceder también a la información que podamos haber guardado en $form_state[‘storage’], especialmente útil en formularios multipágina. Para ello, dentro de la plantilla accederemos a $form[‘#parameters’][1][‘storage’], y ¡ahí lo tenemos!

  • zucco 29/06/2010

    Muy bueno el articulo…..el detalle que me falto ver es, como el el codigo para guardar ese FORM dentro de una Base de datos…..Ojala me puedan ayudar.

    gracias.

  • Gabriela 02/09/2010

    Muy bueno, me gusta y era lo que necesitaba, lo voy a aplicar a ver que tal, y te aviso.

    Nota: me gusta el boton que dice: “Mira mama soy un boton” jajaja. 🙂

  • Gabriela 03/09/2010

    Excelente todo me funciono muy bien, gracias por el post. 🙂

    • Capy 04/09/2010

      Me alegro mucho XD

  • Joe Ronald 15/02/2011

    Te felicito. Ya me funcionó. Pero no logré un campo fieldset por ejemplo Busqueda (Libros) para un archivo template php con css. Dentro de la campo fieldset contiene el campo de texto para palabra clave, el campo de selección de opción y el botón Buscar. Ahora no me funcionó. Ayúdeme.

  • Capy 15/02/2011

    te ayudaría encantado, pero no entendí nada :S

    Explicame un poco mas en detalle si puede ser.

  • nelson 30/08/2011

    Muy buen post, de los mejores que he leido, pero tengo una pregunta:

    ¿Como hago para que este formulario sea visto por todos los usuarios?

    Ya que solo puedo verlo con el usuario admin, con el usuario anonimo no lo veo y solo sale el mensaje

    “Acceso denegado
    Usted no está autorizado para visitar esta página. ”

    Estaré atento a mi correo!!!

    De antemano muchas gracias!!!

  • Capy 30/08/2011

    con poner en la definición del menú el ‘access arguments’ => array(true), deberia hacer que sea visible para todo el mundo. ¿lo pusiste asi y no te funciona?

:).