Back-End

20 jul, 2010

Validação e Internacionalização com CodeIgniter

Publicidade

Primeiramente gostaria de começar meu
artigo pedindo desculpa aos leitores. Muita coisa aconteceu desde meu último artigo e eu fiquei impedido de continuar a escrever. Agora vou tentar voltar com força total!

Vamos ao que interessa.

O Framework CodeIgniter possui uma classe
para validação de dados, normalmente usada para validar entrada de dados em
formulários e retornar uma string de erros. Embora não haja muita complexidade em
criar a sua própria classe de validação de erros, o ideal seria padronizar isso,
simplificando para que qualquer desenvolvedor novo de sua equipe possa
rapidamente utilizá-la. Como o codeigniter já possui essa classe, por que não
utilizá-la?

Além do mais, essa classe possui integração
com a Classe de Internacionalização, como veremos a seguir, deixando seu
sistema totalmente modularizado, caso necessite que pessoas de todo mundo
o acessem.

Bem, primeiramente, vamos continuar em cima do
sistema dos artigos anteriores. Adicionei uma tabela nova, que é a categoria da
notícia, e criei uma chave estrangeira na tabela notícia, apontando para a categoria
da notícia.

Remodelado nosso banco, vamos fazer download da tradução do CI para português, segue o link http://codeigniter.com/wiki/Portuguese/

Baixe o arquivo e descompacte o diretório pt-br dentro do diretório system/language ou system/application/language/

Agora vamos criar dois arquivos chamados system_lang.php, dois arquivos com o mesmo nome – um irá ficar dentro do diretório pt-br e o outro dentro do diretório english. Dentro desses arquivos ficarão nossos labels traduzidos.

pt-br


$lang['error_cad'] = "Erro ao inserir Notícia";
$lang['error_alt'] = "Erro ao alterar Notícia";
$lang['error_del'] = "Erro ao excluír Notícia";

$lang['noticia_show'] = "Mostrar Notícia";
$lang['noticia_cad'] = "Castrar Notícia";
$lang['noticia_alt'] = "Editar Notícia";
$lang['noticia_del'] = "Excluir Notícia";

$lang['campo_titulo_noticia'] = "Título Notícia";
$lang['campo_id_categoria'] = "Categoria Notícia";
$lang['campo_texto_noticia'] = "Texto Notícia";

$lang['display_id_categoria'] = "Selecione uma Categoria";
$lang['noticia_del_regitro'] = "Excluir registros";

$lang['template_topo'] = "Topo do site";
$lang['template_copyritght'] = "Todos os direitos reservados";

$lang['home_titulo'] = "Link para Download deste sistema";
$lang['home_click'] = "clique aqui";


/* End of file system_lang.php */
/* Location: ./system/language/pt-br/system_lang.php */

english


$lang['error_cad'] = "Error inserting News";
$lang['error_alt'] = "Error updating News";
$lang['error_del'] = "Error deleting News";

$lang['noticia_show'] = "Show News";
$lang['noticia_cad'] = "Insert News";
$lang['noticia_alt'] = "Edit News";
$lang['noticia_del'] = "Delete News";

$lang['campo_titulo_noticia'] = "Title News";
$lang['campo_id_categoria'] = "Category News";
$lang['campo_texto_noticia'] = "Text News";

$lang['display_id_categoria'] = "Select a Category";
$lang['noticia_del_regitro'] = "Delete records";

$lang['template_topo'] = "Top of site";
$lang['template_copyritght'] = "All rights reserved";

$lang['home_titulo'] = "Download link for this system";
$lang['home_click'] = "click here";


/* End of file system_lang.php */
/* Location: ./system/language/pt-br/system_lang.php */

Após os arquivos criados, vamos editar o arquivo config/config.php da sua aplicação, altere a linha 69, na var $config[‘language’], troque o idioma para pt-br: $config[‘language’] = “pt-br”;

