 |
Roteiro do Módulo:
Diretivas Perl típicas de CGI
Obter dados de formulários
Enviar dados de formulário como email
Enviar código HTML ao navegador |
Obter dados de formulários
|
Pode-se utilizar o código Perl a seguir para obter dados de um formulário HTML através de CGI. Note que não se trata de um programa completo, mas sim, de um módulo acabado que pode ser inserido num programa. Aliás, habitue-se a escrever programas em módulos: é mais rápido, contém menos erros e é mais eficiente. Código Perl:
if($ENV{'REQUEST_METHOD'} eq 'GET') {
$Dados = $ENV{'QUERY_STRING'}
} else {
read(STDIN, $Dados, $ENV{'CONTENT_LENGTH'});
}
@CamposForm = split(/&/, $Dados);
foreach $Campo (@CamposForm) {
($nome, $valor) = split(/=/, $Campo);
$valor =~ tr/+/ /;
$valor =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$valor =~ s/<!--(.|\n)*-->//g;
$Form[$i] = $nome;
$i = $i + 1;
$Form[$i] = $valor;
$i = $i + 1;
}
O código Perl acima primeiramente testa se o formulário HTML usou o método GET ou o método POST e, dependendo do resultado, busca os dados. Portanto, independentemente do método utilizado pelo formulário, este código Perl obtém os dados enviados.
Os dados estão contidos inicialmente na escalar $Dados. O valor de $Dados tem, a esta altura, a aparência do fluxo de dados na transferência de dados de formulários.
Com a diretiva @CamposForm = split(/&/, $Dados);, a cadeia de caracteres $Dados é transformada numa lista. Como caracter delimitador, que separa os elementos do fluxo de dados, é indicado o "e comercial" (&). Os campos do fluxo de dados do formulário são separados em campos únicos através deste caracter delimitador.
Logo a seguir, cada um dos campos da nova lista @CamposForm é tratado dentro de uma alça foreach. Primeiro, cada campo é separado em dois componentes indicando-se como delimitador o sinal de igual =. Os dois componentes são atribuídos às escalares $nome e $valor. A escalar $nome passa a ter o mesmo conteúdo definido na declaração name= do formulário HTML correspondente. A escalar $valor passa a ter o conteúdo digitado ou escolhido pelo usuário que preencheu o formulário. Supondo-se que o formulário HTML contenha um campo de entrada de dados que tenha sido definido com <input name="Apelido" size=60 maxlength=60> e que o usuário tenha digitado "Cuca Fresca", então, para este campo do formulário, a escalar $nome terá o valor Apelido e a escalar $valor conterá Cuca Fresca.
Com os procedimentos de procura e substituição seguintes, ainda dentro da alça foreach, são retirados todos os caracteres poluidores que tenham sobrado no fluxo de dados do formulário.
Os dados do formulário, por fim, são atribuídos à lista @Form. Os elementos pares desta lista, ou seja, $Form[0], $Form[2], $Form[4], etc, contém os nomes dos campos. Os elementos ímpares, $Form[1], $Form[3]... contém os valores dos campos.
Observações: Os códigos Perl aqui apresentados são muito primários. Têm como principal tarefa esclarecer os princípios do processamento. Se você necessita de soluções mais profissionais, terá de programá-las ou então procurar scripts freeware prontos. |
Enviar dados de formulário como email
|
Os dados de formulários preenchidos podem, por exemplo, serem gravados num arquivo do servidor. A maioria dos ofertantes, porém, prefere receber imediatamente os dados do formulário preenchido por um usuário via e-mail.
O código Perl a seguir é a continuação do script logo acima.
$ProgramaMail = "/usr/lib/sendmail"; # veja explicação abaixo
$MailAssunto = "Feedback de Formulário"; # veja explicação abaixo
$Destinatario = "SeuNome\@Provedor\.xxx"; # veja explicação abaixo
$NomeRemetente = $Form[1]; # veja explicação abaixo
$MailRemetente = $Form[3]; # veja explicação abaixo
open (MAIL,"|$ProgramaMail -t") || die;
print MAIL "To: $Destinatario\n";
print MAIL "From: $Mailremetente $NomeRemetente\n";
print MAIL "Subject: $MailAssunto\n\n";
$i = 0;
$max = $#Form;
for($i=0;$i<=$max;$i=$i+2) {
print MAIL "$Form[$i]: $Form[$i+1]\n";
}
close(MAIL);
O código Perl acima define primeiramente algumas escalares. A primeira e a mais importante escalar é $ProgramaMail. Aqui é preciso indicar qual é e onde o programa gerenciador de e-mails se encontra no servidor. O programa padrão é o sendmail, presente em quase todos os servidores da Internet - uma indicação típica para servidores Unix é /usr/lib/sendmail. Informe-se com o seu provedor de serviços e confirme o nome e a localização do gerenciador de e-mails colocado à sua disposição. Lembre-se, se esta diretiva não estiver absolutamente correta, o envio de e-mails não é possível.
A escalar $MailAssunto recebe o que deve constar no subj (subject) do cabeçalho do e-mail.
A escalar $Destinatario deve conter o endereço ao qual o e-mail deve ser enviado.
As duas escalares $NomeRemetente e $MailRemetente foram incluídas no código Perl acima apenas para completar o exemplo. Estas escalares recebem seu conteúdo do formulário. Aliás, isto só funciona se o formulário requisitante tiver campos para o nome e para o endereço de e-mail do usuário. Neste caso, é necessário indicar em $Form[#] o número correto dos elementos correspondentes a estes campos.
Após tratar das escalares, o código Perl acima abre o programa gerenciador de e-mails do servidor. A opção -t na função open se refere ao programa sendmail. Caso o gerenciador seja outro, informe-se sobre a forma correta de acioná-lo para enviar e-mails.
Se o programa gerenciador não puder ser aberto, o script Perl é interrompido com die, sem nenhum comentário. Neste ponto você pode, se quiser, adicionar uma mensagem de erro personalizada.
Através do comando print, o script escreve os dados conhecidos no cabeçalho do e-mail. Todos os e-mails da Internet têm um formato único. No cabeçalho constam diversas informações. Algumas delas são acrescentadas apenas no decorrer da viagem para o destinatário.
No interior da alça for são escritos os diversos campos e seus respectivos valores. Os nomes dos campos e o conteúdo dos campos são separados por dois pontos. |
Enviar código HTML ao navegador
|
Uma das tarefas mais importantes de scripts CGI é enviar código HTML ao navegador solicitante. Neste caso, pode-se incluir no código HTML as variáveis do script Perl que se desejar.
O código Perl a seguir é complemento dos scripts acima. Ele envia um agradecimento ao usuário que tenha preenchido um formulário.
print "Content-type: text/html\n\n"; print "\n";
print "<html>\n";
print "<head>\n";
print "<title>Obrigado</title>\n";
print "</head>\n";
print "body bgcolor=#FFFFFF text=#000000 link=#009900 vlink=#006600 alink=#0000FF\n";
print "<h1>Obrigado</h1>\n";
print "Agradecemos que tenha preenchido nosso formulário.\n";
print "Para seu controle, seguem os dados do mesmo:<p>\n";
for($i=0;$i<=$max;$i=$i+2) {
print "<b>$Form[$i]:</b> $Form[$i+1]<br>\n";
}
print "<p><hr noshade size=1><p>\n";
print "<i>Seu nome, <a href=\"mailto:SeuNome\@Provedor.xxx\">SeuNome\@Provedor.xxx</a></i>";
print "</body>\n";
print "</html>\n";
Pode-se escrever código HTML com facilidade em Perl usando-se a função print. No exemplo acima, dessa forma foi criada e enviada ao navegador uma página HTML completa.
Importante no caso é a primeira diretiva: print "Content-type: text/html\n\n";. Isto ainda não é código HTML. O navegador que recebe o código aguarda, inicialmente, um cabeçalho HTML (HTML header). Este cabeçalho precisa, pelo menos, indicar o tipo de dado que será enviado. Com esta diretiva, informa-se o navegador de que o código a ser enviado é do tipo texto HTML. Muito importante e imprescindível é a colocação dos dois \n\n no final. O primeiro \n é a quebra de linha para Content-type: text/html. O segundo \n envia uma quebra de linha (ou linha vazia), que é o que o navegador solicitante espera após a informação do tipo de dado. Após a linha vazia, o navegador aguarda o recebimento dos dados propriamente ditos. Este é o procedimento para se estabelecer uma conexão no protocolo http. É isso aí.
Dito isso, vamos esclarecer o envio dos dados. Com a função print envia-se, linha após linha, todo o código HTML desejado. O laço for, no meio do exemplo, merece uma observação especial. Do interior desse laço são enviados os conteúdos da lista @Form em formato HTML. Esta possibilidade de incluir variáveis no código HTML enviado é o motivo pelo qual a CGI é também frequentemente denominada de "HTML dinâmico".
Para terminar, verifique cuidadosamente o modo de escrever o comando mailto no final do código exemplo. Quando você criar tags de HTML que exijam a presença de aspas duplas, como é o caso de href, as aspas precisam ser precedidas por uma barra invertida \ que serve como máscara. Caso você esqueça da barra invertida, o interpretador Perl gerará um erro e interromperá a execução do script. Isto me aconteceu mais de uma vez! Da mesma forma, caracteres reservados, que tenham uma função especial, também precisam de máscara. É o caso, por exemplo, de @ que, sem máscara, identifica uma lista.
|
| Todos os scripts CGI deste site são "made in Aldeia". As linguagens utilizadas são principalmente PHP e alguma coisa em Perl. Faça contato: tire dúvidas, solicite matérias, critique e contribua. |
|