Formulários CVT por exemplo

Um formulário de contato em 4 etapas

A criação de formulários é extremamente simplificada para o webmaster ou durante o desenvolvimento. Vejamos como, através de um exemplo simples e concreto.

Etapa 1 : Criar o template do seu formulário

No subdiretório formulaires/ da sua pasta «squelettes», crie o arquivo contact.html que vai conter o código HTML do seu formujlário de contato. Por exemplo:

<form action='#ENV{action}' method='post'>
	#ACTION_FORMULAIRE{#ENV{action}}
	<label>Seu e-mail</label>
	<input type='text' name='email' value='#ENV{email}' />
	<br />
	<label>Sua mensagem</label>
	<textarea name='message'>#ENV{message}</textarea>
	<input type='submit' name='ok' value='ok' />
</form>

Como você pode constatar, este formulário contem algumas particularidades:

  • o atributo action da tag <form> contém #ENV{action} que é o URL para o qual o formulário será enviado;
  • #ACTION_FORMULAIRE{#ENV{action}} indica ao SPIP que deve transmitir às funções «charger, verifier, traiter» os dados informados e aqueles eventualmente contidos no URL (após o SPIP 2.1 o argumento #ENV{action} é, na realidade, inútil, sendo atualmente o valor padrão);
  • cada input, textarea ou select contém o valor #ENV{xxx} onde xxx corresponde ao atributo name correspondente.

A esta altura, você já pode exibir este formulário em um template, com a tag #FORMULAIRE_CONTACT ou diretamente no texto de uma matéria, com o código <formulaire|contact>. Você vai apreciar poder testar e refinar a aparência e o conteúdo do seu formulário sem escrever uma única linha de PHP.

No entanto, se você preencher os campos e clicar no botão OK, o seu formulário não fará nada, e você não encontrará os dados que informou.

Etapa 2: a função charger

Vamos então indicar ao SPIP quais são os campos que o visitate pode preencher.

Para isso, crie um ficheiro contact.php no seu subdiretório formulaires/ (ao lado do seu template contact.html), e insira o código a seguir:

<?php

function formulaires_contact_charger_dist(){
	$valeurs = array('email'=>'','message'=>'');
	
	return $valeurs;
}

?>

O que este código faz?

Ele declara a função charger do formulário contact do diretorio formulaires consecutivametne nomeado formulaires_contact_charger.
O sufixo _dist assinala que se trata da função charger padrão deste formulário, mas que ela é eventualmente personalizável (ver, a propósito de surcharges http://programmer.spip.org/Surcharg...).

Esta função lista, na variável $valeurs, os campos de entrada de dados do seu formulário e, para cada campo, o valor inicial padrão
A função formulaires_contact_charger_dist envia esta lista de campos.

Teste novamente o seu formulário: se você preencher os campos e validar com o botão )K, você verá que, desta vez, o formulário não perdeu os valores que você informou (mesmo que ainda não faça mais nada).

Neste exemplo, todos os campos estão vazios por padrão. Podemos melhorar a nossa função, preenchendo automaticamente o e-mail, caso o visitante esteja identificado.
Isto nos dará o código a seguir para a função charger:

function formulaires_contact_charger_dist(){
	$valeurs = array('email'=>'','message'=>'');
	if (isset($GLOBALS['visiteur_session']['email']))
		$valeurs['email'] = $GLOBALS['visiteur_session']['email'];
	return $valeurs;
}

Se você testar agora o seu formulário, estando identificado, você constatará:

  • que o campo email já está previamente preenchido com o e-mail da sua conta SPIP
  • que os valores informados ou alterados são conservados tal com após da validação.

Etapa 3: Verificar que os dados são válidos

Antes de considerar os valores informados pelo visitante, devemos evidentemente verificar se os dados informados são válidos.

Vamos, por exemplo, definir as restrições a seguir:

  • os campos emal e mensagem são obrigatórios
  • o e-mail deve ser válido

Para verificar a entrada de dados, vamos criar a função formulaires_contact_verifier_dist (no mesmo modelo da função charger) sempre no mesmo ficheiro contact.php :

function formulaires_contact_verifier_dist(){
	$erreurs = array();
	// verificar se os campos obrigatórios foram preenchidos:
	foreach(array('email','message') as $obligatoire)
		if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Este campo é obrigatório';
	
	// verificar se um e-mail foi informado e se é válido:
	include_spip('inc/filtres');
	if (_request('email') AND !email_valide(_request('email')))
		$erreurs['email'] = 'Este e-mail não é válido';

	if (count($erreurs))
		$erreurs['message_erreur'] = 'Os dados que você informou contêm erros!';
	return $erreurs;
}

Nota: o uso de _request() é explicado no site no site programmer.spip.org

A função verificar envia uma lista de campos em erro, com a mensagem de erro correspondente a cada campo.

A esta altura, você não verá nada de diferente, se você testar o formulário: com efeito, o seu formulário contact.html não exibe erros. Você irá completá-lo como abaixo:

