Sunteți pe pagina 1din 3

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 tendra una pinta como la siguiente: 1 function formulario(){ 2 $form['nombre'] = array( 3 '#title' => t('Nombre'), 4 '#type' => 'textfield', 5 ); 6 7 $form['apellido'] = array( 8 '#title' => t('Apellido'), 9 '#type' => 'textfield', 10 ); 11 12 $form['mail'] = array( 13 '#title' => t('e-mail'), 14 '#type' => 'textfield', 15 ); 16 17 $form['telefono'] = array( 18 '#title' => t('Telfono'), 19 '#type' => 'textfield', 20 ); 21 22 $form['submit'] = array( 23 '#type' => 'submit', 24 '#value' => t('Enviar'), 25 ); 26 return $form; 27 } Y el hook_menu tendra una pinta como esta: 1 function theme_form_sample_menu(){ 2 $items['themed_form'] = array( 3 'title' => 'Muestra de themado de un formulario', 4 'page callback' => 'render_formulario', 5 'access arguments' => array(true), 6 'type' => MENU_CALLBACK, 7 ); 8 return $items; 9 } Y la funcin para aplicar sobre la url seria: 1 function render_formulario(){ 2 //podemos agregar nuestros extras. 3 drupal_add_js(drupal_get_path('module', 'theme_form_sample') .'/js/ejemplo.js'); 4 drupal_add_css(drupal_get_path('module', 'theme_form_sample') .'/css/ejemplo.css'); 5 6 //ya podemos generar el formulario. 7 return drupal_get_form("formulario"); 8 }

El formulario se va a dibujar correctamente y lo podemos maquetar con CSS si queremos, pero, y si adems de los elementos del formulario tenemos que meterle mas HTML que hacemos?. Modificamos la funcin que define al formulario metindole markups por todos lados?. Pues no. Entonces cual es la forma en la que los formularios en drupal 6 se maquetan?: Fcil. Agregas una linea mas en la definicin del formulario como esta: $form['#theme'] = "theme_para_formulario"; La podes poner al principio o justo al final antes del return para mayor comodidad. Ahora bien, esto no es todo (si la vida fuera tan simple), adems nos hace falta definir el hook_theme(): 1 function theme_form_sample_theme() { 2 return array( 3 'theme_para_formulario' => array( 4 'template' => 'formulario', 5 'arguments' => array('form' => NULL), 6 ), 7 ); 8 } (Noten que en el argumento paso una variable llamada form) Ahora creamos la plantilla formulario.tpl.php y agregamos el siguiente cdigo: echo drupal_render($form); Guardarlo, limpia la cache y probalo. Podes ver que el formulario ah est, se dibuja, pero claro, segus sin poder manosear sus elementos por separado. Solucionemos eso o mi post va a dejar de tener sentido: Cambiemos el anterior cdigo de la plantilla (echo drupal_render($form);) por este otro: 1 <?php echo drupal_render($form["apellido"]); ?>; 2 <?php echo drupal_render($form["mail"]); ?>; 3 <?php echo drupal_render($form["telefono"]); ?>; 4 <?php echo drupal_render($form["nombre"]); ?>; 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 bsicamente es que toma el array que definiste en la funcin y lo convierte en HTML, Y como nosotros queremos poder renderizar las partes del formulario por separado la teora dice que si en lugar de mandar el array entero, mandamos un pedasito, debera 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 botn de envo, los token, el form_id (lo pueden ver el el cdigo 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: <?php echo drupal_render($form); ?> 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:

1 <div> 2 3 <div> 4 <!-- Si comentas esta linea vas a ver que se sigue dibujando el formulario entero --> 5 <?php echo drupal_render($form["apellido"]); ?> 6 <?php echo drupal_render($form["mail"]); ?> 7 </div> 8 9 <div> 10 <?php echo drupal_render($form["telefono"]); ?> 11 <?php echo drupal_render($form["nombre"]); ?> 12 </div> 13 14 <div>&nbsp;</div> 15 16 <!-- si comentas esta linea vas a ver como el resto de los elementos del formulario no se dibujan --> 17 <?php echo drupal_render($form); ?> 18 19 <div>&nbsp;</div> 20 21 </div> 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
Aadira un apunte, y es que dentro del theme se puede acceder tambin a la informacin que podamos haber guardado en $form_state['storage'], especialmente til en formularios multipgina. Para ello, dentro de la plantilla accederemos a $form['#parameters'][1]['storage'], y ah lo tenemos!

http://www.e-capy.com/aplicar-un-theme-plantilla-o-template-a-formularios-en-drupal6/ MIRAR MODULITO EJEMPLO: theme_form_sample.tar.gz

S-ar putea să vă placă și