Desarrollo de módulos para Drupal
-
Upload
alessandro-mascherpa -
Category
Technology
-
view
4.835 -
download
8
description
Transcript of 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
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/
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
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
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
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
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
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
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
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...
Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 11 / 29
Drupal contrib APIS
• Views• EntityAPI• SearchAPI
• Rules
• Commerce• UserPoints, etc...• Drush
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/
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 ...
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
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.'), ), );}
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
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;}
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;}
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
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;}
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');}
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
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;}
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']);}
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
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;}
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;}
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
Alessandro Mascherpa (@ALMADEWEB)[email protected] – Asociación Española de Drupal 29 / 29
¿Preguntas? ...… comentarios ...… críticas ...
Gracias :)
Alessandro Mascherpa
@ALMADEWEB