Marcus VBP

Desenvolvimento de Interfaces WEB

Comentários recentes

Desenvolvimento um módulo do Drupal: parte 3

05 ABR 2009

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:

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

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:

O formulário renderizado

Como podem ver, é um formulário muito simples, que conta com:

  • Fieldset: Configuração Inicial;
    • Textfield: Email Cadastrado
    • Textarea (com filtro de entrada): texto de ajuda;
  • Fieldset: Botões do PagSeguro;
    • Radios: várias opções de aparência de botão;
    • Textfield: link para o botão personalizado, caso o usuário selecione a opção de usar botão personalizado;
  • Botões: Salvar configurações / Restaurar configurações padrão;

Ok, agora vamos começar a montar nosso formulário, começando pelos fieldsets:

citação:

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:

citação:

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:

  1. O nome do field que você está recuperando o valor;
  2. O valor alternativo, caso o valor do field seja nulo;

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:

citação:

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:

citação:

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:

citação:

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:

citaçã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.

citação:

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:

citação:

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.

Validando o formulário

Agora, vamos validar o formulário acima. Será uma validação Server-side, e ela vai verificar, basicamente:

  • Se o email está em branco;
  • Se o usuário selecionou a opção rádio "Botão próprio". Se sim, o campo "donatepagseguro_linkbotao" não pode ser vazio.

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

citação:

function donatepagseguro_admin_validate($form, &$form_state) {

}

Vamos verificar se o campo donatepagseguro_email é vazio ou não:

citaçã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.

citaçã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.'));
};

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

RSS dos coment?ios deste post

3 Comentários:

imagem de fabio

1. fabio*

Disse em sex, 08/05/2009 - 12:34

esse artigo tem 4° parte

imagem de Carolina

2. Carolina*

Disse em sab, 26/09/2009 - 15:16

Bom Dia Marcus, tudo bem?
Estava navegando an internet e descobri que você já realizou alguns estudos sobre "como ganhar dinheiro com blogs", correto?
Sou estudante de jornalismo e estou fazendo uma matéria sobre o assunto. Gostaria de entrevistá-lo.
Se estiver disposto entre em contato comigo pelo email carolinacagno@hotmail.com?
Obrigada.

imagem de b&amp;b venice

3. b&b venice*

Disse em qua, 14/10/2009 - 09:02

Olá!
Algum tempo atrás eu ainda blog, apesar de eu não ter comentado. Eu estou aprendendo a usar o Drupal (para um pouco!). Eu peço uma coisa, não relacionado a este artigo ...
Eu quero ganhar dinheiro com meu blog, mas estou tendo problemas. Para mim, é pela colocação de anúncios, que são os melhores lugares para colocar os anúncios do Google?

Obrigado!

Enviar novo comentário

O conteúdo deste campo é privado não será exibido publicamente.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Você pode citar outras contribuições usando marcações [quote].
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Linhas e parágrafos quebram automaticamente.

copyright © Marcus VBP, Todos os direitos reservados

Permitida a cópia desde que citado a fonte. [Política de Privacidade]

Powered by Drupal CMS.