Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/07/2016, 12:43
jeremiselxi
(Desactivado)
 
Fecha de Ingreso: septiembre-2008
Mensajes: 269
Antigüedad: 15 años, 7 meses
Puntos: 22
Respuesta: Usar un tableselect con ajax en D7

Clonar_Materias_de_Curso.module
1era parte.
Código PHP:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * Implementacion hook_menu().
  5.  */
  6.  
  7.  //Implementamos el hook menu
  8.  function Clonar_Materias_de_Curso_menu(){
  9.  
  10.  $items['Clonar_Materias_de_Curso'] = array(
  11.  'title' => 'Clonar las materias de un curso.',
  12.  'page callback' => 'drupal_get_form',
  13.  'page arguments' => array('Clonar_Materias_de_Curso_form'),
  14.  'access arguments' => array('access argument_Clonar las materias de un curso.'), //Mediante este enlace puedo crear un hook_permission para luego restringir en los permisos este acceso.
  15.  'type' => MENU_NORMAL_ITEM
  16.  );
  17.  return $items;
  18.  };
  19.  
  20. /**
  21. * Implements hook_permission().
  22. */
  23. function Clonar_Materias_de_Curso_permission() {
  24. return array(
  25. 'access argument_Clonar las materias de un curso.' => array(
  26. 'title' => t('Clonar las materias de un curso.'),
  27. 'restrict access' => true,
  28. )
  29. );
  30. }
  31.  
  32. //Esta función permite crear una pagina con el form api.
  33. function Clonar_Materias_de_Curso_form($form, $form_state){
  34. // Fieldset 1.
  35. //************
  36. // Lo primero que creamos es un fieldset (contenedor) donde agregar los campos.
  37.  $form['cursos_a_clonar_fieldset'] = array(
  38.  '#title' => t('Clonar las materias de un curso.'),
  39.  '#type' => 'fieldset',
  40.  '#description' => t('Favor elegir el curso que contiene las materias.'),
  41.  '#collapsible' => FALSE, //Este permite que se pueda colapsar si esta en true
  42.  '#collapsed' => FALSE,  //Este es para que aparezca colapsado si esta en true.
  43.  );
  44. //Creamos un campo llamado curso dentro del contenedor el cual en la opcion #options llamamos una función donde obtiene los cursos.
  45.  $form['cursos_a_clonar_fieldset']['Curso'] = array(
  46.  '#type' => 'select',
  47. // '#title' => 'Elija el curso a clonar',
  48.  '#options' => obtener_cursos_opciones(),
  49.   '#default_value' => 0 ,
  50.   '#ajax' => array(
  51.   'callback' => 'buscar_materias_de_cursos_callback',//Esta es la función que llamara por ajax
  52.   'wrapper' => 'ajax-buscar_materias_de_cursos',//Aquí es donde meterá los datos
  53.   'method' => 'replace',
  54.   'effect' => 'fade',//Un efectito chulo
  55.   ),
  56.  );
  57.  
  58. // fin Fieldset 1.
  59. //************
  60. // Fieldset 2.
  61. //************
  62. //crearemos otro fieldset o contenedor donde estarán todas las materias que estén asociadas a un curso.
  63.  
  64.  $form['cursos_a_clonar_fieldset']['materiascontenedor'] = array(
  65.  '#title' => t('Seleccione las materias que desea clonar'),
  66.  '#type' => 'fieldset',
  67. // '#description' => t('Favor elegir el curso que contiene las materias a clonar.'),
  68.  '#collapsible' => FALSE, //Este permite que se pueda colapsar si esta en true
  69.  '#collapsed' => FALSE,  //Este es para que aparezca colapsado si esta en true.
  70.     //Encapsulamos el select dentro del div 'dropdown_modelos_replace' para poder reemplazarlo
  71.        //usando ajax.
  72.       '#prefix' => '<div id="ajax-buscar_materias_de_cursos">',
  73.       '#suffix' => '</div>',
  74.  );
  75.  
  76. // En esta sección creamos el tableselect.
  77.  
  78.   $header = array(
  79.     'nid' => t('Nid'),
  80.     'title' => t('Materias'),
  81.   );
  82.  
  83. //Verificamos si está definida el valor del curso primero,
  84. //si no está definido entonces le agregamos el valor 0  a la variable $valor_del_curso_inicial
  85. //de lo contrario entonces le pasamos el valor de este a la variable $valor_del_curso_inicial
  86. if  (!isset($form_state['values']['Curso'])) {
  87. $valor_del_curso_inicial=0;
  88. }
  89. else {
  90.  
  91. $valor_del_curso_inicial=$form_state['values']['Curso'];
  92. }
  93.  
  94. //creamos el tableselect dentro de los dos contenedores.
  95.     $form['cursos_a_clonar_fieldset']['materiascontenedor']['materias_select'] = array(
  96.       '#type' => 'tableselect',
  97.       '#header' => $header,
  98.       '#options' => obtener_materias_opciones($valor_del_curso_inicial),
  99.       '#multiple' => TRUE,   //Si esta en true, entonces se convierte en Chekbox y si esta en false entonces se convierte en radio
  100.       '#empty' => t('No existen materias para este curso.'),
  101.       '#validated' => TRUE,  // si no se pone este validated da error al cambiar los valores.
  102.        //Encapsulamos el select dentro del div 'dropdown_modelos_replace' para poder reemplazarlo
  103.        //usando ajax.
  104. //      '#prefix' => '<div id="ajax-buscar_materias_de_cursos">',
  105. //      '#suffix' => '</div>',
  106.  
  107.       );
  108.  //************
  109.  
  110. // fin Fieldset 2
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117. // Fieldset 3
  118. //************
  119.  
  120. //crearemos otro fieldset o contenedor donde estarán todas las materias que estén asociadas a un curso.
  121.  
  122.  $form['cursos_a_clonar_fieldset']['cursoscontenedor'] = array(
  123.  '#title' => t('Por favor seleccione los cursos que se le asignaran las materias.'),
  124.  '#type' => 'fieldset',
  125. // '#description' => t('Favor elegir el curso que contiene las materias a clonar.'),
  126.  '#collapsible' => FALSE, //Este permite que se pueda colapsar si esta en true
  127.  '#collapsed' => FALSE,  //Este es para que aparezca colapsado si esta en true.
  128.     //Encapsulamos el select dentro del div 'dropdown_modelos_replace' para poder reemplazarlo
  129.  
  130.  
  131.  );
  132.  
  133.  
  134.  
  135.  
  136. // En esta sección creamos el tableselect.
  137.  
  138.   $header = array(
  139.     'nid' => t('Nid'),
  140.     'title' => t('Cursos'),
  141.   );
  142.  
  143.  
  144.  
  145. //creamos el tableselect dentro de los dos contenedores.
  146.     $form['cursos_a_clonar_fieldset']['cursoscontenedor']['curso_select'] = array(
  147.       '#type' => 'tableselect',
  148.       '#header' => $header,
  149.       '#options' => obtener_cursos_opciones_tableselect(),
  150.       '#multiple' => TRUE,   //Si esta en true, entonces se convierte en Chekbox y si esta en false entonces se convierte en radio
  151.       '#empty' => t('No existen materias para este curso.'),
  152.       '#validated' => TRUE,  // si no se pone este validated da error al cambiar los valores.
  153.  
  154.  
  155.       );
  156.  //************
  157.  
  158. // fin Fieldset 3
  159.  
  160.  
  161.  
  162. //Mediante la siguiente linea se llama a una funcion para validar el formulario.
  163. //$form['#validate'][] = 'form_validate';
  164.  
  165.  
  166. //Creamos un botón el cual realizará varias funciones.
  167.     $form['cursos_a_clonar_fieldset']['submit'] = array(
  168.       '#type' => 'submit',
  169.       '#value' => t('Ejecutar'),
  170.       '#submit' => array('CrearClon'),
  171.       );
  172.  
  173. return $form;
  174. }