Formularios avanzados en Drupal 7 usando #states

Drupal Add comments

En el post ³Creating a basic form with Drupal 7´ vimos cómo crear un formulario sencillo gracias a la API que nos proporciona Drupal.En esta ocasión crearemos un formulario dinámico, es decir responderá a las acciones del usuario añadiendo o quitando campos del formulario todo ello de una forma amigable con el usuario.Para ello usaremos la propiedad #states
Creando el contexto del formulario:

En el post anterior ya creamos un contexto para ubicar un formulario, en este caso haremos lo mismo pero nuestro módulo será ³form_example_dynamic´ y en el cual definiremos un enlace en el menu navigation para nuestro formulario: form_example_dynamic.info: 1name = Form Example - Creating a Dynamic Form 2description = An example of a dynamic form. 3package = Pro Drupal Development 4core = 7.x files[] = form_example_dynamic.module 5 form_example_dynamic.module: 1 <?php 2 /** 3 * @file 4 * An example of how to use new #states Form API element,allowing 5 dynamic forms behavior with very simple setup 6 */ 7 /** 8 * Implements hook_menu() 9 */ 10function form_example_dynamic_menu(){ 11 $items['form_example_dynamic'] = array( 12 'title' => 'Ejemplo formulario dinámico', 'page callback' => 'drupal_get_form', 13 'page arguments' => array('form_example_dynamic_form'), 14 'access callback' => TRUE,

4. En caso de elegir la sala de conferencias puede indicar cuántos ordenadores necesita. hora y duración. Independientemente del tipo de sala que escoja se debe permitir que el usuario deje información extra que sea de utilidad para su reserva. En el caso de que desee pagar por reservarla podrá indicar el dia y hora en que desa hacer su reserva. etc. 3. t('Sala de conferencias pequeña').15 'type' => MENU_NORMAL_ITEM 16 ). indicando a su vez cuantas sillas necesita y/o qué tipo de ordenador. return $items. '#title' => t('Qué tipo de habitación necesitas?'). conferencias. '#states' => array( //Acción que realizará: se hará visible. t('Sala de reuniones'))). 2. 'visible' => array( //Cuando se realizara : room_type = Habitacion de estudio ':input[name="room_type"]' => array('value' => t('Habitación de . &$form_state){ //Radiobutton con las posibles tipos de salas $form['room_type'] = array( '#type' => 'radios'. 17} 18 19 20 Definiendo el formulario : Supongamos que tenemos un site sobre alquiler de salas para celebrar reuniones. ). Atendiendo a estos requisitos podemos crear nuestro formulario usando el parámetro #states en los casos que necesitemos que se realice alguna accion dependiendo de algun evento : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 /** * Defines a Form() */ function form_example_dynamic_form($form. //Fieldset con la información adicional de la habitación de estudio. '#options' => drupal_map_assoc(array(t('Habitación de estudio'). En caso de elegir la sala de reuniones se le permiritirá escribir de forma libre el día . $form['study_room'] = array( '#type' => 'fieldset'..El formulario debe cumplir los siguientes requisitos: 1. 5. Queremos que mediante un formulario podamos recibir las solicitudes de reserva de nuestros clientes. qué habitación desearía elegir y si desea pagar por reservarla o puede esperar a que quede libre. sala de conferencias pequeña o sala de reuniones. En caso de seleccionar la sala de estudio puede elegir si necesita sillas y/o ordenador . '#title' => t('Detalles de la habitación de estudio'). El cliente pude solicitar tres tipos salas : sala de estudio . para ello se necesita un checkbox que active/desactive la posibilidad de agregar esta información.

'#title' => t('¿Qué tipo de ordenador necesitas?'). ). '#title' => t('Cuántos PCs necesitas en la sala de conferencias'). ).t('PC'))). '#title' => t('¿Cuántas sillas necesitas?'). 3 => t('Tres'). '#states' => array( . ). 4 => t('Cuatro'). ). '#title' => t('Detalles de la habitación de estudio'). ).esos van a ser bastantes'). '#description' => t('Vaya. ). '#size' => 15. '#title' => t('Información sobre la sala de conferencias pequeña'). '#options' => drupal_map_assoc(array(t('Sillas'). '#size' => 15. ). '#states' => array( 'visible' => array( ':input[name="equipment[Sillas]"]' => array('checked' => TRUE). '#size' => 4. $form['small_comference_room'] = array( '#type' => 'fieldset'. $form['small_comference_room']['how_many_pcs'] = array( '#type' => 'select'. ).17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 estudio')). ). $form['study_room']['pc'] = array( '#type' => 'textfield'. ). ). $form['small_comference_room']['comment'] = array( '#type' => 'item'. '#options' => array( 1 => t('Uno'). ). // Fieldset para la información adicional sobre la sala de conferencias. ). $form['study_room']['chairs'] = array( '#type' => 'textfield'. '#states' => array( 'visible' => array( ':input[name="equipment[PC]"]' => array('checked' => TRUE). 2 => t('Dos'). ). 5 => t('Cinco o más'). ). $form['study_room']['equipment'] = array( '#type' => 'checkboxes'. '#states' => array( 'visible' => array( ':input[name="room_type"]' => array('value' => t('Sala de conferencias pequeña')).

). '#states' => array( 100 'visible' => array( 101 ':input[name="room_type"]' => array('value' => t('Sala de 102reuniones')).').hora de comienzo y 88 fin'). 103 ). 87 '#description' =>t('Recuerda introducir la día. ). 105 $form['board_room']["more_info"]= array( 106 '#type' => 'textarea'. 76 $form['small_comference_room']['hours_writein'] = array( 77 '#type' => 'textfield'. 84 ). 66 ). 93 ). '#title' => t('¿Qué habitacion quiere usar? :'). 107 '#title' =>t('Por favor introduce fecha. 99 '#title' =>t('Informacion sobre la sala de reuniones'). 80 '#states' => array( 81 'visible' => array( 82 ':input[name="hours"]' => array('value' => t('Paid')). t('Paid'))).hora que te gustaría reservar 108la sala al igual que la duración. 67 ). ).hora que te gustaría reservar 79 la sala al igual que la duración.64 'visible' => array( 65 ':input[name="how_many_pcs"]' => array('value' => '5'). 109 $form['board_room']["info_provide"]= array( 110 . '#title' =>t('Por favor introduce fecha. 104 ). '#states' => array( 89 'visible' => array( 90 ':input[name="hours"]' => array('value' => t('Paid')). 73 '#options' => drupal_map_assoc(array(t('Free'). ). 91 ':input[name="hours_writein"]' => array('filled' => TRUE). 78 '#size' =>50. 75 ). 85 $form['small_comference_room']['reminder'] = array( 86 '#type' => 'item'. ). 74 '#title' =>t('¿Quieres reservar la sala cuando este libre (Free) o pagar por uso prioritario (Paid)?'). 94 95 //Fieldset para el caso "Sala de reuniones" 96 97 $form['board_room']= array( 98 '#type' => 'item'. 92 ). 71 $form['small_comference_room']['hours'] = array( 72 '#type' => 'select'.'). 68 $form['small_comference_room']['room_name'] = array( 69 '#type' => 'textfield'. 70 ). 83 ).

132 ). 127 '#collapsible' => TRUE. 133 ).111 '#type' => 'checkbox'. '#title' => t('Por favor 137ayude en su petición'). 114 '#states' => array( 115 'checked' => array( 116 ':input[name="more_info"]' => array('filled' => TRUE). 134 135 $form['more_info']['feedback'] = array( 136 '#type' => 'textarea'. 139 140 $form['submit'] = array( 141 '#type' => 'submit'. 128 '#collapsed' => TRUE. 142 '#value' => t('Enviar'). 118 ). 122 '#title' => t('Marca si deseas aportar información adicional'). 123 //Field set para la información adicional independientemente de la 124sala elegida. ). 112 '#title' =>t('Has proporcionado la informacion necesaria anteriormente'). ). 129 '#states' => array( 130 'expanded' => array( 131 ':input[name="expand_more_info"]' => array('checked' => TRUE). introduzca la informacíon adicional que nos 138 ). 117 ). 125 $form['more_info'] = array( 126 '#type' => 'fieldset'. ). 143 return $form. ). 144} 145 146 147 148 149 150 151 152 153 154 155 156 157 . '#title' => t('Instrucciones especiales'). 113 '#disabled' => TRUE. 119 120 $form['expand_more_info'] = array( 121 '#type' => 'checkbox'.

4 '#states' => array( 5 //Acción que realizará: se hará visible. 10 ). 3 '#title' => t('Detalles de la habitación de estudio'). ). 11 Con todo esto habremos terminado nuestro formulario y podremos comprobar que cumple cada uno de los requisitos especificados: . 'visible' => array( 6 //Cuando se realizara : room_type = Habitacion de estudio 7 ':input[name="room_type"]' => array('value' => t('Habitación de 8 estudio')).158 159 160 161 162 Observe la sintaxis de cómo se ha definido el parámetro #states : 1 $form['study_room'] = array( 2 '#type' => 'fieldset'. 9 ).

Sign up to vote on this title
UsefulNot useful