Crear CheckBox dinamicos mediante un Query en Drupal 7

Events happening in the community are now at Drupal community events on www.drupal.org.
jhonatanfdez's picture

Buenas tardes. Tal como indica el titulo estoy necesitando crear checkbox dinámicos al momento de diseñar una busqueda en un formulario que estoy diseñando.

Este es el codigo que estoy utilizando

Código PHP:
<?php

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

/**
* Implementacion 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;
};

/**
* Definir el formulario.
*/
function formexample_nameform(){

        /**
        * Función diseñada para obtener todos los cursos y los nid de los cursos
        **/
        function formexample_cursos() { 
          $result = db_query("SELECT title, nid FROM {node} where type = 'cursos'"); 

          foreach ($result  as $result) { 
            $i= $result->nid; 
            $nombre_cursos[$i] = $result->title; 

          } 
           return $nombre_cursos; 
        }; 

//Se define el fieldset(Contenedor) llamado Curso

$form['cursos'] = array(
'#title' => t('Elegie los estudiantes del Curso'),
'#type' => 'fieldset',
'#description' => t('Información sobre los Cursos'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);

//Se define el combobox en el cual contiene todos los nodos tipo Cursos así como tambien los nid de dichos nodos.

$form['cursos_options'] = array(
'#type' => 'value',
'#value' => formexample_cursos(),
);
$form['cursos']['nombres_de_cursos'] = array(
'#title' => t('Busca el Curso'),
'#type' => 'select',
'#description' => t('Por favor selecciona un Curso'),
'#options' => $form['cursos_options']['#value'],
);

// Campo utilizado para proporcionar la busqueda

$form['cursos']['obtener_id_nodo'] = array(
'#title' => '',
'#type' => 'textfield',
'#default_value' => variable_get('obtener_id_nodo', '0'),
'#access' => false,
);

$form['cursos']['submit'] = array(
'#type' => 'submit',
'#value' => t('Buscar Alumnos '),
);

function prueba () {
drupal_set_message(t('Prueba')) ;
}

$form['Cambiar de cursos'] = array(
'#type' => 'submit',
'#value' => t('Cambiar de Cursos'),
'#submit' => array('prueba'),

);

$form['SegundaSeccion'] = array(
'#title' => t('Resultados de los estudiantes'),
'#type' => 'fieldset',
'#description' => t('Resultado de Estudiantes'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
);

//Campo utilizado para mostrar los resultados de la busqueda
$form['SegundaSeccion']['results'] = array(
'#type' => 'item',
'#title' => t('Resultados de su busqueda'),
'#markup' => busqueda_alumnos(), // Vea que usé markup en lugar de value.
);

return $form;
}

/**
* Validate the form.
*/

function formexample_nameform_validate(&$form, &$form_state){
$cursos_key = $form_state['values']['nombres_de_cursos'];
$cursos = $form_state['values']['cursos_options'][$cursos_key];
if (trim($form_state['values']['obtener_id_nodo']) == '') {
form_set_error('obtener_id_nodo', 'Error en la busqueda. Intentelo mas tarde.');
}

}

/**
* Handle post_validate form submission.
*/

function formexample_nameform_submit(&$form, &$form_state){

$cursos_key = $form_state['values']['nombres_de_cursos'];
$cursos = $form_state['values']['cursos_options'][$cursos_key];

variable_set('obtener_id_nodo', $cursos_key);

drupal_set_message(t('El curso es %cursos y el id es %idcurso y %jeremi',array('%cursos' => $cursos, '%idcurso' => $cursos_key, '%jeremi' => variable_get('obtener_id_nodo'))));

}

/**
*funcion que conecta base de datos externa y genera la listo o resultado
*/

function busqueda_alumnos()
{

$output='';

db_set_active('sinergias');

//se obtiene el id del nodo y se pasa a la variable $nid

$nid= variable_get('obtener_id_nodo');

$sql = "SELECT users.uid uid, users.name name, field_data_field_profile_mi_curso_actual_es.field_profile_mi_curso_actual_es_nid nid, node.title title
FROM node INNER JOIN (field_data_field_profile_mi_curso_actual_es INNER JOIN (profile INNER JOIN users ON profile.uid = users.uid) ON
field_data_field_profile_mi_curso_actual_es.entity_id = profile.pid) ON
node.nid = field_data_field_profile_mi_curso_actual_es.field_profile_mi_curso_actual_es_nid where nid = '$nid'";

$result = db_query($sql);

db_set_active('default');

$header = array('UID', 'NAME','NID', 'TITLE' );
$data = array();

foreach ($result as $row)
{
$data[] = array($row->uid, $row->name, $row->nid, $row->title);
}
$output = theme('table', array('header' => $header, 'rows' => $data ));

return $output;

}

lo que deseo es que en la parte del código donde muestro los resultados

Código PHP:

$header = array('UID', 'NAME','NID', 'TITLE' );
$data = array();

foreach ($result as $row)
{
$data[] = array($row->uid, $row->name, $row->nid, $row->title);
}
$output = theme('table', array('header' => $header, 'rows' => $data ));

return $output;
en ves de que de que muestre el campo $row->uid me muestre un checkbox pero que en el valor tenga el uid del usuario. Espero haberme explicado bien.

Saludos

Comments

Tu post es algo confuso.

jackbravo's picture

Tu post es algo confuso. Primero creo que deberías indicar bien lo que quieres lograr. Nada más viendo código es medio difícil.

Ve si puedes formatear también mejor tu pregunta. El código PHP en teoría se debería de ver con colores para leerlo más fácil

<?php
$result
= db_query('SELECT * FROM {node} LIMIT 10');
foreach (
$result as $obj) {
 
// do something
}
?>

Gracias por responder tan

jhonatanfdez's picture

Gracias por responder tan rapido.

Explicaré mas detallado lo que quiero.

Yo estoy diseñando una página para un colegio.

Agregué un tipo de contenido llamado curso y agregué varios cursos.

Agregué un campo con el modulo profile2 llamado curso_actual en el cual se enlaza a los contenidos tipo curso.

En este sentido, estoy diseñando un módulo el cual busca todos los alumnos y necesito seleccionar algunos alumnos en especifico y para esto necesito diseñar un query el cual me genere por cada usuario un checkbox para poder seleccionar al alumno que deseo.

En este sentido diseñé una función que llene un combobox con todos los cursos para poder realizar la busqueda de aquellos alumnos que en el campo curso_actual tenga un curso.

la funcion es la siguiente:

<?php
function formexample_cursos() {
          
$result = db_query("SELECT title, nid FROM {node} where type = 'cursos'");

           foreach (
$result  as $result) {
            
$i= $result->nid;
             
$nombre_cursos[$i] = $result->title;

            }
              return
$nombre_cursos;
         };
        
?>

El combobox con los cursos es el siguiente:

<?php
$form
['cursos_options'] = array(
'#type' => 'value',
'#value' => formexample_cursos(),
);
$form['cursos']['nombres_de_cursos'] = array(
'#title' => t('Busca el Curso'),
'#type' => 'select',
'#description' => t('Por favor selecciona un Curso'),
'#options' => $form['cursos_options']['#value'],
);

?>

Utilizo este campo para poder pasarle el nodo id del curso

<?php
// Campo utilizado para proporcionar la busqueda

 
$form['cursos']['obtener_id_nodo'] = array(
   
'#title' => ''
   
'#type' => 'textfield',
   
'#default_value' => variable_get('obtener_id_nodo', '0'),
 
'#access' => false,   
  );
?>

Utilizo este campo para mostrar el resultado de la busqueda del query que diseñé

<?php
//Campo utilizado para mostrar los resultados de la busqueda
$form['SegundaSeccion']['results'] = array(
   
'#type' => 'item',
   
'#title' => t('Resultados de su busqueda'),
   
'#markup' => busqueda_alumnos(), // Vea que usé markup en lugar de value.
 
);
?>

En la siguiente función donde se realiza el submit por medio del codigo

variable_set('obtener_id_nodo', $cursos_key);

le paso el código del id del nodo a la variable obtener_id_nodo

<?php
function formexample_nameform_submit(&$form, &$form_state){



$cursos_key = $form_state['values']['nombres_de_cursos'];
$cursos = $form_state['values']['cursos_options'][$cursos_key];


 
variable_set('obtener_id_nodo', $cursos_key);
?>

Diseñé una función llamada busqueda_alumnos() la cual me permite realizar la busqueda de aquellos alumnos donde concuerde el curso.

<?php
function busqueda_alumnos()
{

$output='';

db_set_active('sinergias');

//se obtiene el id del nodo y se pasa a la variable $nid

$nid= variable_get('obtener_id_nodo');

$sql = "SELECT users.uid uid, users.name name, field_data_field_profile_mi_curso_actual_es.field_profile_mi_curso_actual_es_nid nid, node.title title
FROM node INNER JOIN (field_data_field_profile_mi_curso_actual_es INNER JOIN (profile INNER JOIN users ON profile.uid = users.uid) ON
field_data_field_profile_mi_curso_actual_es.entity_id = profile.pid) ON
node.nid = field_data_field_profile_mi_curso_actual_es.field_profile_mi_curso_actual_es_nid where nid = '
$nid'";

$result = db_query($sql);

db_set_active('default');

$header = array('UID', 'NAME','NID', 'TITLE' );
$data = array();

foreach (
$result as $row)
{
$data[] = array($row->uid, $row->name, $row->nid, $row->title);
}
$output = theme('table', array('header' => $header, 'rows' => $data ));

return
$output;

}
?>

En la parte que estoy un poco perdido es en la parte del codigo siguiente:

<?php
foreach ($result as $row)
{
$data[] = array($row->uid, $row->name, $row->nid, $row->title);
}
$output = theme('table', array('header' => $header, 'rows' => $data ));
?>

ya que donde dice $row->uid necesito que en vez de mostrar el id del usuario, necesito que se cree un checkbox y se le agregue el valor del $row->uid para poder seleccionar al usuario que deseo.

Espero haberme explicado mejor.

Saludos.

Ok. Creo que medio entendí.

jackbravo's picture

Ok. Creo que medio entendí. Yo lo que he hecho para desplegar formas en tablas es:

  1. La forma la hago normal con todos los elementos:

<?php
foreach ($grades as $id => $grade) {
  
//...
  
$form['grade'][$id]['exempt'] = array(
    
'#type' => 'checkbox',
    
'#default_value' => $grade['exempt'],
   );
}
?>
  1. al renderear la forma uso algo como:

<?php
return render_form_as_table(drupal_get_form('my_form', $grades));
?>
  1. y en esa función hago esto para la tabla:

<?php
function render_form_as_table($form) {
 
$ids = element_children($form['grade']);
 
$header = array();
 
$header += array(
   
'name' => t('Name'),
   
'title' => t('Assignment Title'),
   
'grade' => t('Grade'),
   
'exempt' => t('Exempt'),
   
'note' => t('Note'),
   
'date' => t('Grade Date'),
  );
 
$rows = array();
  foreach (
$ids as $id) {
   
// .. other elements of the row
   
$row[] = array(
     
'data' => drupal_render($form['grade'][$id]['exempt']),
     
'class' => 'exempt-box',
    );
   
// .. other elements
   
$rows[] = array('data' => $row);
  }
 
$output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('class' => array('gradebook'))));
 
$output .= '<div>' . drupal_render($form['submit']) . drupal_render($form['cancel']) . '</div>';
 
$output .= drupal_render_children($form);
 
$variables['element'] = $form;
 
$variables['element']['#children'] = $output;
  return
theme_form($variables);
}
?>

Latin America

Group categories

Latin America

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: