creando mudulos de drupal
TRANSCRIPT
-
8/17/2019 Creando Mudulos de Drupal
1/15
Creando mudulos de Drupal
Este tutorial está orientado a programadores que conocen PHP, que han empezado autilizar Drupal 7 a nivel de instalación e interfaz de administración, y que desean
aprender a programar sus propios módulos. He querido empezar por el clásico Hola!undo" para hacer el e#emplo lo más sencillo posi$le conceptualmente, pero al mismotiempo e%tenderlo con variantes que permitan hacerse una idea de cómo funcionaDrupal y las posi$ilidades que nos ofrece.
& trav's de este tutorial podrás aprender a(
• )rear tu primer módulo
• )rear una página para decir hola mundo
• *heming( maquetar el resultado con H*!+
• Programar un $loque que diga Hola !undo"
• Hacer el saludo configura$le desde la interfaz de administración
• aludar por su nom$re al usuario que inicia sesión
• Hacer configura$le en la interfaz qu' eventos mostrarán el saludo
• *raducir cadenas de te%to con Drupal( t-Hello orld"/
Creando tu primer módulo
Por supuesto podr0amos crear el Hola !undo" en un $loque o una página directamentedesde la interfaz, o incluso introducir un 12php echo Hola !undo"3 24 en una plantilladel tema, pero se trata de aprender a programar funcionalidades y en Drupal esto se hace
desarrollando módulos.
+os módulos se suelen u$icar dentro del directorio 5sites5all5modules. &ll0 creamos unacarpeta para nuestro módulo que podemos llamar saludar". Para terminar de crearnuestro módulo necesitamos crear dentro el archivo saludar.info y el archivosaludar.module. El primero es un archivo de te%to que contendrá la información dedefinición del archivo, y en el segundo empezaremos a programar con PHP.
saludar/saludar.info
name = Saludar
description = "Módulo que dice hola mundo"package = Aprendiendo a programar con Drupalcore = 7.x
http://www.redmamba.es/hola-mundo-programar-drupal-7-2011#primer-modulohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#pagina-hola-mundohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#theminghttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#bloque-hola-mundohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludo-configurablehttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludar-usuariohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludo-eventos-configurableshttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#traducirhttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#pagina-hola-mundohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#theminghttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#bloque-hola-mundohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludo-configurablehttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludar-usuariohttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#saludo-eventos-configurableshttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#traducirhttp://www.redmamba.es/hola-mundo-programar-drupal-7-2011#primer-modulo
-
8/17/2019 Creando Mudulos de Drupal
2/15
En saludar.info estamos diciendo que el módulo se llama aludar", descri$imos lo quehace, lo clasificamos en la categor0a &prendiendo a programar con Drupal" yespecificamos que es compati$le con Drupal 7.Para compro$ar que hemos creado el módulo correctamente nos vamos a la opción!ódulos" del men6 de administración de nuestra e$ Drupal, en la ruta
5admin5modules. &ll0 encontraremos nuestra categor0a con nuestro primer módulo, y unacasilla para activarlo.
Crear una página para decir hola mundo
Para crear una página, es decir, programar la respuesta para una determinada url,utilizaremos la función hoo89menu-/. )uando nuestra aplicación reci$a la petición de la
página 5saludar5hola:mundo", Drupal compro$ará si alguno de los módulos tiene programado un nombremodulo 9menu-/ para esta dirección. )reamos pues nuestrafunción saludar9menu-/ que servirá de 0ndice para las direcciones a las que responderánuestro módulo saludar.
saludar/saludar.module
-
8/17/2019 Creando Mudulos de Drupal
3/15
+o que hemos hecho es a;adir una url al array de elementos ecuerda vaciar las cach's para ver los cam$ios
Theming: maquetar el resultado con HTML
Hemos creado una página con el t0tulo aludar y hemos mostrado en su interior el te%toHola !undo". )omo pod'is compro$ar el contenido de nuestra página se muestradentro de un 1div class"content"4. Podr0amos formatear un poco el resultado conH*!+ directamente en la función(
#unction saludar'hola'mundo() * return -
-
8/17/2019 Creando Mudulos de Drupal
4/15
Pero estar0amos mezclando contenido y presentación, as0 que vamos a ir un poco másallá para separarlo, maquetando el Hola !undo" con H*!+ en un archivo de plantillaaparte. Para ello devolvemos el resultado de la función theme-/(
#unction saludar'hola'mundo() *
+$aria3les = arra0( -message- =1 -ola Mundo-2 )8 return theme(-saludar'hola'mundo-2 +$aria3les)89
&hora estamos introduciendo Hola !undo" en el array de varia$les que le vamos a pasar a la plantilla, y a continuación utilizamos la función theme-/ para generar elresultado de salida. Para ello la función theme-/ invoca el hoo89theme-/, utilizando el
primer parámetro =saludar9hola9mundo= como nom$re del hoo8.
Por tanto el siguiente paso es implementar el hoo89theme-/ para nuestro módulo en
saludar.module, indicando la plantilla que formateará la salida de =saludar9hola9mundo=.&l igual que con hoo89menu-/, la función que implementa el hoo89theme-/ en elmódulo se denomina nombremodulo 9theme-/(
!! ! &mplementa hook'theme(). !#unction saludar'theme() * return arra0( -saludar'hola'mundo- =1 arra0( -template- =1 -saludarholamundo-2 )2
)89
En nuestro hoo89theme-/ estamos llamando a la plantilla -template/( saludar:hola:mundo", para maquetar el call$ac8( saludar9hola9mundo". &hora solo falta crear la
plantilla en nuestro módulo, creando un archivo con el nom$re del template aca$ado en.tpl.php".
saludar/saludarholamundo.tpl.php
-
8/17/2019 Creando Mudulos de Drupal
5/15
&l utilizar theme-/ estamos separando la presentación de la funcionalidad y elcontenido, y permitiendo que esa presentación sea fácilmente so$reescrita en un tema.Por e#emplo un maquetador o drupal themer" podr0a simplemente copiar el archivo
saludar:hola:mundo.tpl.php del módulo en el tema y modificarlo, so$reescri$iendo as0el marcado H*!+ por defecto definido en nuestro módulo.
!rogramar un "loque que diga #Hola Mundo$
Hemos aprendido a crear nuestra primera página desde un módulo, con contenidomaquetado. &hora vamos a aprender a construir un $loque para poder colocar nuestroHola !undo" en la región de la página o páginas donde queramos u$icarlo. Para crearel $loque tenemos primero que implementar en saludar.module el hoo89$loc89info-/, que define todos los $loques que nuestro módulo va a proveer(
!! ! &mplementa hook'3lock'in#o(). !#unction saludar'3lock'in#o() * +3locks,-hola'mundo-/ = arra0( -in#o- =1 -@loque para ola Mundo-2 )8 return +3locks89
En el array
-
8/17/2019 Creando Mudulos de Drupal
6/15
podr0amos ha$er definido si por defecto aparece activado o no, en qu' región, con qu' peso, etc. Estas opciones las puede configurar el administrador del sitio e$ drupaldesde la pantalla de Gloques en el men6 Estructura -5admin5structure5$loc8/. &ll0 vemosnuestro $loque, en la sección Desactivado".
Podemos colocarlo en una región, por e#emplo en la $arra lateral, pero a6n no podemosverlo porque nos falta un paso, construir el $loque con el contenido, mediantehoo89$loc89vie-/(
!! ! &mplementa hook'3lock'$ieB(). !#unction saludar'3lock'$ieB(+delta = --) * sBitch (+delta) * case -hola'mundo- +3lock,-content-/ = saludar'hola'mundo()8 return +3lock89
9
En esta función definimos lo que se ve en cada $loque que implementa nuestro módulo.
+a varia$le
-
8/17/2019 Creando Mudulos de Drupal
7/15
&hora s0, si actualizamos cualquier página podemos ver el $loque en la $arra lateral, conel mensa#e Hola !undo", tal y como lo maquetamos en la plantilla. & este $loque no lehemos asignado ning6n t0tulo, si quisi'ramos proporcionar uno por defecto $astar0a conutilizar la varia$le
-
8/17/2019 Creando Mudulos de Drupal
8/15
&;adimos un nuevo elemento en el array del hoo89menu de nuestro módulo, ensaludar.module(
+items,-admincon#igcontentsaludar-/ = arra0( -title- =1 -Saludar-2 -description- =1 -:on#igurar las opciones para el saludo.-2 -page call3ack- =1 -drupal'get'#orm-2 -page arguments- =1 arra0(-saludar'con#iguracion-)2 -access arguments- =1 arra0(-administer site con#iguration-)2 -#ile- =1 -saludar.admin.inc-2 )8
&l situar la página $a#o la ruta admin5config5content5" estamos u$icándola en esemen6, de t0tulo &uditor0a del contenido", dentro de &dministración J )onfiguración.
-
8/17/2019 Creando Mudulos de Drupal
9/15
En esta ocasión configuramos la opción page call$ac8" para construir el formulariocon la función drupal9get9form-/, page arguments" para esta$lecer el id del formulario-saludar9configuracion"/ que le pasamos a drupal9get9form-/, y access arguments"
para que sólo puedan acceder a la página de configuración de nuestro módulo aquellosusuarios cuyo rol tenga asignado el permiso administer site configuration", traducidoen la página de permisos como &dministrar configuración del sitio".
Por 6ltimo hemos utilizado la opción file" para programar el formulario deadministración en un archivo diferente. Por supuesto podr0amos omitirlo y seguir
programando todo en saludar.module, pero a medida que el módulo empieza a crecer sehace más importante dividir la funcionalidad y de#ar el .module con los hoo8s yfunciones más generales, a modo de 0ndice del módulo.
& continuación creamos el archivo saludar.admin.inc en nuestro módulo con tres
funciones, una para definir el formulario de configuración, otra para validar dichoformulario y otra para procesar el env0o del formulario ya validado.
saludar/saludar.admin.inc
-
8/17/2019 Creando Mudulos de Drupal
10/15
!! ! Ealida el #ormulario de opciones de con#iguración. !#unction saludar'con#iguracion'$alidate(+#orm2 F+#orm'state) * i# (trim(+#orm'state,-$alues-/,-saludar'saludo-/) == --) * #orm'set'error(-saludar'saludo-2 -l saludo no puede quedar
$acGo.-)8 99
!! ! Hrocesa el en$Go del #ormulario de opciones de con#iguración. !#unction saludar'con#iguracion'su3mit(+#orm2 +#orm'state) * $aria3le'set(-saludar'saludo-2 +#orm'state,-$alues-/,-saludar'saludo-/)8 drupal'set'message("Se han guardado las opciones decon#iguración.")89
En saludar9configuracion-/ definimos los elementos del formulario en un array . En estecaso sólo presentaremos un campo de te%to te%tfield" para esta$lecer el aludo que semuestra al usuario". Puedes consultar la Drupal Korm &pi >eference para conocer todoslos elementos y sus propiedades.
Este saludo lo vamos a guardar en la $ase de datos con una varia$le que llamaremossaludar9saludo -una vez más utilizamos saludar9 como prefi#o para evitar colisiones conotros módulos/. Por eso definimos el valor por defecto del campo de te%to mediante lafunción de Drupal varia$le9get-/, que mostrará el 6ltimo valor registrado por eladministrador, o la cadena =Hola !undo= si no se ha configurado el saludo a6n.
-Cde#ault'$alue- =1 $aria3le'get(-saludar'saludo-2 -ola Mundo-)2
Por 6ltimo la función define el $otón de su$mit y la función que procesará el env0o, ydevuelve el formulario.
)omo e#emplo de validación compro$amos que no se haya enviado una cadena vac0a,accediendo al valor del campo que reci$imos del array
-
8/17/2019 Creando Mudulos de Drupal
11/15
Kinalmente en la función saludar9configuracion9su$mit-/ procesamos el env0o validadoguardando el saludo en la $ase de datos mediante la función varia$le9set-/, y emitimiosun mensa#e de confirmación mediante drupal9set9message-/.
Hemos visto que podemos controlar la validación y el env0o del formulario a trav's de
estas dos funciones, pero para este e#emplo podr0amos hacerlo mucho más sencillo yninguna de las dos ser0an necesarias. Por un lado la validación de campo o$ligatorio se puede implementar directamente con =Lrequired= 4 *>?E. Por otro lado podemosutilizar la función system9settings9form-/, que a;ade el $otón de su$mit, e invocainternamente tras el env0o a la función system9settings9form9su$mit-/, que ya seencarga de guardar el valor del campo en una varia$le con el mismo nom"re que elcampo, en este caso Msaludar9saludoM. implificando el e#ercicio, podr0amos de#ar elarchivo saludar.admin.inc sólo con esta función(
#unction saludar'con#iguracion() *+#orm,-saludar'saludo-/ = arra0(
-Ctitle- =1 -Saludo que se muestra al usuario-2-Ct0pe- =1 -text#ield-2 -Cde#ault'$alue- =1 $aria3le'get(-saludar'saludo-2 -ola Mundo-)2
http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variable_set/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/drupal_set_message/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/drupal_set_message/7http://api.drupal.org/api/drupal/modules--system--system.module/function/system_settings_form/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/variable_set/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/drupal_set_message/7http://api.drupal.org/api/drupal/modules--system--system.module/function/system_settings_form/7
-
8/17/2019 Creando Mudulos de Drupal
12/15
-Crequired- =1 4562)8
return s0stem'settings'#orm(+#orm)89
&hora solo nos queda utilizar el valor de configuración guardado para mostrarlo en el
saludo. Para hacer esto modificamos la función saludar9hola9mundo-/ del archivosaludar.module, que quedará as0(
#unction saludar'hola'mundo() * +$aria3les = arra0( -message- =1 $aria3le'get(-saludar'saludo-2 -ola Mundo-)2 )8 return theme(-saludar'hola'mundo-2 +$aria3les)89
Eso es todo, ahora nuestro Hola !undo" se ha convertido en un saludo configura$leque mostraremos en la página o $loque que hemos creado para ello. +os $loquesademás tienen una página de configuración espec0fica en la que podr0amos ha$erincluido el campo para configurar el saludo, de manera similar a cómo lo hemos hechoen saludar.admin.inc, pero utilizando los hoo8s hoo89$loc89configure-/ yhoo89$loc89save-/. *e lo de#o como e#ercicio de investigación y práctica.
&aludando por su nom"re al usuario que inicia sesión
Este e#ercicio se puede hacer de manera muy sencilla, tan solo hay que responder al
hoo8 de inicio de sesión que se llama hoo89user9login-/, en nuestro saludar.module(
!! ! &mplementa hook'user'login(). !#unction saludar'user'login(F+edit2 +account) * drupal'set'message("ola " . +account1name)89
Na sa$emos como escri$ir un saludo en una página y en un $loque, ahora lo hacemos enun sitio nuevo. Estamos haciendo uso de la función drupal9set9message-/, para escri$irun mensa#e de estado o confirmación, que tam$i'n podr0a ser de advertencia o error,esta$leciendo un segundo parámetro.
El hoo89user9login-/ nos proporciona el evento al que reaccionar y tam$i'n el propioo$#eto usuario(
-
8/17/2019 Creando Mudulos de Drupal
13/15
Hacer configura"le en la interfa% qué e'entos
mostrarán el saludo
Drupal dispone de un módulo del n6cleo, *rigger, que permite desde la interfaz deadministración activar ciertas acciones en determinados eventos del sistema, comocuando un usuario inicia sesión o cuando se crea contenido. @ecesitamos activar estemódulo porque vamos a crear una acción de saludar para que el administrador puedadecidir qu' eventos van a accionar -trigger"/ el saludo, en el men6 de administraciónEstructura J Disparadores -admin5structure5trigger/.
Primero creamos la acción de saludar utilizando hoo89action9info-/ en nuestrosaludar.module(
!! ! &mplementa hook'action'in#o(). !#unction saludar'action'in#o() * return arra0( -saludar'usuario'action- =1 arra0( -t0pe- =1 -user-2 -la3el- =1 -Saludar al usuario-2 -con#igura3le- =1 IAS2 -triggers- =1 arra0(-an0-)2 )2 )89
)ada elemento en el array que devuelve este hoo8 define una acción, en este caso=saludar9usuario9action=, que clasificamos de tipo usuario, su etiqueta será aludar alusuario", en principio no será configura$le y estará disponi$le para cualquier disparador -se puede limitar qu' disparadores tendrán la acción disponi$le/. )on esta funciónimplementada ya podemos seleccionar en la interfaz a qu' disparadores queremosasignar esta acción, por e#emplo tras iniciar sesión.
+o siguiente es eliminar la función saludar9user9login-/ que implementamos en elapartado anterior, y sustituir ese hoo8 por la acción gen'rica que accionarán losdisparadores asignados en la interfaz.
!! ! Acción de drupal que saluda al usuario. !
#unction saludar'usuario'action() * +message = "J@ien$enidoK"8 i# (user'is'logged'in()) *
http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_action_info/7http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_action_info/7http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_action_info/7http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_action_info/7
-
8/17/2019 Creando Mudulos de Drupal
14/15
+message = "ola " . +L@AS,-user-/1name8 9 drupal'set'message(+message)89
En la acción estamos teniendo en cuenta si el usuario es anónimo o está autenticado,
saludándole por su nom$re en ese caso. Para ello hacemos uso de la varia$le glo$al user", que contiene el o$#eto usuario actual, y su propiedad name" solo disponi$le siel o$#eto es un usuario autenticado.
Atra opción es utilizar la función format9username-/, que directamente nos da elnom$re del usuario o $ien el nom$re usado en el sitio para indicar usuarios anónimos,generalmente &nónimo" -se define en )onfiguración J Personas J Apciones de lacuenta/. )omo ves la &PB de Drupal ya cuenta con muchas funciones de utilidadimplementadas que conviene conocer.
#unction saludar'usuario'action() *
drupal'set'message("ola " . #ormat'username(+L@AS,-user-/))89
&hora puedes compro$ar que el saludo se muestra correctamente para los distintoseventos que configures en la página de Disparadores, y de paso ir conoci'ndolos y vercuándo se e#ecutan.
Traducir cadenas de te(to con )rupal: t*#Hello
+orld$,
+a función t-/ sirve para poder traducir la cadena en los distintos idiomas que pudieratener la e$. El idioma por defecto es el ingl's y es en este idioma como de$eremoscrear las cadenas de te%to al programar. Por tanto en los e#emplos anteriores de$er0amossustituir la cadena Hola !undo" por la e%presión t-Hello orld"/, y as0 con todas lase%presiones de te%to por su equivalente en ingl's $a#o la función t-/. De esta manera se
podrán traducir desde la interfaz estas cadenas a cualquier idioma.
http://api.drupal.org/api/drupal/globals/7http://api.drupal.org/api/drupal/globals/7http://api.drupal.org/api/drupal/includes--common.inc/function/format_username/7http://api.drupal.org/api/drupal/includes--common.inc/function/format_username/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/t/7http://api.drupal.org/api/drupal/globals/7http://api.drupal.org/api/drupal/includes--common.inc/function/format_username/7http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/t/7
-
8/17/2019 Creando Mudulos de Drupal
15/15
Por supuesto las cadenas que contienen varia$les, como en el 6ltimo e#emplo del saludoal usuario, tam$i'n se pueden traducir. En la cadena de te%to utilizamos varia$les con els0m$olo delante, y definimos estas varia$les en un array como segundo parámetro dela función t-/.
+message = t("ola name"2 arra0(-name- =1 +L@AS,-user-/1name))8
&unque se pueda traducir desde la interfaz, podr0amos proporcionar con nuestro módulosus cadenas de te%to ya traducidas. Para ello crear0amos en el módulo una carpeta
translations" con un archivo general.pot" que contendr0a todas las cadenas a traducir,y un archivo .po para cada idioma con las cadenas traducidas, por e#emplo( es.po".E%isten herramientas para generar este tipo de archivos, y concretamente en Drupalencontrarás de gran utilidad el módulo *ranslation template e%tractor , con el que podrásfácilmente e%traer estos archivos de traducción para las cadenas de te%to de un móduloespec0fico.
En estos primeros e#emplos he utilizado el espa;ol en el código para facilitar lacomprensión. Pero Drupal está desarrollado por una comunidad internacional con elingl's como idioma $ase. Por ello es una $uena práctica escri$ir todo en ingl's, tanto losnom$res de funciones y varia$les como los comentarios, lo que ayudará a que cualquierotro desarrollador de Drupal pueda entenderlo. Qsta y muchas otras directricesconstituyen los estándares de programación de Drupal, que conviene conocer yacostum$rarse a seguir al desarrollar código. De esta manera podr0as contri$uir alg6nd0a a la comunidad con tus propios módulos Ono2
Espero que este tutorial te haya servido y animado a continuar este camino. Puedesde#ar aqu0 tus comentarios, cualquier duda, o sugerencia para me#orar el art0culo. Asde#o el enlace para descargar el código del módulo saludar .
http://drupal.org/project/potxhttp://drupal.org/coding-standardshttp://www.redmamba.es/sites/default/files/saludar.tar.gzhttp://drupal.org/project/potxhttp://drupal.org/coding-standardshttp://www.redmamba.es/sites/default/files/saludar.tar.gz