Sep 272011
 

Post to Twitter Post to Facebook


Gracias a la API de drupal podemos generar ,validar y procesar formularios de una forma más fácil al abstraernos del HTML y trabajar únicamente con un array anidado de propiedades y sus correspondientes valores, de esta forma podemos dejar a un lado la apariencia de nuestro formulario y centrarnos en su correcto desarrollo.Esta estructura de datos puede ser posteriormente renderizada mediante el theme que prefiramos sin tener que afectar al funcionamiento del formulario.

En este post veremos cómo crear un formulario sencillo validando sus datos y procesándolos posteriormente,nos servirá como toma de contacto y poder desarrollar formularios más complejos posteriormente.

Ubicando nuestro formulario

En este post desarrollaremos nuestro formulario en un nuevo módulo al que llamaremos “formexample” por tanto creamos el directorio nuevo en sites/all/modules y definimos nuestro módulo en el fichero formexample.info :

 name = Form Example
description = Shows how to build a Drupal form
package = Pro Drupal Development
core = 7.x
files[] = formexample.module

A continuación crearemos un enlace en el menu de navegación para poder acceder fácilmente a nuestro formulario, si no sabes cómo hacerlo que no cunda el pánico, en el post  “Displaying Menu Items as Tabs” encontrarás cómo hacerlo.Por ello implementamos la función hook_menu en nuestro fichero formexample.module :

<?php

/**
 * @file
 * Play with teh Form API
 */

/**
 * Implements hook_menu().
 */

 function formexample_menu(){
 $items['formexample'] = array(
 'title' => 'Accede al formulario',
 'page callback' => 'drupal_get_form',
 'page arguments' => array('formexample_nameform'),
 'access callback' => TRUE,
 'type' => MENU_NORMAL_ITEM

 );
 return $items;
 }
Definiendo nuestro formulario

Una vez que ya tenemos listo el contexto donde vamos a ubicar nuestro formulario, es hora de entrar en materia.Como dijimos al principio, trabajar con un formulario en drupal es trabajar  con un array anidado asociativo en el que podemos definir nuestros elementos del formulario como campos de texto, select,checkbox.. A su vez, para cada uno de los elementos podemos establecer ciertas propiedades como su título,descripción,valor,requerido o no..Y poder así definir nuestro formulario sin escribir nada de HTML.Si nos fijamos en el código del elemento del menú vemos que se llama a la función drupal_get_form() de la API y pasamos cómo parámetro el form ID de nuestro formulario “formexample_nameform” , de esta forma drupal_get_form() buscará la función “formexample_nameform” para obtener el formulario.Pues definamos nuestro formulario en formexample_nameform :


/**
 * Define a form.
 */
function formexample_nameform(){

 $form['name'] = array(
 '#title' => t('Nombre'),
 '#type' => 'fieldset',
 '#description' => t('¿Cómo te suelen llamar?'),
 );
 $form['name']['user_name'] = array(
 '#title' => t('Your name'),
 '#type' => 'textfield',
 '#description' => t('Introduce tu nombre'),
 );
 $form['color'] = array(
 '#title' => t('Color'),
 '#type' => 'fieldset',
 '#description' => t('Informacíon sobre tus gustos'),
 '#collapsible' => TRUE,
 '#collapsed' => FALSE,
 );
 $form['color_options'] = array(
 '#type' => 'value',
 '#value' => array(t('Rojo'),t('Amarillo'),t('Verde'),t('Azul')),
 );
 $form['color']['favorite_color'] = array(
 '#title' => t('Color Favorito'),
 '#type' => 'select',
 '#description' => t('Por favor selecciona un color'),
 '#options' => $form['color_options']['#value'],
 );
 $form['submit'] = array(
 '#type' => 'submit',
 '#value' => t('Submit'),
 );
 return $form;
}

Simplemente hemos añadido a nuestro formulario los siguientes elementos:

  • Un fieldset (name) donde se introduciremos los datos personales,en nuestro caso el textfield “user_name”.
  • Un textfield (user_name) donde el usuario introducirá su nombre, note que hemos anidado este elemento dentro de “name”.
  • Otro fieldset para almacenar los datos referentes a gustos personales , en nuestro caso el color favorito.
  • Un elemento select para que el usuario pueda elegir un color , pon atención a la forma en la que hemos asignado los valores a nuestro select.
  • Finalmente un elemento submit para enviar nuestro formulario.
