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"
1. Desarrollo de Módulos Drupal
(con examples.module)
Alessandro Mascherpa (@ALMADEWEB)
alessandro@almadeweb.es
Asiciación Española de Drupal
Alessandro Mascherpa (@ALMADEWEB)
alessandro@almadeweb.es – Asociación Española de Drupal 1 /29
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. • 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. 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. 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. 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
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. 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. 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
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. 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. 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. 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)
alessandro@almadeweb.es – Asociación Española de Drupal 15 /29
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
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
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. _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. _form_validate y _form_submit
function 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. 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
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. A partir de aquí...
http://groups.drupal.org/madrid
http://2012.drupalday.es
Alessandro Mascherpa (@ALMADEWEB)
alessandro@almadeweb.es – Asociación Española de Drupal 28 /29