De longe essa classe supriu minhas necessidades conforme comentei no início do artigo, me basta agora ver a parte da persistência dos dados no banco de dados, que é sempre a parte final de toda aplicação. E todo esse esforço poderia ser em vão caso eu não pudesse concluir minha aplicação persistindo os dados no banco. É ai onde a classe me surpreende novamente, veremos agora essa parte.
Porém antes de entrarmos nessa parte é preciso já ter uma tabela criada, veja abaixo a estrutura da tabela que utilizaremos no exemplo.
mysql>
DESC users;
+----------------------+---------------+
| Field | Type |
+----------------------+---------------+
| fullname | varchar(60) |
| address | text |
| country | varchar(60) |
| emailaddress | varchar(100) |
| gender | enum('F','M') |
| dateofbirth | date |
| group_name | varchar(30) |
| group_type | varchar(30) |
| looking_for | varchar(255) |
| username | varchar(10) |
| pword | varchar(10) |
| newsletter_subscribe | enum('Y','N') |
| referrer_url | varchar(255) |
+----------------------+---------------+
Clique no link abaixo para baixar o código no próximo exemplo:
Antes de falar sobre como o método process() funciona, quero dar destaque a uma característica do objeto HTML_QuickForm() - a habilidade de associar filtros ao form, como o próprio nome sugere. Essa característica permite colocarmos filtros em todos ou em alguns elementos do formulário. Um bom exemplo para isso é a função trim() do PHP - é uma prática comum remover os espaços entre as palavras inseridas no campo do form. Veja esse próximo código:
<?php
// snip
// pre-validation filters come here
$obj_registration_form->applyFilter('__ALL__', 'trim');
// snip
?>
O método applyFilter() tem dois parâmetros, o primeiro é o nome do elemento e o segundo é a função PHP a ser aplicada nele. Note que você pode utilizar a palavra-chave "__ALL__" para aplicar a função a todos os elementos do formulário.
Isso permite aplicar os filtros somente na hora certa. Por exemplo, nós podemos querer aplicar alguns filtros antes que a validação esteja completa, como no código a seguir:
<?php
// snip
// validate form
if($obj_registration_form->validate()) {
// post-validation filters come here
$obj_registration_form->applyFilter('__ALL__', 'addslashes');
$obj_registration_form->applyFilter('__ALL__', 'htmlentities');
$obj_registration_form->applyFilter('txtAddress', 'nl2br');
// invoke the "store_user_info" function to store the user information
$obj_registration_form->process('store_user_information', false);
// exit the script, on successful insertion
header('Location: ./success.php');
}
// snip
?>
Aqui eu apliquei um filtro somente depois que a data foi validada, por uma razão muito simples: é possível que uma função PHP como addslashes(), htmlentities() e nl2br() altere o dado enviado e assim faça a validação falhar.
Voltando ao método process(), vamos utilizá-lo no próximo código, enviamos a ele dois parâmetros:
- O primeiro representa o nome de minha função "callback";
- O segundo só deverá ser configurado como verdadeiro caso estejamos fazendo upload de algum arquivo via formulário.
Preste atenção no próximo script, pois e nele que eu defino a minha função "callback" chamada store_user_information(), essa função faz a inserção dos dados no banco de dados.
<?php
// snip
// custom function to store user information into the database
function store_user_information($ary_artist_info) {
// store information in the database
$connection = mysql_connect('localhost', 'guest', 'pass') or die ('Unable to connect!');
mysql_select_db('db2') or die ('Unable to select database!');
$query = " INSERT INTO `users` ( `fullname` , `address` , `country` , `emailaddress` , `gender` , `dateofbirth` , `group_name` , `group_type` , `looking_for` , `username` , `pword` , `newsletter_subscribe`, `referrer_url` )";
$query .= " VALUES ('".implode(" ", $ary_artist_info['txtFullName'])."', '".$ary_artist_info['txtAddress']."', '".$ary_artist_info['ddlCountry']."', '".$ary_artist_info['txtEmailAddress']."', '".$ary_artist_info['radGender']."', '".implode("-", $ary_artist_info['txtDateOfBirth'])."', '".$ary_artist_info['txtGroupName']."', '".$ary_artist_info['radGroupType']."', '".implode(",", $ary_artist_info['ddlLookingFor'])."', '".$ary_artist_info['txtUsername']."', '".$ary_artist_info['txtPassword1']."', '".(isset($ary_artist_info['chkNewsletter']) ? "Y" : "N")."', '".$ary_artist_info['txtReferrer']."');";
$result = mysql_query($query) or die ("Error in query: $query. " . mysql_error());
mysql_close($connection);
}
// snip
?>
Caso todas as regras de validação sejam satisfeitas, o usuário será direcionado para a página de sucesso (success.php).
Agora posso dizer que estou pronto para concluir meu protótipo de registro - a tarefa foi facilmente feita pelo pacote HTML_QuickForm() da classe PEAR.
O primeiro exemplo neste artigo demonstrou como você poderia criar o formulário usando o objeto de HTML_QuickForm() e seu método addElement(). O segundo exemplo foi sobre explicar o conceito de "agrupar" os elementos - estes poderiam seguir uma organização lógica ou simplesmente porque nós queremos exibir dois controles na mesma linha. Em seguida, eu mostrei-lhe que como executar a validação "server-side", como também a validação do "client-side" definindo "regras" para o formulário. Finalmente, o exemplo concluído mostrou-lhe como filtrar os dados submetidos pelo usuário e introduzí-los em uma base de dados de MySQL usando o método do process().
Nota: Esse artigo é uma tradução, o original encontra-se em: