Curso CDA: Drupal API

49
CURSO DE ADMINISTRACIÓN AVANZADA E DESENVOLVEMENTO DE DRUPAL 8 - 12 setembro 2014 – Santiago de Compostela TEMA 4: API DRUPAL

description

Curso CDA: Drupal API

Transcript of Curso CDA: Drupal API

Page 1: Curso CDA: Drupal API

CURSO DE ADMINISTRACIÓN AVANZADA E DESENVOLVEMENTO DE DRUPAL

8 - 12 setembro 2014 – Santiago de Compostela

TEMA 4: API DRUPAL

Page 2: Curso CDA: Drupal API

Esta obra fue creada por Alberto Permuy Leal, y está disponible bajo una licencia Reconocimiento-CompartirIgual 3.0 http://creativecommons.org/licenses/by-sa/3.0/deed.es_ES

Usted es libre de:

Copiar, distribuir y comunicar públicamente la obra

Hacer obras derivadas

Bajo las condiciones siguientes:

Reconocimiento - Debe reconocer los créditos de la obra de la manera especificada por el autor o licenciador (pero no de una manera que sugiera que tiene su apoyo o apoyan el uso que hace de su obra).

Compartir bajo la misma licencia - Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta.

© 2014 - CIXUG

Page 3: Curso CDA: Drupal API

https://api.drupal.org

Page 4: Curso CDA: Drupal API

https://www.drupal.org/documentation/develop

https://www.drupal.org/coding-standards

https://www.drupal.org/project/examples

Page 5: Curso CDA: Drupal API

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

Page 6: Curso CDA: Drupal API

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

Page 7: Curso CDA: Drupal API

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

Page 8: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

8

DRUPAL 7 API hooks II

● 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

Exemplo :hook_form_alter()

https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_form_alter/7

Page 9: Curso CDA: Drupal API

9

Page 10: Curso CDA: Drupal API

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

Page 11: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

11

DRUPAL 7 API

● Crear arquivos● Implementar os hooks● Activar módulo● Limpar a caché ( KEEP CALM AND CLEAR CACHE )

Creando un módulo

Page 12: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

12

DRUPAL 7 API

● 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ódulosdescription = Descrición a mostrar na páxina de configuración de módulospackage = Paquete/grupo ao que asociamos o módulocore = Versión de Drupal para a que escribimos o módulo

Opcionaisphp = Versión mínima de PHP necesaria para executar o módulofiles = Matriz de nomes de arquivos asociados ao móduloversion = Indica a versión do módulo

Creando un módulo : arquivos

Page 13: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

13

DRUPAL 7 API

Creando un módulo : arquivo .module

https://github.com/apermuy/modules-osl/tree/master/exemplo01

● 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

Page 14: Curso CDA: Drupal API

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) {

}

Page 15: Curso CDA: Drupal API

15

Page 16: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

16

DRUPAL 7 API DRUPAL 7 API

function watchdog

Escribe unha mesaxe na “bitácora” Drupal

admin/reports/dblog => Interface administrativa

drush wd-list => drush

https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/watchdog/7

$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);

Page 17: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

17

DRUPAL 7 API DRUPAL 7 API

function drupal_set_message

“Mostra unha mensaxe por pantalla ao usuario”

https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_set_message/7

$message = Mensaxe a mostrar$type = 'status', 'warning' ou 'error'

drupal_set_message('Hello from OSL', 'warning')

Page 18: Curso CDA: Drupal API

18

Page 19: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

19

DRUPAL 7 API

● Comprobamos sintaxis con módulo coder

Page 20: Curso CDA: Drupal API

5Exercicio

cursos.cixug.es

Page 21: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

21

DRUPAL 7 API

function dpm

“Imprime unha variable no área de mensaxe do sistema”

https://api.drupal.org/api/devel/devel.module/function/dpm

<?php

/** * Implementa hook_user_login() * */function exemplo01_user_login(&$edit, &account) {

dpm($account);}

Page 22: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

22

DRUPAL 7 API

dpm($account) => hook_user_login

Page 23: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

23

DRUPAL 7 API

function module_exists

