Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Este tutorial est orientado a programadores que conocen PHP, que han empezado a
utilizar Drupal 7 a nivel de instalacin e interfaz de administracin, y que desean
aprender a programar sus propios mdulos. He querido empezar por el clsico Hola
Mundo para hacer el ejemplo lo ms sencillo posible conceptualmente, pero al mismo
tiempo extenderlo con variantes que permitan hacerse una idea de cmo funciona
Drupal y las posibilidades que nos ofrece.
A travs de este tutorial podrs aprender a:
Lo que hemos hecho es aadir una url al array de elementos $items, y para esa direccin
elegimos un ttulo para la pgina y la funcin que implementa el contenido, que a su vez
devuelve como contenido un Hola Mundo. Con 'access callback' definimos con qu
permisos pueden acceder a esta pgina, en este caso podrn todos los usuarios (TRUE).
Cada vez que implementamos un cambio en hook_menu() necesitamos vaciar la cach
para poder visualizar estas modificaciones. En el men de administracin pulsamos en
Configuracin, y a continuacin en Rendimiento (en el bloque de Desarrollo), donde
podremos pulsar el botn Vaciar todas las cachs. Ahora s, podemos ver nuestro
primer Hola Mundo en la direccin /saludar/hola-mundo de nuestro sitio web.
En nuestro hook_theme() estamos llamando a la plantilla (template): saludar-holamundo, para maquetar el callback: saludar_hola_mundo. Ahora solo falta crear la
plantilla en nuestro mdulo, creando un archivo con el nombre del template acabado en
.tpl.php.
saludar/saludar-hola-mundo.tpl.php
<p class="saludo"><em><?php echo $message; ?></em></p>
Vaciamos las cachs para que coja el nuevo archivo y podemos comprobar el resultado.
Como puedes ver estamos utilizando la variable message que definimos en la funcin
saludar_hola_mundo(). A partir de aqu puedes aadir nuevas variables de contenido
(por ejemplo la fecha) y modificar la plantilla para maquetar ese contenido con esas
variables.
podramos haber definido si por defecto aparece activado o no, en qu regin, con qu
peso, etc. Estas opciones las puede configurar el administrador del sitio web drupal
desde la pantalla de Bloques en el men Estructura (/admin/structure/block). All vemos
nuestro bloque, en la seccin Desactivado.
Podemos colocarlo en una regin, por ejemplo en la barra lateral, pero an no podemos
verlo porque nos falta un paso, construir el bloque con el contenido, mediante
hook_block_view():
/**
* Implementa hook_block_view().
*/
function saludar_block_view($delta = '') {
switch ($delta) {
case 'hola_mundo':
$block['content'] = saludar_hola_mundo();
return $block;
}
}
En esta funcin definimos lo que se ve en cada bloque que implementa nuestro mdulo.
La variable $delta es la que nos identifica el bloque, y para el caso 'hola_mundo'
establecemos su contenido. Nuevamente en lugar de establecer el contenido del bloque
directamente con Hola Mundo, estamos reutilizando la funcin saludar_hola_mundo()
que escribimos anteriormente para utilizar la plantilla saludar-hola-mundo.tpl.php a
travs de hook_theme().
Ahora s, si actualizamos cualquier pgina podemos ver el bloque en la barra lateral, con
el mensaje Hola Mundo, tal y como lo maquetamos en la plantilla. A este bloque no le
hemos asignado ningn ttulo, si quisiramos proporcionar uno por defecto bastara con
utilizar la variable $block['subject'] en el hook_block_view().
/**
* Valida el formulario de opciones de configuracin.
*/
function saludar_configuracion_validate($form, &$form_state) {
if (trim($form_state['values']['saludar_saludo']) == '') {
form_set_error('saludar_saludo', 'El saludo no puede quedar
vaco.');
}
}
/**
* Procesa el envo del formulario de opciones de configuracin.
*/
function saludar_configuracion_submit($form, $form_state) {
variable_set('saludar_saludo', $form_state['values']
['saludar_saludo']);
drupal_set_message("Se han guardado las opciones de
configuracin.");
}
Por ltimo la funcin define el botn de submit y la funcin que procesar el envo, y
devuelve el formulario.
Como ejemplo de validacin comprobamos que no se haya enviado una cadena vaca,
accediendo al valor del campo que recibimos del array $form_state['values']. Si hay un
error invocamos la funcin form_set_error(), definiendo el campo donde se ha
producido y el mensaje de error correspondiente.
Hemos visto que podemos controlar la validacin y el envo del formulario a travs de
estas dos funciones, pero para este ejemplo podramos hacerlo mucho ms sencillo y
ninguna de las dos seran necesarias. Por un lado la validacin de campo obligatorio se
puede implementar directamente con '#required' => TRUE. Por otro lado podemos
utilizar la funcin system_settings_form(), que aade el botn de submit, e invoca
internamente tras el envo a la funcin system_settings_form_submit(), que ya se
encarga de guardar el valor del campo en una variable con el mismo nombre que el
campo, en este caso "saludar_saludo". Simplificando el ejercicio, podramos dejar el
archivo saludar.admin.inc slo con esta funcin:
function saludar_configuracion() {
$form['saludar_saludo'] = array(
'#title' => 'Saludo que se muestra al usuario',
'#type' => 'textfield',
'#default_value' => variable_get('saludar_saludo', 'Hola Mundo'),
Ahora solo nos queda utilizar el valor de configuracin guardado para mostrarlo en el
saludo. Para hacer esto modificamos la funcin saludar_hola_mundo() del archivo
saludar.module, que quedar as:
function saludar_hola_mundo() {
$variables = array(
'message' => variable_get('saludar_saludo', 'Hola Mundo'),
);
return theme('saludar_hola_mundo', $variables);
}
Cada elemento en el array que devuelve este hook define una accin, en este caso
'saludar_usuario_action', que clasificamos de tipo usuario, su etiqueta ser Saludar al
usuario, en principio no ser configurable y estar disponible para cualquier disparador
(se puede limitar qu disparadores tendrn la accin disponible). Con esta funcin
implementada ya podemos seleccionar en la interfaz a qu disparadores queremos
asignar esta accin, por ejemplo tras iniciar sesin.
Ahora puedes comprobar que el saludo se muestra correctamente para los distintos
eventos que configures en la pgina de Disparadores, y de paso ir conocindolos y ver
cundo se ejecutan.
Por supuesto las cadenas que contienen variables, como en el ltimo ejemplo del saludo
al usuario, tambin se pueden traducir. En la cadena de texto utilizamos variables con el
smbolo @ delante, y definimos estas variables en un array como segundo parmetro de
la funcin t().
$message = t("Hola @name", array('@name' => $GLOBALS['user']>name));
Aunque se pueda traducir desde la interfaz, podramos proporcionar con nuestro mdulo
sus cadenas de texto ya traducidas. Para ello crearamos en el mdulo una carpeta
translations con un archivo general.pot que contendra todas las cadenas a traducir,
y un archivo .po para cada idioma con las cadenas traducidas, por ejemplo: es.po.
Existen herramientas para generar este tipo de archivos, y concretamente en Drupal
encontrars de gran utilidad el mdulo Translation template extractor, con el que podrs
fcilmente extraer estos archivos de traduccin para las cadenas de texto de un mdulo
especfico.
En estos primeros ejemplos he utilizado el espaol en el cdigo para facilitar la
comprensin. Pero Drupal est desarrollado por una comunidad internacional con el
ingls como idioma base. Por ello es una buena prctica escribir todo en ingls, tanto los
nombres de funciones y variables como los comentarios, lo que ayudar a que cualquier
otro desarrollador de Drupal pueda entenderlo. sta y muchas otras directrices
constituyen los estndares de programacin de Drupal, que conviene conocer y
acostumbrarse a seguir al desarrollar cdigo. De esta manera podras contribuir algn
da a la comunidad con tus propios mdulos no?
Espero que este tutorial te haya servido y animado a continuar este camino. Puedes
dejar aqu tus comentarios, cualquier duda, o sugerencia para mejorar el artculo. Os
dejo el enlace para descargar el cdigo del mdulo saludar.