Drupal para
desenvolvedores


introdução
-
Ferramentas e recursos disponíveis para desenvolvedores,;
- Anatomia de módulos do Drupal
- Implementação dos hooks mais comuns do Drupal
- Interação com o sistema de Menu do Drupal
- formulários no Drupal
- Abstração de Banco de Dados com Drupal
ferramentas
- LAMP
- Linux, Apache, MySQL, PHP
- Sublime Editor
- Baixe: http://www.sublimetext.com/3
- Config: https://drupal.org/node/1346890
- Chive ou PHPmyAdmin
- http://www.phpmyadmin.net/home_page/index.php
- http://www.chive-project.com
- Terminal
- Padrão do Linux
- Terminator
- Drush
-
http://drupaldeelite.com.br/blog/instalacao-do-drupal-com-drush
- Instale o Drupal padrão
- drush si -y --db_url=mysql://[user]:[pass]@localhost/[db]
o modulo devel
- debugging
- geração de conteúdo de testes
-
análise de queries
- Baixar: drush dl devel
- drush en devel
debugging de entidades
Blocos do devel
- Development block
- Lista de links para páginas e funcionalides como:
- Configurações
- Documentação
- Debugging de objetos
- Limpar o Cache
- etc...
- Switch User Block
- Troca de usuários com dois clicks
- Execute PHP
- Textarea para executar php no backend
Funções para debug
- dsm($var, $label)
- Mostra qualquer variável em krumo na interface
- coloca o krumo na area de mensagens
- **nao funciona bem na camada de theme
- kpr($var)
- Mostra qualquer variável em krumo na interface
- coloca o krumo no topo do body
- dd($var, $label)
- Mostra qualquer variável em formato de linha de comando
- Salva debug no arquivo drupal_debug.txt dentro da file tmp dir configurada no drupal
query logging
- Completo com tempo de query
- Função que executou a query
- Ordenação
- Configuração
- /config/development/devel
- Display query logger
tracing erros
- ddebug_backtrace
- Settings
- /config/development/devel
- Error handlers: Krumo backtrace
Demais ferramentas do devel
- Reconstrução do theme registry em toda página
- Para que novas implementações de hooks de temas entrem em efeito sem limpar manualmente
- Utilização de memória
- Mostra quanta memória foi utilizada para construir a página
- Setting: Display memory usage
- Tempo de execução
- Mostra quanto tempo levou para executar a página
- Geração de COnteúdo para Testes
- Devel Generate, Config -> Development -> Generate Content
documentação da api do drupal
Documentação de todo o código disponível online, com uma busca excelente, incluindo tutoriais e explicação conceituais sobre os vários sistemas do Drupal.
http://api.drupal.org
Drupal Reference API
Versão
Parametros
Retorno
Snippets
- Referencias
tutoriais e discussões
Tutorias
-
Livros disponíveis online explicando conceitos das várias APIs do Drupal
Discussões
Grupos de usuários e desenvolvedores focados em diferentes areas e aspectos de sites contribuindo conhecimento.
- Documentação de módulo
a anatomia de um módulo do drupal
tipos de módulos
Core
Block, Node, User
Contrib
Views, Pathauto, Media
Custom
- Seu próprio modulo aqui! :)
drupal framework
Sistema de Hooks
Eventos
Modificações
Drupal API
Form API
Database API
File API
Fields API
Schema API
- Sistema de temas
diretórios de módulos
O primeiro passo é colocar esse módulo no lugar certo. Esse lugar é sempre dentro da pasta:
sites/all/modules
Por padrão sempre criamos 2 pastas dentro da pasta modules:
sites/all/modules/contrib para os módulos baixados do drupal.org
sites/all/modules/custom para os nossos
arquivos obrigatórios
O segundo passo na criação de um módulo é a criação de 2 arquivos
-
.info: contém informações básicas como nome do módulo, descrição, versão e dependencias
https://drupal.org/node/542202
.module: o arquivo base para criação do código e implementação dos hooks
Vamos criar nosso modulo
o sistema de hooks de eventos
Hooks
Permitem a um módulo interagir com o drupal core. Para isso só é preciso implementar uma função com um nome padrão, por exemplo:
hook_node_insert
meumodulo_node_insert
tipos de hooks
Existem básicamente 2 tipos de hooks:
Eventos: São chamados em determinados eventos do drupal, como login de usuário, inserção de conteúdo ou edição de um usuário
-
Alteração: São chamados para modificar algum comportamento padrão do drupal, como modificar um formulário ou um item de menu.
meumodule_form_alter(&$form, &$form_state)
exemplo
Mostrando uma mensagem após o login:
meumodulo_user_login(&$edit, $account) {
drupal_set_message(t('Olá, @name', array('@name' => $account->name)));
}
dicas de código seguro
vulnerABILIDADES
- XSS - Cross-site scripting
- Execução de código não autorizado
- XSFR - Fraude de request cross-site
- Execução remota para usuários logrados
- SQL Injection
- Variáveis maléficas inseridas em queries do banco de dados
como o drupal lida com input
- Dados são salvos em sua forma cru no DB.
- Dados são sanitizados na saída
- Formatos de texto
- A responsabilidade é dos desenvolvedores
- Drupal fornece ferramentas que você deve utilizar
formatos de texto
- admin/config/content/
formats
-
Filtros de Plain Text
Exibe qualquer HTML como texto limpo<div class=”blue”>Hello!</div> torna
<div class="blue">Hello!</ div>
formatos de texto
-
/admin/config/content/
formats
-
Filtered HTML Filters
- Limite as HTML tags permitidas
<a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
- Eventos e URLs de JavaScript e CSS sáo sempre retirados
- <div class=”blue”>Hello!</div> vira Hello!
- <code class="blue" style="border:1px;">Hello!</code> vira <code class=”blue”>Hello!</code>
formatos de texto
-
/admin/config/content/
formats
-
Full HTML Filters
como lidar com output
-
A responsabilidade é do desenvolvedor
- O drupal te da as ferramentas, você deve utiliza-las
sanitize o output
http://api.drupal.org/api/drupal/includes--
common.inc/group/sanitization/7
- check_plain()
- check_markup()
- check_url() & l()
- t()
- filter_xss()
- filter_xss_admin()
check_plain($text)
-
Deve ser utilizado quando inserindo texto puro dentro do HTML. Nada de HTML passa.
- Utiliza caractéres especiais ao invez de HTML. <a href='test'>Test</a> vira <a href='test'>Test</a>
check_markup( $text, $format_id =
NULL, $langcode = '', $cache = FALSE)
-
Deve ser utilizado quando iserindo texto rico (rich text, HTML) em HTML.
- Permite que voce especifique o ID do formato que corresponde ao "formato de texto" que voce quer utilizar.
- Padrão utilizado é aquele configurado no sistema.
- Ex.: $newtext = check_markup($text, ‘filtered_html’);
check_url($uri) e l($text, $path, array $options = array())
-
check_url() retira protocolos inseguros (e.g.
-
Permite 'ftp', 'http', 'https', 'irc', 'mailto', 'news',
'nntp', 'rtsp', 'sftp', 'ssh', 'tel', 'telnet', 'webcal'
- l() contrói um link HTML completo utilizando a função url() para o atributo href e também sanitiza o título do link.
t($string, $args = array(), $options = array())
- Permite tradução de strings.
- Deve-se utilizar substituição e variáveis substituição para QUALQUER variável.
- $text = t("@name's blog", array('@name' => format_username($account)));
- !variable: Inserida como esta. Utilize essa função SOMENTE para texto já sanitizado.
- @variable: Saída para HTML urilizando check_plain(). Utilize para qualquer coisa a ser exibida na pagina.
- %variable: Saída como placeholder para conteúdo submetido por usuários utilizando drupal_placeholder(), exibindo como texto em ênfase <em>emphasized</em> .
filter_xss($string, $allowed_tags = array('a', 'em', 'strong', 'cite', 'blockquote', 'code', 'ul', 'ol', 'li', 'dl', 'dt', 'dd'))
- Filtra string HTML para previnir vulnerabilidades de cross-site-scripting (XSS) Filters an HTML string to prevent cross-site-scripting (XSS).
- Remove caracteres e estruturas que exploram vulnerabilidades de browsers.
- Certifica que
- todos elementos HTML estão bem formados.
- todas tags e atributos HTML estão bem formados.
- Nenhuma tag HTML contem URLs de protocolos perigosos (e.g. javascript:).
filter_xss_admin($String)
- Filtro bastante permissivo em relação a XSS/HTML e deve ser utilizado somente em interfaces administrativas.
- Utilize somente para campos quais a utilização do sistema de filtragem completo não é pratica, entretanto, onde algum markup é necessário (portanto, a utilização de check_plain não é aceitável)
- Permite que todas tags sejam utilizadas dentro do body do HTML. Guarde para scripts e styles.
enviando Email
-
drupal_mail(
- Envio de email funciona com a definição de um template (assunto, texto, e possivelmente headers de email) e valores para substituição nos locais corretos no template.
- Não permite a injeção de Headers
- Usuários não conseguem inserir um Bcc no assunto
Drupal Forms
- A Forms API (FAPI) do Drupal protege contra XSRF utilizando um sistema de sessão e token que valida os dados do POST.
SQL Injection
- O query builder, qual possui substituição de variáveis, utiliza a Database API para lidar com os dados de forma segura.
- db_merge('example') ->key(array('name' => $name)) ->fields(array( 'field1' => $value1, 'field2' => $value2,)) ->execute();
limpe todo dado fornecido por usuarios na saida!!!
- Não confie nas pessoas.
- Utilize as ferramentas que o Drupal lhe fornece para proteger seu site contra vulnerabilidades
- documentação: http://drupal.org/writing-secure-code
o sistema de menu do drupal
- Client faz um request
- Server chama o index.php
- Faz o bootstrap
- Conecta com o banco
- Instancia o usuario
- Pede a URLs para os módulos
- Qualquer modulo pode registrar um caminho
hook_menu
roteamento
- O caminho é um alias?
- Qual é o módulo responsável pelo caminho
- Que função eu chamo?
- O usuário tem acesso?
o callback
- Retorna a resposta para o Drupal
- Se voce nao retorna algo, o Drupal assume 404
- O Drupal pega isso e envia para a camada de Tema
- Então o Drupal devolve para o Client.
vamos criar nossa pagina
- Item de menu
- title
- callback
- access
- No callback
- Elemento simples
utilizando argumentos de url em
page callbacks
- Variáveis em URLs
- Callback em arquivo separado
- Tipos de Itens de menu
VARIÁVEIS em urls - argumentos
VARIÁVEIS EM URLS - callback
callbacks em arquivo separado
tipos de itens de menu
- MENU_NORMAL_ITEM: Sao inseridos na arvore de menu e podem ser movidos ou ocultados por admins.
- MENU_CALLBACK: Simplemente registra um caminho que retorna algo.
- MENU_SUGGESTED_ITEM: Modulos podem sugerir itens de menu que admins podem habilitar.
- MENU_LOCAL_ACTION: Descrevem acoes que usuarios podem realizar no item pai, como por exemplo editar. Sao disponibilizados como action links.
- MENU_LOCAL_TASK: Tabs
- MENU_DEFAULT_LOCAL_TASK: Todos set de Tabs deve ter um default.
criando uma tab
links de menu contextuais e autoloaders
- Adicionar links em widget contextuais para elementos nas paginas
- Carregar objetos através de argumentos de URL
Links contextuais
- Crie um novo node
- promote to front page
- Novo item de menu
- // node_load(%)
- $items['node/%node/magic'] = array(
- 'title' => 'Magic',
- 'description' => 'Do amazing and magical things',
- 'page callback' => 'menu_magic_node_context',
- 'page arguments' => array(1),
- 'access arguments' => array('access content'),
- 'file' => 'menu_magic.context.inc',
- 'type' => MENU_LOCAL_TASK,
- 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
- );
Autoloaders
utilizando o render api
- Estrutura de dados recursiva (n-dimensional array) que representa elementos a serem apresentado
- # representa um atributo do element
- Sem o #, define um filho do elemento, que por sua vez é um elemento também
- Documentação
-
https://drupal.org/node/930760
- Form elements
- http://tinyurl.com/n7d9arj
- Theme function como elementos
render element - simples
Render element com theme function
attachments em render elements
- Possibilita que recursos como CSS e JS sejam carregados com os elementos que necessitam dos mesmos.
- Atributo #attached
cache de render elements
- Atributo #cache
alterando o page array
integrando com o theme system
Novo modulo - spyglass
modulo spyglass - helper
Chamando nossa theme function
// custom theme function call
hook_theme
a função que responde pelo theme item
templates ao invez de função
template
Hook_preprocess
template ou função?
- Use funções quando o output requer bastante lógica e pouco HTML
- Use template quando o output possui bastante HTML e deixe a lógica no preprocess
o form api
Descreve formulários como arrays
O Drupal se encarrega do processo e workflow
Criação
Cacheamento
Validação
Submissão
Drupal da mais segurança
Comparação de input
Token
Drupal Rederiza e apresenta
criando formularios
validando formularios
form_set_error e display de menssagens
SUBMISSÃO do formulario
organizando elementos de formularios
-
fieldset element type
- pode incluir N children
- #tree attribute
- Explicita relação entre elementos pai e filhos
organizando elementos do formulario
alteração de formularios
formulario de configuração o módulo
overview do database layer
queries no banco de dados com db_select
adicionando tabelas no banco de dados
adicionando tabelas no banco de dados
alteração do banco de dados
obrigado!
Drupal para desenvolvedores
By Vinicius Freitas
Drupal para desenvolvedores
- 1,302