Validando y tratando la información.

Una parte fundamental en el desarrollo de cualquier formulario es la validación de los datos recibidos del usuario, así evitaremos problemas de coherencia de datos y demás..Ciertas reglas de validación las podemos establecer como propiedades al definir un elemento del formulario como #required o #maxlength, sin embargo validaciones más complejas las deberemos realizar en “formexample_nameform_validate” (formID + “_validate”) donde recibimos como parámetros $form y $form_state. Escribamos un ejemplo de validación de los datos:

/**
 * Validate the form.
 */

 function formexample_nameform_validate(&$form, &$form_state){
 if($form_state['values']['user_name'] == 'King Kong'){
 //We notify the form API that this field has failed.
 form_set_error('user_name', t('King Kong no es una persona'));
 }
 }

Este caso es una validación muy básica pero nos sirve perfectamente para entender cómo debemos realizar la validación de los datos,si introducimos como nombre “King Kong” veremos un mensaje de error en nuestro formulario:

Imagen de error por fallo de validacion

El último paso es tratar los datos para lo que necesitemos , en este caso mostraremos un mensaje usando los datos recibidos, para ello debemos implementar la función “formexample_nameform_submit” (Form ID + _submit) :


/**
 * Handle post_validate form submission.
 */

 function formexample_nameform_submit(&$form, &$form_state){
 $name = $form_state['values']['user_name'];
 $color_key = $form_state['values']['favorite_color'];
 $color = $form_state['values']['color_options'][$color_key];
 drupal_set_message(t('A %name le gusta el color %color',array('%name' => $name, '%color' => $color)));
 }