[<p class='formulaire_erreur'>(#ENV*{message_erreur})</p>]
<form action='#ENV{action}' method='post'>
	#ACTION_FORMULAIRE{#ENV{action}}
	<label>Seu e-mail</label>
	[<span class='erreur'>(#ENV**{erreurs}|table_valeur{email})</span>]
	<input type='text' name='email' value='#ENV{email}' />
	<br />
	<label>Sua mensagem</label>
	[<span class='erreur'>(#ENV**{erreurs}|table_valeur{message})</span>]
	<textarea name='message'>#ENV{message}</textarea>
	<input type='submit' name='ok' value='ok' />
</form>

Note bem:

  • a exibição de uma mensagem de erro genérica enviada pela função verifier
    [<p class='reponse_formulaire reponse_formulaire_erreur'>(#ENV*{message_erreur})</p>]
  • as mensagens de erro à frente de cada campo:
    [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{email})</span>]

Você pode agora testar o seu formulário, informando um e-mail erróneo ou deixando um campo vazio: o seu formulário já começa a interagir com o visitante!!

Etapa 4 : tratar!

Assim que a função verifier não envie nenhum erro, o SPIP chama automaticamente a função de tratamento correspondente. Vamos declarar esta função formulaires_contact_traiter_dist (sempre no ficheiro contact.php) e vamos enviar um e-mail ao webmaster:

function formulaires_contact_traiter_dist(){
	$envoyer_mail = charger_fonction('envoyer_mail','inc');
	$email_to = $GLOBALS['meta']['email_webmaster'];
	$email_from = _request('email');
	$sujet = 'Formulário de contato';
	$message = _request('message');	
	$envoyer_mail($email_to,$sujet,$message,$email_from);
	return array('message_ok'=>'A sua mensagem foi recebida corretamente. Você receberá uma resposta em breve!');
}

Você notará que a função traiter não faz nenhuma verificação: elas foram todas feitas previamente (pela função verifier). Se a função traiter for chamada, é porque não há nenhum erro.

A função traiter envia uma mensagem de sucesso, « message_ok », contida numa tabela. Como para as mensagens de erro, falta completar o nosso formulário para que ele exiba a mensagem. Como abaixo:

[<p class='formulaire_ok'>(#ENV*{message_ok})</p>]
[<p class='formulaire_erreur'>(#ENV*{message_erreur})</p>]
[(#EDITABLE|oui)
	<form action='#ENV{action}' method='post'>
		#ACTION_FORMULAIRE{#ENV{action}}
		<label>Seu e-mail</label>
		[<span class='erreur'>(#ENV**{erreurs}|table_valeur{email})</span>]
		<input type='text' name='email' value='#ENV{email}' />
		<br />
		<label>Sua mensagem</label>
		[<span class='erreur'>(#ENV**{erreurs}|table_valeur{message})</span>]
		<textarea name='message'>#ENV{message}</textarea>
		<input type='submit' name='ok' value='ok' />
	</form>
]

Note bem:

  • a exibição de uma mensagem de sucesso no início
    [<p class="formulaire_message">(#ENV*{message_ok})</p>]
  • a exibição condicional do formulário de entrada de dados em função de #EDITABLE: após a entrada de dados, é geralmente mais claro para o visitante não se exibir o formulário completo mas apenas as mensagens de sucesso. #EDITABLE serve para isso.

Dica: É possível que queiramos colocar um loop BOUCLE no formulário (para exibir os campos de um select a partir da base, por exemplo). O uso de #EDITABLE e desse loop gera um erro. A solução é incluir um loop CONDITION como mostra o exemplo a seguir:

    [<p class='formulaire_ok'>(#ENV*{message_ok})</p>]
    [<p class='formulaire_erreur'>(#ENV*{message_erreur})</p>]
    <BOUCLE_editable(CONDITION){si #ENV{editable}|oui}>
            <form action='#ENV{action}' method='post'>
                    #ACTION_FORMULAIRE{#ENV{action}}
                   <BOUCLE_article(ARTICLES){0,1}>#TITRE</BOUCLE_article>
             <label>Seu e-mail</label>
                    [<span class='erreur'>(#ENV**{erreurs}|table_valeur{email})</span>]
                    <input type='text' name='email' value='#ENV{email}' />
                    <br />
                    <label>Sua mensagem</label>
                    [<span class='erreur'>(#ENV**{erreurs}|table_valeur{message})</span>]
                    <textarea name='message'>#ENV{message}</textarea>
                    <input type='submit' name='ok' value='ok' />
            </form>
    </BOUCLE_editable>

Fim! Você pode usar o seu formulário de contato.

O bonus: formulários ajax simplificados

Você deseja que a interação entre o seu formulário e o visitante seja mais rápida e não dependa do carregamento completo da página a cada erro ou na validação?

Será necessário que o seu formulário seja implementado em AJAX. Normalmente é aqui que a dificuldade surge; este tipo de implementação costuma ser longa e trabalhosa. Mas isto é simplificado pelo formalismo CVT, que lhe oferece mecanismos automatizados para a ajaxização dos seus formulários

Para isso, basta colocar o seu formulário dentro de uma div com a classe ajax:

<div class='ajax'>
#FORMULAIRE_CONTACT
</div>

É isso!

Para ir além

-  Este exemplo não produz um formulário bonito. Para um resultado mais estético, semântico e acessível, não hesite a usar as recomendações de estruturas de Structure HTML des formulaires de SPIP para todos os seus formulários SPIP
-  Saber tudo sobre a função charger() : La fonction charger() des formulaires CVT
-  Saber tudo sobre a função verifier() : La fonction verifier() des formulaires CVT
-  Saber tudo sobre a função traiter() : La fonction traiter() des formulaires CVT

Autor Ricardo Porto Publié le :

Traductions : català, English, Español, français, Nederlands, Português