“TRUE se existe o módulo”

https://api.drupal.org/api/drupal/includes%21module.inc/function/module_exists/7

<?php

/** * Implementa hook_user_login() * */function exemplo01_user_login(&$edit, &account) {

if ( module_exists('exemplo02') { $list = module_list(); dpm($list);

}}

Page 24: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

24

DRUPAL 7 API

function drupal_get_path

“Retorna o path dun item do sistema”

https://api.drupal.org/api/drupal/includes!common.inc/function/drupal_get_path/7

<?php

$tema = drupal_get_path('theme', 'bartik');

?>

Page 25: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

25

DRUPAL 7 API

function drupal_add_css

“Engade arquivos CSS ”*

https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_css/7

<?php

drupal_add_css(drupal_get_path('module', 'exemplo2') . '/css/custom.css'),

/** * Implementa hook_user_login() * */function exemplo01_user_login(&$edit, &account) {

if ( module_exists('exemplo02') { $list = module_list(); dpm($list);

}}

Page 26: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

26

DRUPAL 7 API Obxecto $user

● 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);

https://api.drupal.org/api/drupal/globals

Page 27: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

27

DRUPAL 7 API Compoñentes do obxecto $userTá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

Compoñentes do obxecto $user

Page 28: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

28

DRUPAL 7 API

profile2user_readonly

Page 29: Curso CDA: Drupal API

6Exercicio

cursos.cixug.es

Page 30: Curso CDA: Drupal API

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

Page 31: Curso CDA: Drupal API

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

Page 32: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

32

DRUPAL 7 API Sistema de menús III

● 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

Asinar URLs a funcións

Page 33: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

33

DRUPAL 7 API Sistema de menús III

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 CALLBACK4)Abrir os obxectos necesarios para pasar ao CALLBACK5)Comprobar se o usuario ten permisos para acceder ao CALLBACK6)Localizar o título e a descripción do elemento de menú para o idioma actual7) Abrir os includes necesarios8)Invocar o CALLBACK e devolver o resultado que index.php pasa por theme_page() , o que xenera unha páxina web determinada.

Análise solicitude Drupal

Page 34: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

34

DRUPAL 7 API Sistema de menús III

Crear elemento de menu con hook_menu

CLAVE VALORtitle 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 traducirtitle 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 URLaccess 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 accesofile 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 fileweight 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

● Matriz de elementos na que cada un é unha matriz de pares nome e valor que definen os seus atributos

Atributos clave valor de hook_menu

Page 35: Curso CDA: Drupal API

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

Page 36: Curso CDA: Drupal API

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 tipohttp://osl.drupal/exemplo02

Ao usar t(), permite traducir a cadea

Page 37: Curso CDA: Drupal API

7Exercicio

cursos.cixug.es

Page 38: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

38

DRUPAL 7 API Formularios

● 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”

Formulario clásico HTML

Page 39: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

39

DRUPAL 7 API Formularios

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

Formulario clásico HTML II

Page 40: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

40

DRUPAL 7 API Formularios

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

API formularios Drupal

Page 41: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

41

DRUPAL 7 API Formularios

● 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

API formularios Drupal II

http://www.samadhicsecurity.com/p/drupal-7-security.html

Page 42: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

42

DRUPAL 7 API Formularios

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

API formularios Drupal III

dpm($form_state)

Page 43: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

43

DRUPAL 7 API Formularios

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

API formularios Drupal IV

Page 44: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

44

DRUPAL 7 API Formularios

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

API formularios Drupal V

Page 45: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

45

DRUPAL 7 API Formularios

/** * 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)));}

API formularios Drupal VI

Page 46: Curso CDA: Drupal API

hook_form_alter

Page 47: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL 2014

47

DRUPAL 7 API

hook_form_alter

“Permite realizar alteración nos formularios antes de renderizalos”

https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_form_alter/7

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

Page 48: Curso CDA: Drupal API

Curso Drupal Avanzado - OSL

48

DRUPAL 7 API Formularios

/** * 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)));}

API formularios Drupal VI

Page 49: Curso CDA: Drupal API

8Exercicio

cursos.cixug.es