Y por fín tenemos nuestro formulario básico completo :

  30 Responses to “Creating a basic Form with Drupal 7”

  1. Es un buen ejemplo aunque me generó un error en formexample.module linea 2
    'Accede al formulario',

    deberia ser
    'Accede al formulario',

    • Te puedes creer que no veo la diferencia entre las dos líneas?
      ‘Accede al formulario’,
      ‘Accede al formulario’,

  2. no tomo el tag :S
    ‘Accede al formulario’,

    ‘Accede al formulario’,

    • Efectivamente es un error el que comentas. El problema ha sido al trasladar al post el código del módulo ya que ha puesto en la declaración del title del enlace del menú lo siguiente :

      ‘title’ =–>’Accede al formulario’

      Cuando en realidad es :

      ‘title’=>’Accede al formulario’

      Muchas gracias por avisar del error :-) Un saludo.

    • Ya está corregido el código, ya no deberías tener ningún problema.

  3. Muy Buenas!

    Soy nuevo en Drupal, he estado siguiendo todos tus pasos pero me pierdo aqui…
    “A continuación crearemos un enlace en el menu de navegación para poder acceder fácilmente a nuestro formulario, si no sabes cómo hacerlo que no cunda el pánico, en el post “Displaying Menu Items as Tabs”
    He estado mirando este articulo pero no veo el fallo…

    He seguido saltandome solo ese paso, y el tag me lo crea pero cuando quiero acceder me sale este error:
    Notice: Undefined index: formexample_nameform en drupal_retrieve_form() (línea 750 de /var/www/drupal7/includes/form.inc).
    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘formexample_nameform’ not found or invalid function name en drupal_retrieve_form() (línea 785 de /var/www/drupal7/includes/form.inc).

    Si me puedes hechar una mano se agradecera :)

    • El error lo que indica es que no existe un formulario llamado “formexample_nameform” es decir que seguramente no hayas definido la función : ” formexample_nameform () “revisa tú código porque seguramente haya sido un fallo al escribir.

      Un saludo, comenta si era ese el error y muchas gracias.

      • Hola, tengo el mismo problema que Victor. Tengo el archivo “formexample_nameform” y está definida la función “formexample_nameform()”. Copié el código del ejemplo. Cuál puede ser el problema.? Cualquier ayuda agradecido..!!

    • mira yo tenia el mismo problema…, primero que nada…, uno de los problemas era cuando copie el código para generar el menú se copio mal el ‘page callback’ => ‘drupalget_form’, en realidad debe quedar como esta en esta pagina ‘page callback’ => ‘drupal_get_form’,
      luego no se por que motivo se creo en el menú de navegación el enlace sin activar el modulo…
      así que active el modulo y se soluciono…, cosas que pasan…

    • Buenas tardes tengo el mismo mensaje:

      Notice: Undefined index: formexample_nameform in drupal_retrieve_form() (line 760 of /../drupal/includes/form.inc).
      Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, ‘formexample_nameform’ was given in drupal_retrieve_form() (line 795 of /../drupal/includes/form.inc).

  4. Un saludo primeramente muy buena pagina, estoy iniciandome en el mundo de drupal, y no se mucho todavia, estaba siguiendo tu tutorial pero no logro que me salga lo del formulario, lo que hice es crear un archivo de texto con la extencion.module y ahi fui pegando todo el codigo que tienes arriba pero a la hora de entrar en drupal no se ha creado nada espero que me orientes ya que si nececito crear un formulario.

  5. Buen dia ya logre crear el formulario, pero ahora lo que quiero es guardar los campos en una tabla en la base de datos de drupal, quiero guardar los datos recogidos del formulario y almacenarlos en una tabla con el nombre que yo quiera en drupal, agradesco la ayuda.

  6. Hola me parece muy buen tutorial, ¿alguien me podrian indica como una ves que tenemos montado el formulario estilarlo?

    Es decir: poner las preguntas en columnas, alguna imagen, etc….

    He mirado la documentacion de drupal 7 y no veo nada

    Un saludo

  7. Buenas, me ha encantado el tutorial sobre formulario y todo el resto de artículos. enhorabuena. Tienes pensado un tutorial de como recoger los valores del formulario y enviarlos en una base de datos?

    Gracias, eres un crack!!!

  8. Hola estoy haciendo un formulario en drupal 7.12 pero no se como ordenarlos horizontalmente….si alguien me puede ayudar lo necesito para yaaa.

  9. Hola,

    Al poner el menú con submenús, no me aparece desplegado por defecto. Una vez que pincho en el menú, sí. ¿Cómo se puede hacer para que salga desplegado?
    Y, otra preguntilla, ¿como hacer para que salga en otro menú que no sea Navigation?

  10. Hola! a ver si me pueden ayudar… he accedido al un determinado formulario con el hook_form_alter en drupal 7 para editar determinados campos.

    Estoy usando la función : form_set_value de la siguiente manera:

    form_set_value($form['field_urlfield']['und'][0]['value']['#default_value'], 'ejemplo', $form_state);

    pero no modifica el contenido del campo field_value,

    alguna sugerencia?

    gracias.

  11. Hola porfavor… yo necesito un formulatio de comentario … asi como tienes aqui .. mu pedes ayudar con eso .. porfavor …. estoy tarabajando en drupal 7 .. y no tengo idea de como hacer este formulario .. se te agradece de antemano ..

  12. Buenas tardes José Luis

    Estoy trabajando en un proyecto y quisiera hacer algún módulo para mi web…

    crear un login de acceso para determinados usuarios … o algo asi

    ¿Me puedes ayudar?

    Eso si teniendo en cuenta que soy algo principiamente eh… gracias

    Un saludo

    /por cierto son geniales los tutoriales que pones, me han ayudado mucho /

  13. Excelente tutorial :) muy completo. Gracias

  14. muy bueno tu aporte muchas gracias….

  15. Gracias por el tuto, podras agregar la forma de subirlo a una tabla creada en la Bd de Drupal?

  16. Excelente el tutorial

  17. Necesito pedir que intruduzcan una hora en un formulario. Como puedo hacerlo?
    Gracias

  18. Muy buen aporte Jose, como siempre un 10 ;)

  19. Hola, buen aporte!
    me funciono, pero y si quisiera este formulario en un nuevo tab del user profile??

    salu2

  20. No me funcionó. No muestra el menú en el navigation……

  21. Decentemente escrito y va la pena leerlo. ¡Saludos!

  22. Hola,
    Como hago para mostrar los resultados del submit en table y con paginador.
    Es decir, tengo un _form con filtros. Ya estoy haciendo la consulta a ORACLE con limites y eso (bien), aunque esto de limit no existe en esta db. Ahora lo que necesito es mostrar form + resultados y que pueda seguir paginando.
    Alguna idea?

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>