Desarrollo de módulos para Drupal

4,606 views
4,484 views

Published on

Extracto de la descripción original del Codemotion:
Drupal es actualmente uno de los proyectos OpenSource más exitosos gracias a su numerosa comunidad y a lo increíblemente sencillo que es ampliar y personalizar la funcionalidad de la plataforma a traves de su sistema de módulos. Esta charla se plantea como una introducción a la arquitectura de Drupal y la creación de módulos exponiendo los recursos disponibles para hacerlo:

- Arquitectura Drupal.
- Drupal como sistema de Hooks y su manera de entender la "Inversión de Control"
- La documentación del desarrollador Drupal
- La API de Drupal
- Crear módulos a partir de "Examples module"

Published in: Technology
1 Comment
3 Likes
Statistics
Notes
No Downloads
Views
Total views
4,606
On SlideShare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
101
Comments
1
Likes
3
Embeds 0
No embeds

No notes for slide

Desarrollo de módulos para Drupal

  1. 1. Desarrollo de Módulos Drupal(con examples.module)Alessandro Mascherpa (@ALMADEWEB)alessandro@almadeweb.esAsiciación Española de Drupal Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 1 /29
  2. 2. Personal http://asociaciondrupal.es/• Desarrollador web freelance.• Administrador del grupo de usuarios de Drupal de Castellón, #DrupalCS: http://groups.drupal.org/castellon Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 2 /29
  3. 3. • Consideraciones previas• Arquitectura Drupal• Drupal como sistema de Hooks y su manera de entender la "Inversión de Control"• La documentación del desarrollador Drupal• La API de Drupal• Crear módulos a partir de "Examples module"• Referencias Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 3 /29
  4. 4. Consideraciones previas• Entorno de desarrollo – Apache (u otro http_server) – MySQL (u otro sist. de gestión de bases de datos) – PHP (o PHP) – IDE o editor para hacer código (según gustos): • http://drupal.cocomore.com/blog/using-eclipse-pdt-drupal-deve – Instalación de Drupal Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 4 /29
  5. 5. Consideraciones extras• Entorno de desarrollo II – Módulos auxiliares: coder, devel, devel_themer... – Drush: http://drupal.org/project/drush – GIT: http://drupal.org/node/711070• Coding standards Drupal – http://drupal.org/coding-standards• Conocer la comunidad Drupal y el workflow de desarrollo (issue queues,etc.)... Comprobar que lo que vayas a hacer no esté ya hecho Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 5 /29
  6. 6. Hooks: Inversión de control... Drupal-way El flujo habitual se da cuando es el código del usuario quien invoca a un procedimiento de una biblioteca. La inversión de control sucede cuando es la biblioteca la que invoca el código del usuario. Wikipedia http://martinfowler.com/bliki/InversionOfControl.html http://es.wikipedia.org/wiki/Inversi%C3%B3n_de_control• Drupal lo implementa mediate los patrones de diseño Observer y Visitor http://drupalwatchdog.com/1/1/design-patterns-of-drupal Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 6 /29
  7. 7. Arquitecturahttp://lin-clark.com/sites/default/files/sequence-diagram_get-field-types.png Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 7 /29
  8. 8. Documentación• Crear módulos para Drupal 7: http://drupal.org/node/1074360• Libros: https://www.packtpub.com/drupal-7-module-development/book• drupal.org, groups.drupal.org, IRC Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 8 /29
  9. 9. Drupal core API• User/Permissions/Node_access• DBTNG (PDO adaptado a Drupal) y SchemaAPI• MenuAPI• FormAPI• BlockAPI• Drupal Mail System Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 9 /29
  10. 10. Drupal core API• Entities, FieldAPI y Content• FileAPI• Theme System• JavaScript, AJAX y LibraryAPI• Perfiles de instalación• SimpleTest• Search System... Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 10 /29
  11. 11. Drupal contrib APIS• Views• EntityAPI• SearchAPI• Rules• Commerce• UserPoints, etc...• Drush Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 11 /29
  12. 12. Documentación de la API• Core: – http://api.drupal.org/ – Comentarios Doxygen: http://drupal.org/node/1354 – Descripciones, ejemplos y comentarios (en ocasiones): http://api.drupal.org/api/drupal/includes%21menu.inc/group/menu/7• Contrib: – http://drupalcontrib.org/api/drupal/7 – http://api.drush.org/api/functions – http://api.worldempire.ch/api/userpoints – http://api.drupalcommerce.org/ Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 12 /29
  13. 13. Estructura de un módulo• sites/{all o misite}/modules/{custom/}mi_modulo• Tiene seguro – .info – .module• Muy probable que tenga también – .install – .tests• Podría tener varios .inc, .css, .js ... Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 13 /29
  14. 14. User/Permissions/Node_access• Administración de usuarios, roles y permisos• Control de acceso• hook_permission Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 14 /29
  15. 15. hook_permisionfunction node_access_example_permission() { return array( access codemotion table => array( title => t(Access codemotion table), description => t(May view the table withde results of codemotion_example table.), ), );} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 15 /29
  16. 16. Menu System• Sistema de routing de Drupal (maneja la url)• Mantenimiento y consulta de datos relativos a los menús del sistema• Renderizado de menús• Diferentes tipos de menú según donde se muestre el enlace (si se muestra)• Control de acceso incluido• hook_menu() y hook_menu_alter Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 16 /29
  17. 17. hook_menu (menu_example)function codemotion_menu() { $items[codemotion/table] = array( title => TableSort example, description => Page with a sortable table, page callback =>codemotion_tablesort_example_page, access arguments => array(access codemotiontable), type => MENU_NORMAL_ITEM, menu_name => main-menu, ); return $items;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 17 /29
  18. 18. Renderizando una página (tablesort_example)function codemotion_tablesort_example_page() { $header = array( array(data => t(Numbers), field => t.numbers), array(data => t(Letters), field => t.alpha), array(data => t(Mixture), field => t.random), ); $query = db_select(codemotion_example, t)->extend(TableSort); $query->fields(t); $result = $query->orderByHeader($header)->execute(); $rows = array(); foreach ($result as $row) {$rows[] = array(data => (array) $row);} $build[tablesort_table] = array( #theme => table, #header => $header, #rows => $rows, ); return $build;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 18 /29
  19. 19. SchemaAPI• Capa de abstracción de la base de datos basada en PDO• Muchos plugins• Definición del schema de datos• Hooks para definir operaciones durante instalación y desinstalación de módulos• Hooks para definir operaciones durante activación y desactivación de módulos Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 19 /29
  20. 20. hook_schema (dbtng_example)function codemotion_schema() { $schema[codemotion_example] = array( description => Stores some values for sorting fun., fields => array( numbers => array(description => This column, type => varchar,length => 10,not null => TRUE, ), random => array( description => This column simply holds random, type => varchar,length => 128,not null => TRUE, ), ), primary key => array(numbers), ); return $schema;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 20 /29
  21. 21. hook_install y hook_uninstall (dbtng_example)function codemotion_install() { $rows = array( array(numbers => 1, alpha => e, random => 912cv21), array(numbers => 2, alpha => a, random => 0kuykuh), array(numbers => 4, alpha => w, random => 80jsv772), array(numbers => 6, alpha => s, random => au832), array(numbers => 7, alpha => e, random => t982hkv), ); if (db_table_exists(codemotion_example)) { foreach ($rows as $row) { db_insert(codemotion_example)->fields($row)->execute(); } }} function codemotion_uninstall() { db_drop_table(codemotion_example); } Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 21 /29
  22. 22. FormAPI• Definir formularios a traves de arrays asociativos dentro de la función miform_form• Renderizar formularios: drupal_get_form()• Form validation: miform_form_validate• Form submision: miform_form_submit• hook_form_alter Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 22 /29
  23. 23. _for (form_example)function form_codemotion_form($form, &$form_state) { $form[alpha] = array( #type => select, #title => t(Other value), #options => array(web => t(Web),hello=>t(Hello)), ); $form[random] = array( #type => textarea, #title => t(What standardized tests did you take?), #default_value => Un poco de random?, ); $form[submit] = array( #type => submit, #value => Enviar, ); return $form;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 23 /29
  24. 24. _form_validate y _form_submitfunction form_codemotion_form_validate($form, &$form_state) { if(!is_numeric($form_state[values][numbers])) { form_set_error(numbers, t(Numbers must be a number)); }}function form_codemotion_form_submit($form, &$form_state) { drupal_set_message(t(MyVal: @values,array(@values=>$form_state[values][myvalue]))); $row = array(numbers => $form_state[values][numbers], ...); db_insert(codemotion_example)->fields($row)->execute(); codemotion_mail_send($form_state[values]);} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 24 /29
  25. 25. Blocks• Fragmentos de contenido.• Se pueden distribuir en cualquier región definida en el tema a traves de la UI• Definidos con hook_block_info• Renderizados con hook_block_view• Otros hooks para modificar el comportamiento de los existentes en otros módulos Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 25 /29
  26. 26. hook_block_info (block_example)function codemotion_block_info() { $blocks[codemotion] = array( info => t(Codemotion Data), status => TRUE, region => sidebar_first, visibility => BLOCK_VISIBILITY_LISTED, pages => node/*, ); $blocks[codemotiontext] = array( info => t(Codemotion Text), ); return $blocks;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 26 /29
  27. 27. hook_block_view (block_example)/** * Implements hook_block_view(). */function codemotion_block_view($delta = ) { switch ($delta) { case codemotion: $block[subject] = t(Codemotion Data Block); $block[content] = codemotion_tablesort_example_page(); break; case codemotiontext: $block[codemotiontext] = codemotiontext; break; } return $block;} Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 27 /29
  28. 28. A partir de aquí... http://groups.drupal.org/madridhttp://2012.drupalday.es Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 28 /29
  29. 29. ¿Preguntas? ...… comentarios ...… críticas ... Gracias :) Alessandro Mascherpa @ALMADEWEB Alessandro Mascherpa (@ALMADEWEB) alessandro@almadeweb.es – Asociación Española de Drupal 29 /29

×