Jugando con Drupal: datos externos

Es posible que no siempre Drupal cumpla nuestras expectativas y queramos almacenar datos extra en una estructura distinta a la que viene de casa. Un ejemplo práctico sería un formulario de inscripciones. Supongamos que a la hora de organizar un evento (una competición, una carrera, una manifestación) necesitamos tener un listado de gente inscrita con cierta información extra (edad, grupo en el que se correrá, peso...). Imagino que, como siempre, habrá mil formas de resolver el problema, vamos por la más simple:

Lo primero será crear un formulario con los datos requeridos, pongamos como ejemplo una competición de Rallye, donde queremos saber como mínimo Nombre, Coche y Grupo del inscrito para la prueba:

<?php
// Creación de nuestro formulario
function test_form()
{

  $form['piloto'] = array(
    '#type' => 'textfield',
    '#title' => t('Piloto'),
    '#size' => 30,
    '#maxlength' => 64,
    '#description' => t('Nombre completo del participante'),
    '#required' => TRUE,
  );

  $form['coche'] = array(
    '#type' => 'textfield',
    '#title' => t('Coche'),
    '#size' => 30,
    '#maxlength' => 64,
    '#description' => t('Coche con el que participará'),
    '#required' => TRUE,
  );

  $form['grupo'] = array(
    '#type' => 'select',
    '#title' => t('Grupo'),
    '#default_value' => variable_get('timer', 259200),
    '#options' => array (
 '' => t('Seleccione grupo'), 
 'grupoa' => t('Grupo A'),
 'grupob' => t('Grupo B'),
 'grupoc' => t('Grupo C'),
),
    '#description' => t('Seleccione el grupo'),
    '#required' => TRUE,
  );

  $form['club'] = array(
    '#type' => 'textfield',
    '#title' => t('Club'),
    '#size' => 30,
    '#maxlength' => 64,
    '#description' => t('Club'),
    '#required' => TRUE,
  );

  $form['hidden'] = array('#type' => 'value', '#value' => 'is_it_here');
  $form['submit'] = array('#type' => 'submit', '#value' => t('Inscribirse'));
  return $form;
}

// Llamamos al render del formulario
function test_page() {
  return drupal_get_form('test_form');
}

$out = test_page();
echo $out;

// Guardamos en tabla 'mis_inscritos'
function test_form_submit($form_id, $form_values) {
  db_query("INSERT INTO mis_inscritos VALUES ('','$form_values[piloto]','$form_values[coche]','$form_values[grupo]','$form_values[club]')");
  drupal_set_message(t('Su inscripción se ha completado satisfactoriamente.'));
}
?>

Usamos la API de Drupal para crear los formularios y guardamos el envío en la tabla mis_inscritos que tiene un esquema sencillo (id, piloto, coche, grupo, club). La ejecución es correcta y comprobamos que los datos se guardan satisfactoriamente.

Una vez hemos acabado el nodo del formulario, crearemos otro nodo para el listado de inscritos. Será una página con contenido PHP y una conexión normal -siguiendo la API de Drupal- a base de datos, exponiendo los registros en una tabla:

<?php
 $result=db_query("SELECT * FROM mis_inscritos");
 echo "<table><tr>
 <td>Piloto</td>
 <td>Coche</td>
 <td>Grupo</td>
 <td>Club</td></tr>";
 while ($data = db_fetch_array($result)) 
 {
   echo "<tr>
   <td>$data[piloto]</td>
   <td>$data[coche]</td>
   <td>$data[grupo]</td>
   <td>$data[club]</td></tr>";
 }
 echo "</table>";
?&gt;

Seguro que ni es la mejor forma de maquetarlos ni la más óptima, pero solo pretende ser un ejemplo de almacenamiento y listado de datos externos en Drupal. Como siempre, mejoras son bienvenidas.

code

About the author

Óscar
has doubledaddy super powers, father of Hugo and Nico, husband of Marta, *nix user, Djangonaut and open source passionate.