Desenvolvendo um módulo do Drupal, parte Final (ou seria o Início?)
Saudações, meus amigos!
Desculpem a demora para retornar a série de tutoriais, que deveria ser semanal, mas sabem como é, imprevistos acontecem... De qualquer forma, aqui eu estou para terminar este tutorial.
Vamos agora revisar as interfaces e links que deverão ser criados:
- Um bloco, com duas exibições: o bloco propriamente dito, e também a listagem na página de administração de blocos;
- Uma página de administração; (feito)
- Um link para a página de Administração;
- Uma página de ajuda (feito);
- A configuração de permissões do bloco (qual papel de usuário poderá acessar a página de administração) (feito);
- A configuração de permissões do bloco (qual papel de usuário poderá acessar a página de administração) (feito);
Para finalizar, vamos criar o link do menu para a página de administração, e também a cereja do bolo, que é a criação do bloco (afinal, este módulo inútil só serve para isso).
Criando um item de menu com o hook menu
A esta altura do campeonato, vocês já devem ter percebido que o Drupal gosta muito de Arrays. De fato, praticamente tudo no módulo ou é um hook (uma função pré-definida) ou um Array.
Para criar o item do menu não será diferente. Veja o código abaixo:
function donatepagseguro_menu() {
$items = array();$items['admin/settings/donatepagseguro'] = array( // o endereço da página
'title' => 'Donate PagSeguro', // O texto do link
'description' => 'Configure sua conta PagSeguro e selecione o tipo de botao que sera utilizado no bloco de doacoes PagSeguro', // um texto de explicação que será exibido quando o mouse repousar alguns segundos sobre o link (ou seja, o valor do atributo "title" da tag <a>)
'page callback' => 'drupal_get_form', // como ele irá recuperar a informação para construir a página, ou seja, ele vai pegar o formulário ("get_form")
'page arguments' => array('donatepagseguro_admin'), // o nome da função que contém a página de administração
'access arguments' => array('Administrar Donate PagSeguro'), // Qual a permissão que deverá estar marcada para o usuário acessar a página
'type' => MENU_NORMAL_ITEM, // qual o tipo de link (no caso, é um item normal de menu)
);return $items;
}
Lembrando que o parâmetro type, se não for especificado, o sistema adotará como valor padrão MENU_NORMAL_ITEM.
Bem simples né? Nem tem muito o que explicar.
Agora, para completar o módulo, vamos criar o bloco onde será exibido nosso botão de doação do PagSeguro.
A primeira coisa que precisamos saber sobre como criar um bloco, é que ele pode ser exibido de várias formas e em cantos diferentes. Mas nosso bloco aparece numa lista, na página de administração (/admin/build/blocks), e aparece como um bloco convencional, onde eu quiser.
A informação que será exibida em cada visualização é recuperada através do valor do parâmetro $op. Os valores possíveis para este parâmetro são:
- 'list':A lista de todos os blocos definidos pelos bloco.
- 'configure': O formulário de configuração do bloco.
- 'save': Salva a configuração do bloco.
- 'view': Processa o bloco quando o mesmo está habilitado em uma região, a fim de exibir o seu conteúdo.
O início do nosso bloco fica assim:
function donatepagseguro_block($op = 'list', $delta = 0, $edit = array()) {
// list the blocks
switch ($op) {
case 'list':
$block[0] = array(
'info' => t('Faca uma doacao via PagSeguro'),
);
return $block;
case 'view':
// conteudo do blocoreturn $block;}
} // end donatepagseguro_block
Com isso, criamos o básico do módulo. Testamos o valor de $op, Se ele for igual a list, vai retornar um Array (óbvio), com um único parâmetro, info, que é o textinho que identifica o bloco na página /admin/build/blocks.
Se o valor de $op for igual a view, ele vai exibir o conteúdo do bloco, que é um formulário. Vou descrever o formulário abaixo, em HTML simples, e onde é variável (cuja definição de valores é feita pela administração do módulo) eu vou deixar em evidência:
<div class="info">{donatepagseguro_ajuda}</div>
<form action="https://pagseguro.uol.com.br/security/webpagamentos/webdoacao.aspx" method="post">
<fieldset>
<input type="hidden" name="email_cobranca" value="{donatepagseguro_email}" />
<input type="hidden" name="moeda" value="BRL" />
<input type="image" src="http://marcusvbp.com.br/site/%3Cstrong%3E%7Bdonatepagseguro_btns%7D%3C/s..." name="submit" alt="Faça uma doação com PagSeguro" />
</fieldset>
</form>
Como vamos recuperar o valor destas variáveis? Simples, usando a função variable_get(). Esta função recupera o valor de uma variável, e fornece um valor alternativo, caso a variável não tenha sido criada.
Vamos começar implementando o texto de ajuda, que será exibido antes do botão:
function donatepagseguro_block($op = 'list', $delta = 0, $edit = array()) {
// list the blocks
switch ($op) {
case 'list':
$block[0] = array(
'info' => t('Faca uma doacao via PagSeguro'),
);
$block[1] = array(
'info' => t('Faca uma doacao via PagSeguro - usuario'),
);
return $block;
case 'view':
// conteudo do blocoswitch ($delta) { case 0: <em> // se existir texto de ajuda, coloque-o no conteúdo do bloco</em> <strong>if(variable_get('donatepagseguro_ajuda', '') != '') { $block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>'; };</strong> break; } return $block;}
} // end donatepagseguro_block
Agora, vamos testar o valor da variável donatepagseguro_btns, que pode ter vários valores:
function donatepagseguro_block($op = 'list', $delta = 0, $edit = array()) {
// list the blocks
switch ($op) {
case 'list':
$block[0] = array(
'info' => t('Faca uma doacao via PagSeguro'),
);
$block[1] = array(
'info' => t('Faca uma doacao via PagSeguro - usuario'),
);
return $block;
case 'view':
// conteudo do blocoswitch ($delta) { case 0: <em> // se existir texto de ajuda, coloque-o no conteúdo do bloco</em> if(variable_get('donatepagseguro_ajuda', '') != '') { $block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>'; }; <em>// utiliza o botão selecionado pelo usuário</em> <strong>switch (variable_get('donatepagseguro_btns',0)) { case 0: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 1: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 2: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 3: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 4: $donatepagseguro_btn = '<input type="image" src="http://marcusvbp.com.br/site/%27.%20variable_get%28%27donatepagseguro_linkbotao%27%2C%27https%3A//pagseguro.uol.com.br/Imagens/btndoacao.jpg%27%29%20.%27" name="submit" alt="Faça uma doação com PagSeguro" />'; }</strong> break; } return $block;}
} // end donatepagseguro_block
Vamos definir o resto do formulário:
function donatepagseguro_block($op = 'list', $delta = 0, $edit = array()) {
// list the blocks
switch ($op) {
case 'list':
$block[0] = array(
'info' => t('Faca uma doacao via PagSeguro'),
);
$block[1] = array(
'info' => t('Faca uma doacao via PagSeguro - usuario'),
);
return $block;
case 'view':
// conteudo do blocoswitch ($delta) { case 0: <em> // se existir texto de ajuda, coloque-o no conteúdo do bloco</em> if(variable_get('donatepagseguro_ajuda', '') != '') { $block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>'; }; <em>// utiliza o botão selecionado pelo usuário</em> switch (variable_get('donatepagseguro_btns',0)) { case 0: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 1: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 2: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 3: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 4: $donatepagseguro_btn = '<input type="image" src="http://marcusvbp.com.br/site/%27.%20variable_get%28%27donatepagseguro_linkbotao%27%2C%27https%3A//pagseguro.uol.com.br/Imagens/btndoacao.jpg%27%29%20.%27" name="submit" alt="Faça uma doação com PagSeguro" />'; } <strong>$block_content .=' <form action="https://pagseguro.uol.com.br/security/webpagamentos/webdoacao.aspx" method="post"> <fieldset> <input type="hidden" name="email_cobranca" value="'. variable_get('donatepagseguro_email','') .'" /> <input type="hidden" name="moeda" value="BRL" /> '. $donatepagseguro_btn .' </fieldset> </form> ';</strong> break; } return $block;}
} // end donatepagseguro_block
Por fim, vamos definir o bloco:
function donatepagseguro_block($op = 'list', $delta = 0, $edit = array()) {
// list the blocks
switch ($op) {
case 'list':
$block[0] = array(
'info' => t('Faca uma doacao via PagSeguro'),
);
$block[1] = array(
'info' => t('Faca uma doacao via PagSeguro - usuario'),
);
return $block;
case 'view':
// conteudo do blocoswitch ($delta) { case 0: <em> // se existir texto de ajuda, coloque-o no conteúdo do bloco</em> if(variable_get('donatepagseguro_ajuda', '') != '') { $block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>'; }; <em>// utiliza o botão selecionado pelo usuário</em> switch (variable_get('donatepagseguro_btns',0)) { case 0: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 1: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 2: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 3: $donatepagseguro_btn = '<input type="image" src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" name="submit" alt="Faça uma doação com PagSeguro" />'; break; case 4: $donatepagseguro_btn = '<input type="image" src="http://marcusvbp.com.br/site/%27.%20variable_get%28%27donatepagseguro_linkbotao%27%2C%27https%3A//pagseguro.uol.com.br/Imagens/btndoacao.jpg%27%29%20.%27" name="submit" alt="Faça uma doação com PagSeguro" />'; } $block_content .=' <form action="https://pagseguro.uol.com.br/security/webpagamentos/webdoacao.aspx" method="post"> <fieldset> <input type="hidden" name="email_cobranca" value="'. variable_get('donatepagseguro_email','') .'" /> <input type="hidden" name="moeda" value="BRL" /> '. $donatepagseguro_btn .' </fieldset> </form> '; <em>// set up the block</em> $block = array( 'subject' => 'Faça uma doação', 'content' => $block_content, ); break; } return $block;}
} // end donatepagseguro_block
Pronto, nosso bloco está funcional, e sendo exibido na página:

O Fim, ou seria o Começo?
Bom galera, chegamos ao fim da série de tutoriais de com o criar um módulo do Drupal. Eu disse aqui várias vezes que o resultado final do módulo é inútil, mas de certa forma eu estava sendo incorreto. O módulo serviu para que eu tivesse um primeiro contato com esta área do Drupal, que antes para mim era quase um mistério completo. Espero que os tutoriais também sirvam para introduzi-los no ambiente de desenvolvimento proporcionado pelo Drupal.
No mais, gostaria de dizer que em breve irei iniciar uma outra série de desenvolvimento de módulo, desta vez de algo útil, e que me fez conhecer mais aspectos da criação de módulos.
Criar este módulo abriu minha cabeça para várias possibilidades, inclusive estou com planos para desenvolver mais módulos, coisas simples que por ter um público mais restrito (como por exemplo, programas de afiliados brasileiros, que só interessam aos brasileiros) não possuem um módulo, e a configuração precisa ser feita de uma maneira mais capenga.
Eu criei um módulo que integra o Hotwords ao site, apenas em Node Types selecionados na administração, e também possui uma configuração por usuário, o que é muito útil para blogs ou sites multi-usuário que desejam dar a chance para alguns usuários, os que possuem permissão, de ganhar algo com o conteúdo produzido por eles.
Eu pretendo em breve destrinchar a criação deste módulo, pois ele aborda tópicos que não foram abordados aqui. Talvez o próximo tutorial vá demorar um pouco, pois estou com a agenda um pouco cheia, e estou com planos de alterar meu layout e também adequar mais o blog para receber tutoriais, então provavelmente irei passar algumas semanas sem dar notícia.
Então, até breve (eu espero) e aguardem boas novidades!!