creando mudulos de drupal

Upload: morfiux-cronos-zet

Post on 06-Jul-2018

212 views

Category:

Documents


0 download

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