Creación de un módulo Drupal
Atención: Este artículo se ha copiado de la web de MagMax(que es su autor). Es posible que sufra cambios. Podéis encontrar la última versión de este artículo en su ubicación original. Muchas gracias.Hoy vamos a ver cómo crear un módulo drupal sencillito. Como ejemplo vamos a escribir nuestro propio módulo, algo que sea útil: un "feedback". En este tutorial nos vamos a centrar en drupal 6. Para usar otro drupal, basta mirarse la API de cada función. Tras probar varios, para la edición recomiendo kate.
Directorios y ficheros
Los módulos deben colgar a partir de la ruta /etc/drupal/6/sites/default/modules. Allí crearemos un directorio con el nombre de nuestro módulo. En este caso, "feedback": /etc/drupal/6/sites/default/modules/feedback. Será en este directorio donde vayan nuestros ficheros. Para el ejemplo, tan sólo vamos a crear 3 ficheros: feedback.info, feedback.module y feedback.install. El primero de los ficheros sirve para decirle a drupal de qué va nuestro módulo; el segundo contendrá toda la lógica; y el tercero servirá para crear la base de datos.Diciéndole a Drupal que estamos aquí
Crearemos el archivo feedback.info. Su contenido es el siguiente:; $Id$
name = "Feedback"
description = "Proporciona un formulario para solicitar mejoras."
core = 6.x
Creación de la base de datos
Suele ser buena política comenzar los nombres de las tablas con el nombre del módulo; así nos aseguramos que no se van a chocar con otros módulos. Así, vamos a crear la tabla "feedback_messages", para lo que crearemos el fichero feedback.install:<?php
function feedback_schema ()
{
$schema['feedback_messages'] = array
(
'description' => t('Tabla para mensajes de retroalimentacion'),
'fields' => array
(
'id' => array
(
'description' => t('Identificador de mensaje'),
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'uid' => array
(
'description' => t('Identificador del usuario que realiza el feedback'),
'type' => 'int',
'unsigned' => TRUE,
'not null' => FALSE,
),
'message' => array
(
'description' => t('Mensaje de feedback'),
'type' => 'text',
'not null' => TRUE,
),
'indate' => array
(
'description' => t('Fecha en la que se crea el comentario'),
'type' => 'datetime',
'not null' => TRUE,
),
),
'primary key' => array('id'),
);
return $schema;
}
function feedback_install() {
// Create my tables.
drupal_install_schema('feedback');
}
function feedback_uninstall() {
// Drop my tables.
drupal_uninstall_schema('feedback');
}
?>
Creación de la lógica
Ahora vamos con lo más difícil: La lógica del módulo. Una norma básica: Todas las funciones de nuestro módulo deben comenzar por el nombre de nuestro módulo. Si queremos crear una función estática (invisible desde fuera), antecederemos una barra baja ('_'). En la documentación veremos muchas referencias a "hook". No es el Capitán Garfio... Son funciones que Drupal espera encontrar en nuestro código (aunque no todas son obligatorias), es decir: puntos de entrada a nuestro módulo. Veamos un ejemplo de hook: hook_help. Así, de paso, proporcionamos un poco de ayuda a nuestro módulo.<?php
/**
* Implements hook_help().
*/
function feedback_help ( $path, $arg )
{
$output=''; // para construir la salida
switch ( path )
{
case 'admin/help#feedback':
$output .= '<p>' . t('Módulo que permite la inserción de mensajes de feedback.') . '</p>';
break;
}
return $output;
}
?>
Permisos
Veamos ahora quién puede usar nuestro módulo. Por un lado, queremos que cualquier usuario pueda rellenar un formulario, que será lo que después veremos desde un usuario administrador. Así que tenemos dos tipos de permiso: "send message" y "view message". El primero será útil por si sólo queremos el feedback de usuarios autenticados. Pensad que luego tendremos que asignar estos permisos a algunos roles. El nombre de los permisos puede coincidir con otros, pero no creo que pase nada, porque van identificados contra nuestro módulo (es posible que exista alguno especial para ver si se tienen privilegios de administrador, etc.). Para crear los permisos, tenemos otro hook, el hook_perm:<?php
/**
* Implements hook_perm().
*/
function feedback_perm ()
{
return array ('send message', 'view messages');
}
?>
Bloques
Nuestro módulo aún no hace nada. Ahora vamos a declarar dos bloques: Uno para que el Administrador del sitio pueda colocar donde quiera un enlace al formulario (que luego crearemos) y otro para que el Administrador pueda decidir quién y dónde pude verse si hay algún mensaje o no. La función hook_block (seguro que ya os lo esperábais) tiene tres parámetros:- $op, que puede valer "list", "view", "save" o "configure", dependiendo de la operación solicitada. En nuestro caso, como vamos a lo fácil, sólo contemplaremos "list" y "view".
- $delta, que sirve para identificar el identificador de bloque.
- $edit, usado para la operación "save", por lo que nos olvidamos de él.
<?php
/**
* Implementation of hook_block().
*/
function feedback_block ( $op = 'list', $delta = 0, $edit = array() )
{
if ( $op == "list")
{
$blocks = array();
$blocks[0]["info"] = t('Feedback');
$blocks[1]["info"] = t('New Feedbacks');
return $blocks;
}
else if ( $op == "view" )
{
$content = '';
$block = array();
switch ( $delta )
{
case 0:
$block['subject'] = t('Feedback');
$options = array( "attributes" => array("title" => t("Sends a feedback message") ) );
$link = l( t("New Feedback"), "feedback/message", $options );
$content .= '<div class="link">' . $link . "</div>";
break;
case 1:
$block['subject'] = t('Feedback Messages');
$options = array( "attributes" => array("title" => t("Shows feedback messages") ) );
$title = t("There are @total new feeds", array ( '@total' => _feedback_count() ) );
$link = l( $title , "feedback/adminmessages", $options );
$content .= '<div class="link">' . $link . "</div>";
break;
}
$block['content'] = $content;
return $block;
}
}
?>
<?php
/** Devuelve el número de feeds creados en la última semana
*/
function _feedback_count ()
{
$query = "SELECT count(id) as total from {feedback_messages} where datediff( now(), indate ) < 7";
$queryResult = db_query ( $query );
$result = db_fetch_object ( $queryResult ) ;
return $result->total;
}
?>
Probando que no os engaño
Si todo está en su sitio, deberíamos poder ver los módulos. Vamos a Drupal, Administer->Site Building->Modules, buscamos nuestro modulito, que estará en la sección "others" (sección por defecto, ya que no hemos establecido un "package" en el .info) y lo activamos. Guardamos la configuración. ¡¡ Y ya está funcionando !! ... ¿Que no veis nada? ¡Pues claro que no! Vamos con los bloques: Administer->Site Building->Blocks, buscamos "New Feedbacks" y "Feedback" y los colocamos en algún sitio, por ejemplo en la "Right sidebar", y guardamos. Tachaaaaaaan!!! Si no hemos hecho algo mal (vosotros o yo), deberíais ver vuestros dos fabulosos bloques.Manejando direcciones
En el apartado anterior nos dejamos pendiente el manejo de direcciones. Para esto hay otro hook, el hook_menu:<?php
/**
* Implementation of hook_menu().
*/
function feedback_menu ( )
{
$items = array();
$items['feedback/message'] = array
(
'title' => t('Feedback'),
'page callback' => 'feedback_message',
'access arguments' => array('send message'),
'type' => MENU_CALLBACK,
);
$items['feedback/adminmessages'] = array
(
'title' => t('Feedback Admin'),
'page callback' => 'feedback_admin',
'access arguments' => array('view messages'),
'type' => MENU_CALLBACK,
);
return $items;
}
?>
Creación de un formulario
Vamos con el formulario de inserción de un feed. Comenzamos por la función que nos dejamos pendiente:<?php
function feedback_message ()
{
$content = '';
$content .= drupal_get_form ( 'feedback_message_form' );
return $content;
}
?>
<?php
function feedback_message_form ()
{
$form = array
(
'feedback' => array
(
'#type' => 'fieldset',
'#title' => t( 'Feedback' ),
'message' => array ( '#type' => 'textarea', "#description"=>"Write here your message" ),
'submit' => array ( '#type' => 'submit', '#value' => t('Submit'), ),
),
);
return $form;
}
function feedback_message_form_validate ( $form, &$form_state )
{
$message = $form_state['values']['message'];
if ( $message == '' )
form_set_error( $form, t('Message cannot be empty.'));
}
function feedback_message_form_submit ( $form, &$form_state )
{
global $user;
$userid = NULL;
if ( $user )
$userid = $user->uid;
$message = $form_state['values']['message'];
$query = "INSERT into {feedback_messages} ( uid, message, indate ) values ( %d, '%s', now() ) ";
$queryResult = db_query ( $query, $userid, $message );
if ( db_affected_rows() )
drupal_set_message ( t ( "Thank you for your feedback." ) );
else
form_set_error ( $form, t( "An error has happened. Your feedback has not been sent." ) );
}
?>
Tablas
Vamos a hacer algo muy cutre: una tabla enorme con todos los feeds. Por no ser tan sumamente cutres, haremos que sea ordenable si pinchamos en las cabeceras :D<?php
function feedback_admin ()
{
$content = '';
$header = array
(
array('data' => t('Date'), 'field' => 'indate', 'sort' => 'desc'),
array('data' => t('User'), 'field' => 'name'),
array('data' => t('Message'), 'field' => 'message'),
);
$query = "SELECT u.name, fm.indate, fm.message FROM {feedback_messages} fm, {users} u WHERE fm.uid=u.uid";
$queryResult = db_query ( $query );
$rows = array ();
while ( $message = db_fetch_object ( $queryResult ) )
{
$row = array ();
$row['name'] = $message->name;
$row['indate'] = $message->indate;
$row['message'] = $message->message;
$rows[] = $row;
}
$content .= theme_table($header, $rows);
return $content;
}
?>
Enlaces
Creación de módulos para drupal Escribir ficheros .info Tipos de datos para el .installLicencia
Este documento se puede distribuir bajo licencia FDL y el código bajo licencia GPL v3 o posterior, a su elección.Y fin
Espero que lo encontréis útil. Para problemas, errores, unas pizzas: http://magmax.org [ show comments ]
blog comments powered by Disqus