Este tutorial é um seguimento directo do anterior. Utilizaremos os mesmos componentes e tabela de dados para criar um sistema de registo de utilizadores. Se não tem acompanhado esta série aconselho-lhe a dar uma olhadela ao tutorial anterior.
No que diz respeito à validação, será usado o novo sistema form_validation introduzido na versão 1.7.0. Dado que este tutorial é orientado para iniciantes não vi razão pela qual não o orientar para a nova versão.
Em qualquer página web com validação de dados existe o seguinte ciclo de validação:
- Pedir os dados ao utilizador
- Verificar os dados
- Caso os dados não sejam válidos exibir erros e voltar ao ponto 1
- Tratar os dados
Começando pela solicitação de dados, vamos criar uma view user/register.php com o seguinte conteúdo:
A view acima é um formulário típico em PHP/HTML. Na primeira linha serão imprimidas as mensagens de erro caso a validação dos dados falhe. Recorre-se também à função form_tag para gerar uma tag form que chamará o controlador responsável por validar e armazenar os dados.<?php echo validation_errors() ?>
<?php echo form_open('user/register') ?>
<fieldset>
<label for="username">Utilizador: </label>
<input type="text" id="username" value="" />
<label for="password">Palavra-Passe:</label>
<input type="password" id="password" value="" />
<label for="confirm">Confirmar:</label>
<input type="password" id="confirm" value="" />
<label for="email">E-mail</label>
<input type="text" id="email" value="" />
</fieldset>
<input type="submit" value="Enviar" />
</form>
Agora para armazenar os dados resta-nos criar o controlador para o efeito. Mas antes disso vamos preparar a nossa classe modelo para guardar este tipo de dados. Lembre-se que estamos a criar um formulário para registo de utilizadores e dados sensíveis como a password não serão armazenados no formato em que são inseridos. A palavra passe será transformada antes de ser armazenada recorrendo à função de hashing sha1 utilizando uma chave salt para impedir a obtenção da palavra passe através de dicionários com hashs conhecidos. Ao modelo user_model.php serão acrescentados os seguintes métodos:
<?php
private function hashPassword($password)
{
//gera uma string salt aleatória
$data['salt'] = sha1(rand());
//gera o hashing da password
$data['password'] = sha1($data['salt'].$password);
return $data;
}
function register()
{
$data['username'] = $this->input->post('username');
$hash = $this->hashPassword($this->input->post('passwd'));
$data['passwd'] = $hash['password'];
$data['salt'] = $hash['salt'];
$data['email'] = $this->input->post('email');
$this->db->insert('users', $data);
}
?>
O método register guarda os dados, depois de codificar a password. Usando o método insert do Active Record a inserção de dados não poderia ser mais simples, basta um array associativo em que o indice corresponde ao nome do campo na tabela e depois passá-lo como argumento da função insert. Para obter os dados enviados pelo formulário podem usar o método $this->input->post('nome') ou aceder directamente ao respectivo elemento no array post: $_POST['nome'].
O método hashPassword é responsável apenas por gerar um hash e um salt para a password.
Por fim no controlador user vamos criar um método register que, neste exemplo, será responsável por criar as regras e executar o ciclo de validação.
<?php
function register()
{
//definição da lista de regras a aplicar
$config=array(
array(
'field' => 'username',
'label' => 'Nome de Utilizador',
'rules' => 'required|min_length[4]|max_length[20]'
),
array(
'field' => 'passwd',
'label' => 'Palavra Passe',
'rules' => 'required|min_length[6]|matches[confirm]'
),
array(
'field' => 'confirm',
'label' => 'Confirmação de Palavra Passe',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'E-mail',
'rules' => 'required|valid_email'
)
);
//atribui a lista de regras à próxima execução da validação
$this->form_validation->set_rules($config);
//Teste de validação de dados
if(($this->form_validation->run())==FALSE)
{
//caso a validação não tenha tido sucesso
//ou ainda não foi invocada
$this->load->view('user/register');
}
else
{
//se a validação teve sucesso
$this->user_model->register();
//redirecciona para uma página de sucesso
redirect('user/success');
}
}
?>
Neste exemplo recorremos ao método de criar um array com todas as regras de validação a aplicar. Nesse array cada elemento possui três campos:
- field: possui o nome do campo a avaliar, deverá obrigatoriamente corresponder ao id do elemento do formulário que fornecerá esses dados.
- label: contém uma identificação do campo, compreensível pelos utilizadores, a aparecer na mensagem de erro.
- rules: aqui são declaradas as regras a ser aplicadas ao campo, as mais comuns são: required, campo obrigatório; min_length/max_length, definem os limites de tamanho em caracteres dos dados inseridos; valid_email, endereço de correio electrónico válido; etc...


