Foros del Web » Creando para Internet » Sistemas de gestión de contenidos » Drupal »

[SOLUCIONADO] Usar un tableselect con ajax en D7

Estas en el tema de Usar un tableselect con ajax en D7 en el foro de Drupal en Foros del Web. Buenas tardes. Como he aprendido mucho en este foro, hoy quiero hacer un aporte mostrando el uso de un tableselect en Drupal7. Lo primero es ...
  #1 (permalink)  
Antiguo 15/07/2016, 12:39
(Desactivado)
 
Fecha de Ingreso: septiembre-2008
Mensajes: 269
Antigüedad: 15 años, 7 meses
Puntos: 22
Usar un tableselect con ajax en D7

Buenas tardes.

Como he aprendido mucho en este foro, hoy quiero hacer un aporte mostrando el uso de un tableselect en Drupal7.

Lo primero es que creé dos tipos de contenidos uno llamado "cursos" y otro tipo de contenido llamado "crear_materias". Este último tiene un campo referenciado al nodo curso llamado "field_materia_curso_asignado".

Luego de esto vamos al código:

Cree una carpeta llamada Clonar_Materias_de_Curso.

Dentro creé un archivo llamado Clonar_Materias_de_Curso.info.

Código PHP:
Ver original
  1. name = Clonar_Materias_de_Curso
  2. description = Modulo pensado en clonar las materias que tiene un curso para poder asignarlo a todos los cursos.
  3. core = 7.x
  4. version = "7.x-1.0-dev"
  5. package = Jhonatan
Dentro creé un archivo llamado Clonar_Materias_de_Curso.module.
Descripción de qué hará este módulo.
Aparecerá un campo en lista mostrando todos los contenidos tipo cursos y al seleccionar uno de estos cursos, se realizará una llamada ajax el cual verificará si existen contenidos tipo crear_materias referenciado al curso que hemos seleccionado y si no existe, mostrará un mensaje que No existen materias para este curso.

En este sentido, si seleccionamos un curso que ya tiene materias referenciadas, nos aparecerán todas estas materias con el check para seleccionarla. Posteriormente más abajo aparecerá otro tableselect con todos los cursos también, con la finalidad de poder decirle al sistema que las materias que estamos seleccionado, se clonarán en los cursos que elijamos al final.
Al presionar el botón, se crearán nodos referenciados a los cursos seleccionados.
Vamos a explicar por parte cada sección del módulo.
Clonar_Materias_de_Curso.module.
  #2 (permalink)  
Antiguo 15/07/2016, 12:43
(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. }
  #3 (permalink)  