Obs: Neste artigo não irei falar sobre sessão, senão o artigo ficaria muito extenso. Demonstrarei como isso funciona no próximo artigo. Por esse motivo, a parte de internacionalização não ficará dinâmica. Para você testar em ambos idiomas, terá de alterar o arquivo config/config.php, conforme explicado logo acima.

Logo após, edite o arquivo config/autoload.php. Na linha 42 adicione mais uma classe, a classe de validação, $autoload[‘libraries’] = array(‘parser’,’database’,’validation’);

Na linha 98 adicione uma posição no vetor, o arquivo de tradução que nós criamos, $autoload[‘language’] = array(‘system’);

Tudo configurado, vamos agora ao desenvolvimento do sistema.

Vamos dar uma olhada no método validacao(), que contém a validação de todos os nossos campos de nosso formulário, veja logo abaixo.

Model


class noticia_model extends Model {

private $vet_dados = array();

public function __construct() {
parent::Model();
}

public function mostrar() {

$this->vet_dados["noticia"] = $this->getNoticia();

return $this->parser->parse("noticia/noticia_view", $this->vet_dados, TRUE);

}

public function cadastrarNoticia() {

$noticia->id_noticia = "";
$noticia->titulo_noticia = $this->input->post("titulo_noticia");//variáveis do posto para retorno
$noticia->texto_noticia = $this->input->post("texto_noticia");//variáveis do posto para retorno

$categoria = $this->getCategoria();

for ($i = 0; $i < count($categoria); $i++) {

if ($this->input->post("id_categoria") != '') {

$categoria[$i]->selected = $this->validation->set_select('id_categoria', $categoria[$i]->id_categoria);//variáveis do posto para retorno

}

}

$this->vet_dados["nome_tela"] = $this->lang->line('noticia_cad');//nome da tela
$this->vet_dados["acao"] = "inserir";//ação da controller
$this->vet_dados["noticia"] = array($noticia);//objeto noticia
$this->vet_dados["categoria"] = $categoria;//vetor de objetos de categorias
$this->vet_dados['msg_erro'] = $this->validation->error_string;//msg de erro
$this->vet_dados["validacao"] = strlen($this->validation->error_string) > 0 ? $this->parser->parse("validacao_view", $this->vet_dados, TRUE) : '';//view que retorna o erro na tela

return $this->parser->parse("noticia/noticia_cad_view", $this->vet_dados, TRUE);

}

public function editarNoticia() {

$noticia = $this->getNoticia($this->uri->segment(3));
$categoria = $this->getCategoria();

for ($i = 0; $i < count($categoria); $i++) {

if ($this->input->post("id_categoria") != '') {

$categoria[$i]->selected = $this->validation->set_select('id_categoria', $categoria[$i]->id_categoria);//se for postado difrente de vazio ele preenche

} else {

if ($categoria[$i]->id_categoria == $noticia->id_categoria && !isset($this->validation->id_categoria)) {

$categoria[$i]->selected = 'selected="selected"';//se ele não trocou a opção

} else {

$categoria[$i]->selected = '';

}

}

}

$noticia = $this->validador($noticia);//método para resetar o valor do objeto, alterando com o valor do post

$this->vet_dados["nome_tela"] = $this->lang->line('noticia_alt');//nome da tela
$this->vet_dados["acao"] = "alterar";//ação da controller
$this->vet_dados["categoria"] = $categoria;//vetor de objetos de categorias
$this->vet_dados["noticia"] = array($noticia);//objeto notícia
$this->vet_dados['msg_erro'] = $this->validation->error_string;//retorno do erro
$this->vet_dados["validacao"] = strlen($this->validation->error_string) > 0 ? $this->parser->parse("validacao_view", $this->vet_dados, TRUE) : '';//view que retorna o erro na tela

return $this->parser->parse("noticia/noticia_cad_view", $this->vet_dados, TRUE);

}

public function delNoticia() {

$this->vet_dados["noticia"] = $this->getNoticia();
$this->vet_dados["nome_tela"] = $this->lang->line('noticia_del_regitro');//nome da tela
$this->vet_dados["acao"] = "excluir";

return $this->parser->parse("noticia/noticia_del_view", $this->vet_dados, TRUE);

}

public function getNoticia($id=null) {

$this->db->from("noticia");

if ($id != null) {
$this->db->where("id_noticia", $id);
return $this->db->get()->row();
} else {
return $this->db->get()->result();
}

}

public function getCategoria($id=null) {

$this->db->from("categoria");
$this->db->orderby("nome_categoria");

if ($id != null) {
$this->db->where("id_categoria", $id);
return $this->db->get()->row();
} else {
return $this->db->get()->result();
}

}

public function inserirNoticia() {

if ($this->input->post('titulo_noticia')) {
$this->db->set('titulo_noticia', $this->input->post('titulo_noticia',TRUE));
}

if ($this->input->post('id_categoria')) {
$this->db->set('id_categoria', $this->input->post('id_categoria',TRUE));
}

if ($this->input->post('texto_noticia')) {
$this->db->set('texto_noticia', $this->input->post('texto_noticia',TRUE));
}

$this->db->set('data_noticia', date("Y-m-d H:i:s"));

$this->db->insert('noticia');

return $this->db->insert_id() > 0 ? TRUE : FALSE;

}

public function alterarNoticia() {

if ($this->input->post('titulo_noticia')) {
$this->db->set('titulo_noticia', $this->input->post('titulo_noticia',TRUE));
}

if ($this->input->post('id_categoria')) {
$this->db->set('id_categoria', $this->input->post('id_categoria',TRUE));
}

if ($this->input->post('texto_noticia')) {
$this->db->set('texto_noticia', $this->input->post('texto_noticia',TRUE));
}

$this->db->where('id_noticia', $this->input->post('id_noticia'));

return $this->db->update('noticia');

}

public function excluirNoticia() {

if ($this->input->post('id_tabela')) {
$this->db->where_in('id_noticia', $this->input->post('id_tabela'));
$this->db->delete('noticia');
return $this->db->affected_rows() > 0 ? TRUE : FALSE;
} else {
return FALSE;
}

}

/**
* Método que faz a validação dos campos
*
* @return boolean
*/
public function validacao() {

$regra['titulo_noticia'] = "trim|required";//campo obrigatório
$regra['id_categoria'] = "trim|required|numeric";//campo obrigatório e numerico
$regra['texto_noticia'] = "trim|required";//campo obrigatório

//descrição traduzida
$campo['titulo_noticia'] = $this->lang->line('campo_titulo_noticia');
$campo['id_categoria'] = $this->lang->line('campo_id_categoria');
$campo['texto_noticia'] = $this->lang->line('campo_texto_noticia');

$this->validation->set_rules($regra);//seta campos
$this->validation->set_fields($campo);//seta descrição traduzida

return $this->validation->run();

}

/**
* Método que pega os campos postados e preenche como veio do formulário
*
* @param object $obj
* @return object
*/
public function validador($obj) {

if (isset($this->validation->titulo_noticia)) {
$obj->titulo_noticia = $this->validation->titulo_noticia;
}

if (isset($this->validation->id_categoria)) {
$obj->id_categoria = $this->validation->id_categoria;
}

if (isset($this->validation->texto_noticia)) {
$obj->texto_noticia = $this->validation->texto_noticia;
}

return $obj;

}

}

/* End of file noticia_model.php */
/* Location: ./system/application/models/noticia_model.php */

Note que temos apenas um vetor para as regras ($regra) e outro para a mensagem do campo ($campo), e um método para setar cada vetor. Após isso, ele executa o método $this->validation->run() que retorna um boolean, para dizer se os requisitos foram preenchidos ou não.

Obs: O método validador($obj) é utilizado dentro do método editarNoticia() para resetar o valor do objeto, alterando-o com o valor das variáveis vinda do post.

A classe de validação possui vários parâmetros para as regras. Como não temos o objetivo de demostrar todos neste artigo, veja mais informações aqui.