5. Curso Drupal Avanzado - OSL 2014
5
DRUPAL 7 API I
● Sistema de módulos . Drupal Hooks
● Capa abstración de base de datos
● Sistema de menús
● Form API
● Sistema de subida de arquivos
● Sistema de búsqueda
● Sistema de acceso a nodos
● Sistema de temas
● Constantes e variables
6. Curso Drupal Avanzado - OSL 2014
6
DRUPAL 7 API II
● Sistema de módulos . Drupal Hooks
● Desenvolvemento de módulos
● Sistema de menús
● Form API
● Capa abstración de base de datos
7. Curso Drupal Avanzado - OSL 2014
7
DRUPAL 7 API hooks
● A base de Drupal é un sistema de conectores (hooks)
● Drupal consulta a cada módulo se desexan executar algunha acción
● Exemplo: hook_cron . Execución de tarefas programadas
● Os hooks engaden funcionalidades e permiten interactuar co core de Drupal
● Deste xeito podemos alterar o funcionamento de Drupal
https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7
8. Curso Drupal Avanzado - OSL 2014
8
DRUPAL 7 API hooks II
Exemplo :hook_form_alter()
● Permite alterar o comportamento dos formularios que usamos en Drupal
● Permite engadir e eliminar elementos
● Permite engadir e eliminar funcións de validación
● Permite engadir e eliminar funcións de submit form
● O xeito habitual de empregar hooks e creando un módulo
https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_form_alter/7
10. Curso Drupal Avanzado - OSL 2014
10
DRUPAL DEVELOPER TOOLBOX básico
Extensións para Firefox
● Web developer
● Firebug
● DrupalforFirebug
● LiveHTTPHeaders
● UserAgentSwitcher
● Awesome Screenshot
Módulos Drupal
● devel
● forminspect
● coder
● potx
Editores de texto
● vi vim nano
● atom
Aplicacións
● ssh / scp
● git
● filezilla
● virtaal
Recursos web
● pastebin
● evernote
Drush !!!!!
11. Curso Drupal Avanzado - OSL 2014
11
DRUPAL 7 API
Creando un módulo
● Crear arquivos
● Implementar os hooks
● Activar módulo
● Limpar a caché ( KEEP CALM AND CLEAR CACHE )
12. Curso Drupal Avanzado - OSL 2014
12
DRUPAL 7 API
Creando un módulo : arquivos
● Crear directorio co nome do módulo /sites/all/modules/exemplo01
● Recomendado mudar tódolos módulos ao directorio custom
● O primeiro arquivo que crearemos dentro de exemplo01 será exemplo01.info
● A estrutura dos arquivos .info é estándar para tódolos módulos de Drupal
Elementos
Obrigatorios
name = Nome a mostrar na páxina de configuración de módulos
description = Descrición a mostrar na páxina de configuración de módulos
package = Paquete/grupo ao que asociamos o módulo
core = Versión de Drupal para a que escribimos o módulo
Opcionais
php = Versión mínima de PHP necesaria para executar o módulo
files = Matriz de nomes de arquivos asociados ao módulo
version = Indica a versión do módulo
13. Curso Drupal Avanzado - OSL 2014
● Estilo de comentario /** respecta o extractor de documentación automatizado de
Drupal
● @file indica que a seguinte liña é unha descrición da función do arquivo
● Gardar cambios
● Limpar cache vía drush cc all ou /admin/config/development/performance
● Comprobar disponibilidade do módulo vía drush pm-list ou ben dende
/admin/modules
13
DRUPAL 7 API
Creando un módulo : arquivo .module
https://github.com/apermuy/modules-osl/tree/master/exemplo01
14. Curso Drupal Avanzado - OSL 2014
14
DRUPAL 7 API
Creando un módulo : implementar hook
● Crear arquivo exemplo01.module
● Asignar nome ao hook, neste caso para implementar hook_user_login usamos
exemplo01_user_login
● Sustituimos hook polo nome do módulo
● So etiqueta de inicio de arquivo PHP
<?php
/**
* Implementa hook_user_login()
*
*/
function exemplo01_user_login(&$edit, &account) {
}
16. Curso Drupal Avanzado - OSL 2014
16
DDRRUUPPAALL 77 AAPPII
function watchdog
https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/watchdog/7
Escribe unha mesaxe na “bitácora” Drupal
admin/reports/dblog => Interface administrativa
drush wd-list => drush
$type = Categoria, nome do módulo
$message = Mensaxe a escribir na “bitácora” Drupal
$variables = Array con variables a reemplazar na mensaxe. NULL
se a mensaxe xa está traducida ou non se pode traducir
$severity = “Severidade” , definido no RFC 3164 BSD Syslog
$link = Ligazón asociado á mensaxe
watchdog('exemplo01', 'Login ok', $variables = NULL, WATCHDOG_INFO, $link = NULL);
17. Curso Drupal Avanzado - OSL 2014
17
DDRRUUPPAALL 77 AAPPII
function drupal_set_message
https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_set_message/7
“Mostra unha mensaxe por pantalla ao usuario”
$message = Mensaxe a mostrar
$type = 'status', 'warning' ou 'error'
drupal_set_message('Hello from OSL', 'warning')
21. Curso Drupal Avanzado - OSL 2014
21
DRUPAL 7 API
function dpm
https://api.drupal.org/api/devel/devel.module/function/dpm
“Imprime unha variable no área de mensaxe do sistema”
<?php
/**
* Implementa hook_user_login()
*
*/
function exemplo01_user_login(&$edit, &account) {
dpm($account);
}
26. Curso Drupal Avanzado - OSL
26
DRUPAL 7 API
Obxecto $user
https://api.drupal.org/api/drupal/globals
● Drupal crea un obxecto $user que representa a entidade do usuario actual
● Se o usuario non inicia sesión, será considerado como anónimo.
● Podemos “inspeccionar” o obxecto $user :
<?php
global $user;
dpm($user);
27. Curso Drupal Avanzado - OSL
27
DRUPAL 7 API
Compoñentes do obxecto $user
Táboa users
● uid ID de usuario. Clave principal táboa users
● name Nome de usuario
● pass hash sha512 da contrasinal de usuario
● mail email actual usuario
● theme Campo ignorado, mantido por compatibilidade
● signature Firma do usuario
● signature format Formato da firma do usuario
● created Marca de tempo Unix da creación da conta
● access Marca de tempo Unix que indica último acceso
● login Marca de tempo Unix que indica último inicio sesión
satisfactorio.
● status 1 se usuario está activo e 0 se inactivo
● timezone Segundos de desprazamento da zona horaria
● language Idioma predeterminado do usuario
● picture Ruta ao arquivo de imaxe de usuario.
● init Email inicial proporcionado polo usuario ao rexistrarse
● data Datos arbitrario almacenados por módulos
30. Curso Drupal Avanzado - OSL
30
DRUPAL 7 API Sistema de menús
● Sistema complexo pero moi potente.
● Tres funcións principais:
● Asignación de retrochamadas(CALLBACKS)
● Control de acceso
● Personalización de menús
● O código fonte básico podemos atopalo en includes/menu.inc
31. Curso Drupal Avanzado - OSL
31
DRUPAL 7 API Sistema de menús II
● Enrutamento(ou entrega) en Drupal: proceso executado polo core de
Drupal que debe determinar qué código executar e como procesar a
solicitude.
● Drupal recorta a base da URL e utiliza a parte posterior :
https://osl.drupal/?q=node/3
Ruta: node/3
● Se activamos URL limpas visualizaríamos a URL https://osl.drupal/node/3
32. Curso Drupal Avanzado - OSL
32
DRUPAL 7 API Sistema de menús III
Asinar URLs a funcións
● Drupal pide a tódolos módulos activados que devolvan unha matriz con elementos
de menú.
● Matriz con clave de ruta + información sobre o recurso.
● Un dos elementos que deben proporcionar é a retrochamada(CALLBACK)
● CALLBACK = función PHP que se executa cando o navegador solicita unha ruta
33. Curso Drupal Avanzado - OSL
33
DRUPAL 7 API Sistema de menús III
Análise solicitude Drupal
1) Establecemento de ruta.
2) Controlar qué rutas asignar a cada CALLBACK na táboa menu_router e o
elementos de menú, vinculados na táboa menu_links. Drupal comproba se é
necesario actualizar ou rexenerar a táboa(pouco habitual)
3) Determinar qué entrada da táboa menu_router ten correspondencia coa ruta d
Drupal e xenerar un elemento que describa o CALLBACK
4)Abrir os obxectos necesarios para pasar ao CALLBACK
5)Comprobar se o usuario ten permisos para acceder ao CALLBACK
6)Localizar o título e a descripción do elemento de menú para o idioma actual
7) Abrir os includes necesarios
8)Invocar o CALLBACK e devolver o resultado que index.php pasa por
theme_page() , o que xenera unha páxina web determinada.
34. Curso Drupal Avanzado - OSL
● Matriz de elementos na que cada un é unha matriz de pares nome e valor que definen
os seus atributos
34
DRUPAL 7 API Sistema de menús III
Crear elemento de menu con hook_menu
Atributos clave valor de hook_menu
CLAVE VALOR
title Campo obrigatorio que respresenta o título sen traducir do elemento do menú
title callback Función que se usa para xenerar o título. De xeito predeterminado é t(). FALSE se non queremos traducir
title arguments Argumentos que se envían á función t()
description Descrición sen traducir do elemento do menú
page callback Función a invocar para mostrar unha páxina web(HTML) cando o usuario visita a ruta
page arguments Matriz de argumentos a pasar ao CALLBACK, os valores enteiros pásanse na URL
access callback Función que devolve valor BOOLEANO que determina se o usuario ten dereitos de acceso ao recurso.
user_access() é o valor predeterminado.
access arguments Matriz de argumentos a pasar á función de CALLBACK de acceso
file Arquivo que se inclúe antes de acceder aos CALLBACK. Permite que as funcións residan en arquivos
independentes. Debe ser relativo ao directorio do módulo implementado.
file path Ruta do directorio indicado en file
weight Enteiro que determina a posición relativa dos elementos do menú. Maior peso descenden.
menu_name [Opcional] Podemos establecer un menú personalizado se non queremos establecer o elemento no menú
navegación
35. Curso Drupal Avanzado - OSL
35
DRUPAL 7 API Sistema de menús III
Crear elemento de menu con hook_menu II
CLAVE VALOR
type Indicadores que describen as propiedades do elemento do menú
MENU_NORMAL_ITEM : Os elementos móstranse na árbore de menús e o administrador pode movelos e
ocultalos.
MENU_CALLBACK : Retrochamada que rexistra unha ruta para o acceso á función correcta para acceder á
URL
MENU_SUGGETED_ITEM : Os módulos poden suxerir elementos que o administrador pode habilitar
MENU_LOCAL_TASK : As tarefas locais represéntase como fichas de xeito predeterminado.
MENU_DEFAULT_LOCAL_TASK : Tódolos conxuntos de tarefas locais deben proporcionar unha tarefa
predeterminada, que se vincula á mesma ruta ao facer clic na súa tarefa principal
36. Curso Drupal Avanzado - OSL
36
DRUPAL 7 API Sistema de menús III
Crear elemento de menu con hook_menu III
<?php
/**
* @file
* Engade ruta exemplo02 ao sitio web de exemplo
*/
/**
* Implements hook_menu().
*/
function exemplo02_menu() {
$items['exemplo02'] = array(
'title' => 'Exemplo02',
'page callback' => 'exemplo02_callback',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
return $items;
}/
**
* Callback de páxina exemplo02.
*/
function exemplo02_callback() {
return t('Hello from example02');
}
Tipo de “retrochamada”. Xenera URL tipo
http://osl.drupal/exemplo02
Ao usar t(), permite traducir a cadea
38. Curso Drupal Avanzado - OSL
38
DRUPAL 7 API Formularios
Formulario clásico HTML
● Sección documento HTML que contén:
● contido
● control
● Control
● Permiten aos usuarios a interación con formularios
● O “nome” do control defínese polo atributo name
● O “campo de acción” ou “alcance” dun control defínese nun elemento
FORM
● Tipo de controis nun formulario HTML
● “button”
● “checkboxes”
● “radiobuttons”
● “textarea”
39. Curso Drupal Avanzado - OSL
39
DRUPAL 7 API Formularios
Formulario clásico HTML II
<form action="http://osl.cixug.es" method="post">
<p>
<label for="nombre">Nombre: </label><input type="text" id="nombre">
<input type="submit" value="Enviar">
</p>
</form>
40. Curso Drupal Avanzado - OSL
40
DRUPAL 7 API Formularios
API formularios Drupal
● API Drupal abstrae os formulario nunha matriz anidada de propiedades e
valores
● Representación dun “formulario Drupal”
● En lugar de xenerar HTML, creamos unha matriz e “deixamos” que
Drupal faga o seu traballo.
● A representación dos datos do formulario preséntase de xeito
estructurado, polo tanto é moi sinxelo engadir, eliminar, modificar e
ordenar elementos de xeito limpo.
● A calquer elemento de formulario podemos asignar unha función dun
“tema”
● Podemos engadir validacións ou elementos adicionais a calquer
formulario.
41. Curso Drupal Avanzado - OSL
41
DRUPAL 7 API Formularios
API formularios Drupal II
● As operacións de formularios están protexidas contra ataques de
inxección.
● Vantaxes de usar FORM API é que tenta garantizar que realmente o
formulario creouse dende a instalación de Drupal.
● Drupal define unha clave privada para cada instalación, xenerada de
xeito aleatorio.
● settings.php + fix_permissions!!!!!
● Cando enviamos o formulario envíase unha cadea baseada na clave
privada e un campo oculto no formulario(form_token) que se
comproba cando enviamos o formulario.
● O ID do formulario envíase como parte do conxunto $form
http://www.samadhicsecurity.com/p/drupal-7-security.html
42. Curso Drupal Avanzado - OSL
42
DRUPAL 7 API Formularios
API formularios Drupal III
● 3 variables esenciais para traballar con formularios
● $form_id : cadea que identifica o formulario
● $form : matriz que conten elementos do formulario
● $form_state: información sobre o formulario, p.e os valores.
dpm($form_state)
43. Curso Drupal Avanzado - OSL
43
DRUPAL 7 API Formularios
API formularios Drupal IV
/**
* Implementación de hook_menu()
*
*/
function exemplo05_menu() {
$items['exemplo05_form'] = array(
'title' => 'Formulario de exemplo',
'page callback' => 'drupal_get_form',
'page arguments' => array('exemplo05_form'),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM
);
return $items;
}
44. Curso Drupal Avanzado - OSL
44
DRUPAL 7 API Formularios
API formularios Drupal V
/*
* Definición do formulario
*/
function exemplo05_form() {
$form['nome'] = array(
'#title' => t('Nome'),
'#type' => 'textfield',
'#description' => t('Indícanos o teu nome'),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Enviar'),
);
return $form;
}
45. Curso Drupal Avanzado - OSL
45
DRUPAL 7 API Formularios
API formularios Drupal VI
/**
* Validación do formulario
*/
function exemplo05_form_validate($form, &$form_state) {
if ( $form_state['values']['nome'] == 'pepe') {
//Indicamos ao API de formularios que o campo non superou a validación
form_set_error('nome', t('Pepe non é benvido neste formulario'));
}
}
/**
* Procesar o envio do formulario despois da validación
*/
function exemplo05_form_submit($form, &$form_state) {
$nome = $form_state['values']['nome'];
drupal_set_message( t('Grazas %nome por enviar o formulario', array('%nome' => $nome)));
}
47. Curso Drupal Avanzado - OSL 2014
47
DRUPAL 7 API
hook_form_alter
https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_form_alter/7
“Permite realizar alteración nos formularios antes de renderizalos”
function example_form_alter(&$form, &$form_state, $form_id) {
dpm($form); // print form ID to messages
}
function avpc_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == 'operativo_node_form'){
$form['field_provincia_operativo']['#access'] = FALSE;
$form['field_platerga_operativo']['#access'] = FALSE;
$form['#validate'][] = 'avpc_validar_operativo';
}
}
48. Curso Drupal Avanzado - OSL
48
DRUPAL 7 API Formularios
API formularios Drupal VI
/**
* Validación do formulario
*/
function exemplo05_form_validate($form, &$form_state) {
if ( $form_state['values']['nome'] == 'pepe') {
//Indicamos ao API de formularios que o campo non superou a validación
form_set_error('nome', t('Pepe non é benvido neste formulario'));
}
}
/**
* Procesar o envio do formulario despois da validación
*/
function exemplo05_form_submit($form, &$form_state) {
$nome = $form_state['values']['nome'];
drupal_set_message( t('Grazas %nome por enviar o formulario', array('%nome' => $nome)));
}