Antiguo 15/07/2016, 12:44
(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

2da parte
Código PHP:
Ver original
  1. //validamos los campos que queremos.
  2.  
  3. function form_validate($form, &$form_state) {
  4.  
  5.   if ($form_state['values']['Curso'] == 0) {
  6.  
  7.  
  8.     form_set_error('Curso', t('Debe seleccionar un curso'));
  9.  
  10.   }
  11.  
  12. }
  13.  
  14.  
  15.  
  16.  
  17. //Esta función llama el campo cursos a través de ajax.
  18. function buscar_materias_de_cursos_callback ($form, &$form_state) {
  19.  
  20. //Eliminamos las opciones que tiene actualmente el tableselect
  21. unset($form['cursos_a_clonar_fieldset']['materiascontenedor']['materias_select']['#options']);
  22.  
  23.  
  24.  
  25. //Verificamos si está definida el valor del curso primero,
  26. //si no está definido entonces le agregamos el valor 0  a la variable $valor_del_curso_inicial
  27. //de lo contrario entonces le pasamos el valor de este a la variable $valor_del_curso_inicial
  28. if  (!isset($form_state['values']['Curso'])) {
  29. $valor_del_curso_inicial=0;
  30. }
  31. else {
  32. $valor_del_curso_inicial=$form_state['values']['Curso'];
  33. }
  34.  
  35.  
  36. //le indicamos que busque los nuevos valores a través de la función obtener_materias_opciones pasándole la variable $valor_del_curso_inicial
  37. $form['cursos_a_clonar_fieldset']['materiascontenedor']['materias_select']['#options']= obtener_materias_opciones($valor_del_curso_inicial);
  38.  
  39. return $form['cursos_a_clonar_fieldset']['materiascontenedor'];
  40.  
  41. }
  42.  
  43. function obtener_materias_opciones($nid_materias) {
  44.  //Buscamos en la api el codigo insertado
  45.  
  46.   $sql = db_query("select n.nid, n.title, n.type, f.bundle, f.entity_id, f.field_materia_curso_asignado_nid from node n inner join field_data_field_materia_curso_asignado f on n.nid = f.entity_id where f.field_materia_curso_asignado_nid= '".$nid_materias."' order by n.title asc ");  
  47.  
  48.   $result = db_query($sql);
  49.  
  50.   $rows = array();
  51.   foreach ($result as $dbrow) {
  52.     $rows[$dbrow->nid] = array(
  53.     'nid' => $dbrow->nid,
  54.     'title' => $dbrow->title,
  55.      );
  56.    }
  57.  
  58.  
  59. return $rows;
  60. }
  61.  
  62. //funcion para obtener los cursos.
  63.  function obtener_cursos_opciones(){
  64.   $result = db_query("SELECT nid, title FROM node where type='cursos' order by title asc");
  65.   $curso=array('');
  66.  
  67.   foreach ($result  as $result) {
  68.     $curso[$result->nid] = $result->title;
  69.  
  70.   }
  71.   return $curso;
  72. };
  73.  
  74.  
  75.  
  76.  
  77. function obtener_cursos_opciones_tableselect() {
  78.  //Buscamos en la api el codigo insertado
  79.  
  80.   $sql = db_query("select n.nid, n.title from node n where n.type= 'cursos' order by title asc ");  
  81.  
  82.   $result = db_query($sql);
  83.  
  84.   $rows = array();
  85.   foreach ($result as $dbrow) {
  86.     $rows[$dbrow->nid] = array(
  87.  
  88.     'nid' => $dbrow->nid,
  89.     'title' => $dbrow->title,
  90.      );
  91.    }
  92.  
  93.  
  94. return $rows;
  95. }
  #4 (permalink)  
Antiguo 15/07/2016, 12:45
(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

Última parte.
Código PHP:
Ver original
  1. //Mediante esta función realizamos la clonación.
  2. function CrearClon($form, $form_state) {
  3.  
  4.   //Mediante esta función obtenemos todos los valores que seleccionamos en el campo curso_select
  5.   foreach ( $form['cursos_a_clonar_fieldset']['cursoscontenedor']['curso_select']['#value'] as $valores_cursos_select) {
  6.  
  7.   $node_curso = node_load($valores_cursos_select);
  8.    
  9.       foreach ($form['cursos_a_clonar_fieldset']['materiascontenedor']['materias_select']['#value'] as $valores_materias_select) {
  10.                
  11.  
  12.           $node_materia = node_load($valores_materias_select);
  13.        
  14.           global $user;
  15.           $newNode = new stdClass();
  16.           $newNode->type = 'crear_materias';
  17.           node_object_prepare($newNode);
  18.            
  19.           $newNode->created = strtotime("now");
  20.           $newNode->changed = strtotime("now");
  21.           $newNode->status = 1;
  22.           $newNode->comment = 0;
  23.           $newNode->promote = 0;
  24.           $newNode->moderate = 0;
  25.           $newNode->sticky = 0;
  26.           $newNode->language = 'es';
  27.           $newNode->uid = $user->uid;
  28.           //campos customizados.
  29.           $newNode->field_materia_descripcion['und'][0]  = $node_materia->field_materia_descripcion['und'][0];
  30.        
  31.           $newNode->field_materia_curso_asignado['und'][0]['nid'] = $node_curso->nid;
  32.          
  33.           $newNode->field_materia_tanda['und'][0]['value'] =   $node_curso->field_curso_tanda['und'][0]['value'];
  34.          
  35.           $titulo_del_nodo= $newNode->field_materia_descripcion['und'][0]['value']. ' - ' .$node_curso->title;
  36.  
  37.                   $node_title_exist=validate_nodetitle_exist($titulo_del_nodo);
  38.  
  39.                   if ($node_title_exist==0) {
  40.                      
  41.                                                   node_save($newNode);
  42.  
  43.                   }
  44.  
  45.           else{
  46.                                
  47. unset($newNode);           }
  48.          
  49.  
  50.     }  
  51.  
  52.   }
  53.  
  54. drupal_set_message('Ejecucion realizada correctamente.');
  55.  
  56. }

Etiquetas: ajax, contenidos, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:06.