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>";
?>
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.
Hola! no se si será eso lo que quieres hacer, pero para tipos de datos complejos en lugar de esto podrías usar CCK y si lo que quieres es meter datos extras en el perfil del usuario usa PROFILE. Ambos módulos son muy sencillos de usar.
He encontrado esta web buscando otra movida, pero me ha gustado mucho y la añado a mis bookmarks...
Y funciona perfectamente !!
Muchas Gracias
Necesitaba un formulario muy similar, y funcionó a la primera
muchas gracias
Busqué bastante y tu tema fue uno de los más sencillos, sin embargo yo soy muy nuevo como " web'master' " y bueno, cree las 'pages' en la primera no hay problema, pero la segunda me tira el sgte error:
user warning: Table 'jcom_drpl1.mis_inscritos' doesn't exist query: SELECT * FROM mis_inscritos in /home/jcom/public_html/web/includes/database.mysql.inc on line 172.
y dp cuando pongo los datos en la primera y pongo "inscribirse":
user warning: Table 'jcom_drpl1.mis_inscritos' doesn't exist query: INSERT INTO mis_inscritos VALUES ('','juanca','nakar','grupoa','dds') in /home/jcom/public_html/web/includes/database.mysql.inc on line 172.
quizás me puedes ayudar con eso, ya que me sería util, uso drupal 51 gracias de antemano.
Muy bueno el tuto, lo hice sin ningun problema, excepto la linea que dice :
db_query("INSERT INTO mis_inscritos VALUES ('','$form_values[piloto]','$form_values[coche]','$form_values[grupo]','$form_values[club]')");
Debe ser:
db_query("INSERT INTO mis_inscritos VALUES (null,'$form_values[piloto]','$form_values[coche]','$form_values[grupo]','$form_values[club]')");
Y todo salio perfecto me registra en la tabla y luego hago un listado me sale ok.
Pero como podria hacer para poder eliminar y modificar un registro, seleccionando cualquiera de la tabla listada.
Saludos
Bueno todo lo que esta en esta pagina, lo probe y me fue de maravilla, pero ahora despues de hacer esto como puedo recuperar los datos de la tabla mis_inscritos y colocarlo en sus respectivos objetos, es decir, el nombre del piloto, coche, grupo y club de tal manera poder modificarlos y luego Actualizarlos en sus respectivos campos.
Saludos
Gracias
Muy bueno. Llevo un rato mirando API's y ejemplos, y creo que este es el único que me ha funcionado bien con Drupal 6.2. Thnx!
Saludos ^^


