Desarrollo de módulos para Drupal

29
Alessandro Mascherpa (@ALMADEWEB) [email protected] – Asociación Española de Drupal 1 / 29 Desarrollo de Módulos Drupal (con examples.module) Alessandro Mascherpa (@ALMADEWEB) [email protected] Asiciación Española de Drupal

description

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"

Transcript of Desarrollo de módulos para Drupal

Page 1: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 1 / 29

Desarrollo de Módulos Drupal(con examples.module)

Alessandro Mascherpa (@ALMADEWEB)

[email protected]ón Española de Drupal

Page 2: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 2 / 29

Personal

• Desarrollador web freelance.• Administrador del grupo de usuarios de Drupal

de Castellón, #DrupalCS: http://groups.drupal.org/castellon

http://asociaciondrupal.es/

Page 3: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 3 / 29

• 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

Page 4: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 4 / 29

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-development

– Instalación de Drupal

Page 5: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 5 / 29

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

Page 6: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 6 / 29

Hooks: Inversión de control... Drupal-way

• Drupal lo implementa mediate los patrones de diseño Observer y Visitorhttp://drupalwatchdog.com/1/1/design-patterns-of-drupal

http://martinfowler.com/bliki/InversionOfControl.html

http://es.wikipedia.org/wiki/Inversi%C3%B3n_de_control

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

Page 7: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 7 / 29

Arquitectura

http://lin-clark.com/sites/default/files/sequence-diagram_get-field-types.png

Page 8: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 8 / 29

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

Page 9: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 9 / 29

Drupal core API

• User/Permissions/Node_access• DBTNG (PDO adaptado a Drupal) y

SchemaAPI

• MenuAPI

• FormAPI• BlockAPI• Drupal Mail System

Page 10: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 10 / 29

Drupal core API• Entities, FieldAPI y Content

• FileAPI• Theme System• JavaScript, AJAX y LibraryAPI

• Perfiles de instalación

• SimpleTest• Search System...

Page 11: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 11 / 29

Drupal contrib APIS

• Views• EntityAPI• SearchAPI

• Rules

• Commerce• UserPoints, etc...• Drush

Page 12: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 12 / 29

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/

Page 13: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 13 / 29

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 ...

Page 14: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 14 / 29

User/Permissions/Node_access

• Administración de usuarios, roles y permisos• Control de acceso• hook_permission

Page 15: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 15 / 29

hook_permision

function node_access_example_permission() { return array( 'access codemotion table' => array( 'title' => t('Access codemotion table'), 'description' => t('May view the table with de results of codemotion_example table.'), ), );}

Page 16: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 16 / 29

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

Page 17: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 17 / 29

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 codemotion table'), 'type' => MENU_NORMAL_ITEM, 'menu_name' => 'main-menu', ); return $items;}

Page 18: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 18 / 29

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;}

Page 19: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 19 / 29

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

Page 20: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 20 / 29

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;}

Page 21: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 21 / 29

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');}

Page 22: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 22 / 29

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

Page 23: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 23 / 29

_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;}

Page 24: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 24 / 29

_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']);}

Page 25: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 25 / 29

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

Page 26: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 26 / 29

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;}

Page 27: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 27 / 29

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;}

Page 28: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 28 / 29

A partir de aquí...

http://groups.drupal.org/madridhttp://2012.drupalday.es

Page 29: Desarrollo de módulos para Drupal

Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 29 / 29

¿Preguntas? ...… comentarios ...… críticas ...

Gracias :)

Alessandro Mascherpa

@ALMADEWEB