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:
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).
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:
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 bloco
return $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="{donatepagseguro_btns}" 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 bloco
switch ($delta) {
case 0:
// se existir texto de ajuda, coloque-o no conteúdo do bloco
if(variable_get('donatepagseguro_ajuda', '') != '') {
$block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>';
};
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 bloco
switch ($delta) {
case 0:
// se existir texto de ajuda, coloque-o no conteúdo do bloco
if(variable_get('donatepagseguro_ajuda', '') != '') {
$block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>';
};
// utiliza o botão selecionado pelo usuário
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="'. variable_get('donatepagseguro_linkbotao','https://pagseguro.uol.com.br/Imagens/btndoacao.jpg') .'" name="submit" alt="Faça uma doação com PagSeguro" />';
}
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 bloco
switch ($delta) {
case 0:
// se existir texto de ajuda, coloque-o no conteúdo do bloco
if(variable_get('donatepagseguro_ajuda', '') != '') {
$block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>';
};
// utiliza o botão selecionado pelo usuário
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="'. variable_get('donatepagseguro_linkbotao','https://pagseguro.uol.com.br/Imagens/btndoacao.jpg') .'" 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>
';
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 bloco
switch ($delta) {
case 0:
// se existir texto de ajuda, coloque-o no conteúdo do bloco
if(variable_get('donatepagseguro_ajuda', '') != '') {
$block_content = '<div class="info">' . variable_get('donatepagseguro_ajuda', '') . '</div>';
};
// utiliza o botão selecionado pelo usuário
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="'. variable_get('donatepagseguro_linkbotao','https://pagseguro.uol.com.br/Imagens/btndoacao.jpg') .'" 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>
';
// set up the block
$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:

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

Siimmm, meus amigos, eu estou de volta!
Acabei de chegar em casa, voltando de Campinas-SP, onde rolou o 2º DrupalCamp, o grande encontro de drupaleiros de todo o Brasil!
O evento foi realizado durante o dia de ontem, dia 18 de Abril, na UNICAMP, e organizado pelo Fabiano Sant'Ana e o resto do pessoal da Chuva Inc.
O quadro de palestras foi bem diversificado, dividido em palestras para iniciantes, palestras sobre comunidades, e palestras de desenvolvimento. A minha escolha ficou para palestras de desenvolvimento, off course ;-).
O evento foi excelente, mas infelizmente não foi perfeito. Sei que o pessoal da Chuva fez o melhor possível, mas bem, shit happens, como dizem os yankees. Coisas que não são possíveis de controlar, como atraso dos palestrantes, que no final acabou de atrasar o próprio evento. Outra coisa um pouco chata foi voltar de lá sem nenhuma lembrança, pois as camisas não ficaram prontas a tempo. Mas as palestras foram ótimas no geral (falo delas em seguida) e conhecer pessoalmente os amigos com quem me relaciono a anos no drupal-br não tem preço ;)
1 - Criando Temas (Pedro Faria) - Palestra do grande Pedro, que vive lá no canal do drupal-br na freenode, ahuehuae. Bom esta palestra deveria ser no segundo horário, mas um dos palestrantes do primeiro horário se atrasou e a palestra de Pedro teve que ser adiantada.
Na palestra, o Pedro nos apresentou os fundamentos da criação de temas: explicou o que é um arquivo .info e sua importância para um tema, o arquivo page.tpl.php, que define o que pode-se chamar de "esqueleto" de um tema, o arquivo block.tpl.php, que permite "temificar" um bloco, e por aí vai.
A palestra foi boa, mas se me permitem ser chato e reclamar de algo, acho que ele deveria ter apresentado alguns conceitos que envolvem a criação de temas, como regiões de bloco, o que é um bloco, etc. Mas no geral eu gostei.
2 - Tematizando Views (Leonardo Silva) - Esta palestra deveria ter sido muito boa, apresentada pelo colega Xulispa. Infelizmente aconteceram imprevistos na palestra dele que a deixaram muito lenta e difícil de acompanhar. O Leonardo é um cara muito gente fina, e adorei o show de "abertura" da palestra dele, hehehehe :D
3 - Escrevendo módulos (Lourenzo Ferreira) - Uma palestra muito boa e de muito proveito para mim, que estou estudando exatamente este assunto! Lourenzo foi bem didático e explicou bem o que são e como funcionam os famigerados hooks, o principal "construtor" do Drupal. Também gostei do depoimento dele, que no início ele torcia o nariz pro Drupal, mas que depois do incentivo de um amigo dele, ele percebeu como a ferramenta é flexível e poderosa. E através dele, fiquei sabendo que existe um plugin para o NetBeans que ajuda bastante na programação de módulos.
4 - Desvendando a FormAPI (Pedro Faria) - Outra palestra que se encaixa no meus interesses atuais. A segunda palestra de Pedro foi muito boa, e além de exemplificar a FAPI (apelido da FormAPI), ele demonstrou como vai ser um pai coruja! huahuahua =D.
5 - Restringindo acesso ao seu site, como funciona o node access (Fabrizio Cestari) - esta palestra terminou muito rápido, acho que durou apenas uns 15 minutos. Mas ela mostrou algumas falhas do sistema de permissões do Drupal. Aliás, nem digo que são falhas. Mas os módulos apresentados na palestra estendem de maneira interessante este recurso, já muito eficiente no core.
6 - Novidades do Drupal 7 e Fechamento (Fabiano Sant'Ana) - E para a cereja do bolo, as principais novidades da próxima versão do Drupal. No 7, teremos o CCK, ou pelo menos uma parte dele, no core, suporte a XMPP (Jabber para os não íntimos) e RDF, inclusão do framework de testes simpletest no core, além de algumas melhorias de usabilidade e documentação padrão.
No final, tivemos também um coffee break (tivemos na abertura também, diga-se de passagem), e após o evento, alguns participantes ficaram conversando, e fazendo algumas palhaçadas, que deve aparecer no YouTube logo. Quando uparem o vídeo, divulgarei ele no meu Twitter. Também divulgarei as fotos do evento por lá, assim que eu as tiver em minhas mãos gordas porém limpinhas.
O saldo final foi positivo! O Evento foi ótimo apesar dos pequenos contratempos. Apesar de que este tipo de evento é muito rápido e pouco eficiente para transmitir conhecimento, devido ao tempo limitado para as palestras. Contudo, o principal destaque foi conhecer os colegas do Drupal-br e também a galera da Chuva-Inc, uma das maiores, talvez a maior empresa que trabalha com Drupal no Brasil. São conexões e amizades que com certeza renderão bons frutos no futuro!
E que venham o DrupalCamp 3, 4, 5,..., n+1!
Algumas coisas nesta viagem que merecem algum destaque:
Salve meus amigos!
Dando continuação à série de artigos de como criar um módulo do Drupal. Já tivemos duas partes. Depois de uma semana de atraso, eis que finalmente chega a terceira e penultima parte da série de tutoriais de como criar um módulo totalmente inútil do Drupal.
Vamos agora revisar as interfaces e links que deverão ser criados:
Hoje, vamos criar a página de administração e fazer uma pequena validação.
A página de administração será criada dentro de uma função, que eu chamei de donatepagseguro_admin(). A página de administração é um formulário, onde é possível entrar algumas informações que serão utilizadas na configuração do formulário do botão de doação do PagSeguro.
Este formulário será montado utilizando a Form API do Drupal. Inicialmente pode parecer confuso, mas na verdade é relativamente simples. Para maior compreensão, eu sugiro fortemente a lida do Forms API Quickstart Guide.
Vamos dar uma olhada na página completa, renderizada:
Como podem ver, é um formulário muito simples, que conta com:
Ok, agora vamos começar a montar nosso formulário, começando pelos fieldsets:
function donatepagseguro_admin() {
// configuração inicial do módulo
$form['config_inicial'] = array(
'#type' => 'fieldset',
'#title' => t('Configuração Inicial'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
// selecionando o tipo de botao para pagamento PagSeguro
$form['botoes'] = array(
'#type' => 'fieldset',
'#title' => t('Botões do PagSeguro'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Selecione o botão que deseja utilizar no seu bloco de doações.'),
);
}
Ok, observe que cada item do menu é um item do array $form. Agora vamos esquecer por enquano o item $form['botoes'] (que é o fieldset que agrupa os radioboxes), e nos concentrar no fieldset $form['config_inicial']. Vamos adicionar o campo "email" dentro deste fieldset:
function donatepagseguro_admin() {
// configuração inicial do módulo
$form['config_inicial'] = array(
'#type' => 'fieldset',
'#title' => t('Configuração Inicial'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
$form['config_inicial']['donatepagseguro_email'] = array(
'#type' => 'textfield',
'#title' => t('Email cadastrado'),
'#default_value' => variable_get('donatepagseguro_email',''),
'#size' => 60,
'#maxlength' => 60,
'#description' => t("Informe o email cadastrado no PagSeguro"),
'#required' => TRUE,
);
}
O nome do field inserido é "donatepagseguro_email", e está anexado ao textfield 'config_inicial' ($form['config_inicial']['donatepagseguro_email']). E caras, não vou explicar linha por linha, porque, acredito eu, está auto-explicativo. Além disso o Forms API Quickstart Guide explica bem direitinho isso, apesar de estar tudo em inglês. Algum dia eu prometo traduzir a página.
A única coisa que merece atenção no momento é a função variable_get.
É o seguinte, neste tipo de formulário especificamente, e mais tarde eu vou explicar porquê, cada elemento do formulário (textfield, textarea, checkbox, etc) cria uma variável que é armazenada no sistema, como mesmo nome do campo. O valor desta variável pode ser acessada através da função variable_get(). Você precisa passar para esta função dois valores:
Bom, inicialmente é isso que precisa-se saber sobre variable_get. Continuando, vamos criar agora uma textarea, que será utilizada para inserir um pequeno texto de ajuda, que precederá o botão do PagSeguro:
function donatepagseguro_admin() {
// configuração inicial do módulo
$form['config_inicial'] = array(
'#type' => 'fieldset',
'#title' => t('Configuração Inicial'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
$form['config_inicial']['donatepagseguro_email'] = array(
'#type' => 'textfield',
'#title' => t('Email cadastrado'),
'#default_value' => variable_get('donatepagseguro_email',''),
'#size' => 60,
'#maxlength' => 60,
'#description' => t("Informe o email cadastrado no PagSeguro"),
'#required' => TRUE,
);
$form['config_inicial']['donatepagseguro_ajuda'] = array(
'#type' => 'textarea',
'#title' => t('Texto de ajuda'),
'#default_value' => variable_get('donatepagseguro_ajuda', ''),
'#cols' => 60,
'#rows' => 5,
'#description' => t('Informe um pequeno texto que irá preceder o botão de doações.'),
);
}
Observe que isso apenas gera uma textarea simples, sem filtro de entrada. Vamos agora inserir o filtro de entrada:
function donatepagseguro_admin() {
// configuração inicial do módulo
$form['config_inicial'] = array(
'#type' => 'fieldset',
'#title' => t('Configuração Inicial'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
$form['config_inicial']['donatepagseguro_email'] = array(
'#type' => 'textfield',
'#title' => t('Email cadastrado'),
'#default_value' => variable_get('donatepagseguro_email',''),
'#size' => 60,
'#maxlength' => 60,
'#description' => t("Informe o email cadastrado no PagSeguro"),
'#required' => TRUE,
);
$form['config_inicial']['donatepagseguro_ajuda'] = array(
'#type' => 'textarea',
'#title' => t('Texto de ajuda'),
'#default_value' => variable_get('donatepagseguro_ajuda', ''),
'#cols' => 60,
'#rows' => 5,
'#description' => t('Informe um pequeno texto que irá preceder o botão de doações.'),
);
if (!isset($edit['format'])) {
$edit['format'] = FILTER_FORMAT_DEFAULT;
}
$form['config_inicial']['format'] = filter_form($edit['format']);
}
Ok, os campos deste fieldset foram todos construídos. Agora vamos nos concentrar apenas no fieldset "botoes" ($form['botoes']), que possui um conjunto de radioboxes. Naturalmente não é necessário criar cada item "<input type="radio" />" separadamente. Faremos assim:
function donatepagseguro_admin() {
$form['botoes'] = array(
'#type' => 'fieldset',
'#title' => t('Botões do PagSeguro'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Selecione o botão que deseja utilizar no seu bloco de doações.'),
);
$form['botoes']['donatepagseguro_btns'] = array(
'#type' => 'radios',
'#title' => t('Tipo de botão'),
'#required' => TRUE,
'#default_value' => variable_get('donatepagseguro_btns', 0),
'#options' => array(t('<img src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" alt="opção 1" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" alt="opção 2" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" alt="opção 3" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" alt="opção 4" />'), t('Botão próprio')),
);
}
Duas observações: primeiro, observe o valor padrão dos radioboxes (definido como valor do #default_value). Eu utilizei o variable_get para recuperar o valor selecionado pelo usuário para o botão. Mas caso não exista esta variável "donatepagseguro_btns" (e ela não vai existir antes do usuário apertar "salvar" pela primeira vez), ele vai utilizar como padrão o 0, ou seja vai selecionar o primeiro item dos radios.
A segunda observação é mais importante. Cada radio é definido como o valor de #options, como um item de um array. Abaixo, vou tenta deixar mais organizado para melhor visualização:
'#options' => array(
t('<img src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" alt="opção 1" />'),
t('<img src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" alt="opção 2" />'),
t('<img src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" alt="opção 3" />'),
t('<img src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" alt="opção 4" />'),
t('Botão próprio')
),
Nosso formulário de configuração está quase pronto. Observe que nas opções de radio, a última me permite especificar um link para uma imagem que será utilizada como um botão. Então, vamos criar mais um item no nosso formulário, para que o usuário possa utilizá-lo para informar o link.
function donatepagseguro_admin() {
$form['botoes'] = array(
'#type' => 'fieldset',
'#title' => t('Botões do PagSeguro'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Selecione o botão que deseja utilizar no seu bloco de doações.'),
);
$form['botoes']['donatepagseguro_btns'] = array(
'#type' => 'radios',
'#title' => t('Tipo de botão'),
'#required' => TRUE,
'#default_value' => variable_get('donatepagseguro_btns', 0),
'#options' => array(t('<img src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" alt="opção 1" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" alt="opção 2" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" alt="opção 3" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" alt="opção 4" />'), t('Botão próprio')),
);
$form['botoes']['donatepagseguro_linkbotao'] = array(
'#type' => 'textfield',
'#title' => t('Link para a imagem do botão'),
'#default_value' => variable_get('donatepagseguro_linkbotao',''),
'#size' => 100,
'#description' => t("Informe o endereço completo para a imagem que deseja utilizar como botão de doação"),
'#required' => FALSE,
);
}
Sempre existe a possibilidade do usuário selecionar a opção de usar um botão personalizado, mas não informar um link. Mas para isso, vamos fazer uma pequena validação neste formulário para evitar este tipo de contra-tempo.
Bom, a nossa página de administração está quase completa, mas falta um item imprescindível, para informar ao Drupal que este formulário é um formulário de sistema, e que para cada item de formulário deve ser gerada uma variável com o valor do mesmo. Isso será feito retornando a variável $form dentro da função system_settings_form. Abaixo eu vou colocar o código completo da função donatepagseguro_admin(), com a adição do system_settings_form:
function donatepagseguro_admin() {
// configuração inicial do módulo
$form['config_inicial'] = array(
'#type' => 'fieldset',
'#title' => t('Configuração Inicial'),
'#collapsible' => TRUE,
'#collapsed' => FALSE
);
$form['config_inicial']['donatepagseguro_email'] = array(
'#type' => 'textfield',
'#title' => t('Email cadastrado'),
'#default_value' => variable_get('donatepagseguro_email',''),
'#size' => 60,
'#maxlength' => 60,
'#description' => t("Informe o email cadastrado no PagSeguro"),
'#required' => TRUE,
);
$form['config_inicial']['donatepagseguro_ajuda'] = array(
'#type' => 'textarea',
'#title' => t('Texto de ajuda'),
'#default_value' => variable_get('donatepagseguro_ajuda', ''),
'#cols' => 60,
'#rows' => 5,
'#description' => t('Informe um pequeno texto que irá preceder o botão de doações.'),
);
if (!isset($edit['format'])) {
$edit['format'] = FILTER_FORMAT_DEFAULT;
}
$form['config_inicial']['format'] = filter_form($edit['format']);
// selecionando o tipo de botao para pagamento PagSeguro
$form['botoes'] = array(
'#type' => 'fieldset',
'#title' => t('Botões do PagSeguro'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('Selecione o botão que deseja utilizar no seu bloco de doações.'),
);
$form['botoes']['donatepagseguro_btns'] = array(
'#type' => 'radios',
'#title' => t('Tipo de botão'),
'#required' => TRUE,
'#default_value' => variable_get('donatepagseguro_btns', 0),
'#options' => array(t('<img src="https://pagseguro.uol.com.br/Imagens/btndoacao.jpg" alt="opção 1" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btndoar.jpg" alt="opção 2" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/btncontribuicao.jpg" alt="opção 3" />'), t('<img src="https://pagseguro.uol.com.br/Imagens/FacaSuaDoacao.gif" alt="opção 4" />'), t('Botão próprio')),
);
$form['botoes']['donatepagseguro_linkbotao'] = array(
'#type' => 'textfield',
'#title' => t('Link para a imagem do botão'),
'#default_value' => variable_get('donatepagseguro_linkbotao',''),
'#size' => 100,
'#description' => t("Informe o endereço completo para a imagem que deseja utilizar como botão de doação"),
'#required' => FALSE,
);
return system_settings_form($form);
}
Observe que eu não criei nenhum botão de envio de formulário. Isso não é necessário quando o formulário é um "System Settings Form". Neste caso, os botões "Salvar configurações / Restaurar configurações padrão" são gerados automaticamente.
Agora, vamos validar o formulário acima. Será uma validação Server-side, e ela vai verificar, basicamente:
Isso será feito, naturalmente, utilizando um hook, o hook _validate. o nome da função será o nome da função que será validada, acrescida de "_validate":
function donatepagseguro_admin_validate($form, &$form_state) {
}
Vamos verificar se o campo donatepagseguro_email é vazio ou não:
function donatepagseguro_admin_validate($form, &$form_state) {
if($form_state['values']['donatepagseguro_email'] == '') {
form_set_error('donatepagseguro_email', t('Você precisa informar o seu email cadastrado no PagSeguro.'));
};
}
A função form_set_error vai marcar o campo "donatepagseguro_email" e vai exibir uma mensagem "Você precisa informar o seu email cadastrado".
Por fim, vamos validar o link do botão personalizado.
function donatepagseguro_admin_validate($form, &$form_state) {
if($form_state['values']['donatepagseguro_email'] == '') {
form_set_error('donatepagseguro_email', t('Você precisa informar o seu email cadastrado no PagSeguro.'));
};
$tipobtn = $form_state['values']['donatepagseguro_btns'];
$linkbtn = $form_state['values']['donatepagseguro_linkbotao'];
if (($tipobtn == 4) and ($linkbtn == '')) {
form_set_error('donatepagseguro_linkbotao', t('É Necessário que você informe o endereço da imagem que será utilizada como botão.'));
};
}
Eu armazenei os valores dos campos "donatepagseguro_btns" e "donatepagseguro_linkbotao" nas variáveis $tipobtn e $linkbtn, respectivamente, para facilitar a comparação.
O que eu fiz é simples, eu testei se $tipobtn é igual a 4 (já que a opção "Botão próprio" é o quinto rádio - lembre-se que o primeiro item de um array fica na posição zero) e se $linkbtn é igual a vazio. Se atender estas expectativas, o sistema, através da função form_set_error, irá marcar o campo donatepagseguro_linkbotao e exibir uma mensagem de erro.
Bom gente, é isso.
Semana que vem terminaremos o nosso módulo, criando os blocos e também criando o item do menu que irá apontar para a página de administração.
Até lá!
copyright © Marcus VBP, Todos os direitos reservados
Permitida a cópia desde que citado a fonte. [Política de Privacidade]
Powered by Drupal CMS.
Comentários recentes
15 minutos 17 segundos atrás
2 horas 5 minutos atrás
1 dia 18 horas atrás
2 dias 5 horas atrás
2 dias 18 horas atrás
3 dias 3 horas atrás
5 dias 2 horas atrás
1 semana 4 dias atrás
1 semana 4 dias atrás
1 semana 5 dias atrás