Dev (Back & Front)ARTIGO

Validação e Internacionalização com CodeIgniter

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

<br />$lang['error_cad'] = "Erro ao inserir Notícia";<br />$lang['error_alt'] = "Erro ao alterar Notícia";<br />$lang['error_del'] = "Erro ao excluír Notícia";<br /><br />$lang['noticia_show'] = "Mostrar Notícia";<br />$lang['noticia_cad']  = "Castrar Notícia";<br />$lang['noticia_alt']  = "Editar Notícia";<br />$lang['noticia_del']  = "Excluir Notícia";<br /><br />$lang['campo_titulo_noticia'] = "Título Notícia";<br />$lang['campo_id_categoria']   = "Categoria Notícia";<br />$lang['campo_texto_noticia']  = "Texto Notícia";<br /><br />$lang['display_id_categoria'] = "Selecione uma Categoria";<br />$lang['noticia_del_regitro']  = "Excluir registros";<br /><br />$lang['template_topo']       = "Topo do site";<br />$lang['template_copyritght'] = "Todos os direitos reservados";<br /><br />$lang['home_titulo'] = "Link para Download deste sistema";<br />$lang['home_click']  = "clique aqui";<br /><br /><br />/* End of file system_lang.php */<br />/* Location: ./system/language/pt-br/system_lang.php */

english

<br />$lang['error_cad'] = "Error inserting News";<br />$lang['error_alt'] = "Error updating News";<br />$lang['error_del'] = "Error deleting News";<br /><br />$lang['noticia_show'] = "Show News";<br />$lang['noticia_cad']  = "Insert News";<br />$lang['noticia_alt']  = "Edit News";<br />$lang['noticia_del']  = "Delete News";<br /><br />$lang['campo_titulo_noticia'] = "Title News";<br />$lang['campo_id_categoria']   = "Category News";<br />$lang['campo_texto_noticia']  = "Text News";<br /><br />$lang['display_id_categoria'] = "Select a Category";<br />$lang['noticia_del_regitro']  = "Delete records";<br /><br />$lang['template_topo']       = "Top of site";<br />$lang['template_copyritght'] = "All rights reserved";<br /><br />$lang['home_titulo'] = "Download link for this system";<br />$lang['home_click']  = "click here";<br /><br /><br />/* End of file system_lang.php */<br />/* 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

<br />class noticia_model extends Model {<br /><br />    private $vet_dados = array();<br /><br />    public function __construct() {<br />        parent::Model();<br />    }<br /><br />    public function mostrar() {<br /><br />        $this->vet_dados["noticia"] = $this->getNoticia();<br /><br />        return $this->parser->parse("noticia/noticia_view", $this->vet_dados, TRUE);<br /><br />    }<br /><br />    public function cadastrarNoticia() {<br /><br />        $noticia->id_noticia     = "";<br />        $noticia->titulo_noticia = $this->input->post("titulo_noticia");//variáveis do posto para retorno<br />        $noticia->texto_noticia  = $this->input->post("texto_noticia");//variáveis do posto para retorno<br /><br />        $categoria = $this->getCategoria();<br /><br />        for ($i = 0; $i < count($categoria); $i++) {<br /><br />            if ($this->input->post("id_categoria") != '') {<br /><br />                $categoria[$i]->selected = $this->validation->set_select('id_categoria', $categoria[$i]->id_categoria);//variáveis do posto para retorno<br /><br />            }<br /><br />        }<br /><br />        $this->vet_dados["nome_tela"] = $this->lang->line('noticia_cad');//nome da tela<br />        $this->vet_dados["acao"]      = "inserir";//ação da controller<br />        $this->vet_dados["noticia"]   = array($noticia);//objeto noticia<br />        $this->vet_dados["categoria"] = $categoria;//vetor de objetos de categorias<br />        $this->vet_dados['msg_erro']  = $this->validation->error_string;//msg de erro<br />        $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<br /><br />        return $this->parser->parse("noticia/noticia_cad_view", $this->vet_dados, TRUE);<br /><br />    }<br /><br />    public function editarNoticia() {<br /><br />        $noticia   = $this->getNoticia($this->uri->segment(3));<br />        $categoria = $this->getCategoria();<br /><br />        for ($i = 0; $i < count($categoria); $i++) {<br /><br />            if ($this->input->post("id_categoria") != '') {<br /><br />                $categoria[$i]->selected = $this->validation->set_select('id_categoria', $categoria[$i]->id_categoria);//se for postado difrente de vazio ele preenche<br /><br />            } else {<br /><br />                if ($categoria[$i]->id_categoria == $noticia->id_categoria && !isset($this->validation->id_categoria)) {<br /><br />                    $categoria[$i]->selected = 'selected="selected"';//se ele não trocou a opção<br /><br />                } else {<br /><br />                    $categoria[$i]->selected = '';<br /><br />                }<br /><br />            }<br /><br />        }<br /><br />        $noticia = $this->validador($noticia);//método para resetar o valor do objeto, alterando com o valor do post<br /><br />        $this->vet_dados["nome_tela"] = $this->lang->line('noticia_alt');//nome da tela<br />        $this->vet_dados["acao"]      = "alterar";//ação da controller<br />        $this->vet_dados["categoria"] = $categoria;//vetor de objetos de categorias<br />        $this->vet_dados["noticia"]   = array($noticia);//objeto notícia<br />        $this->vet_dados['msg_erro']  = $this->validation->error_string;//retorno do erro<br />        $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<br /><br />        return $this->parser->parse("noticia/noticia_cad_view", $this->vet_dados, TRUE);<br /><br />    }<br /><br />    public function delNoticia() {<br /><br />        $this->vet_dados["noticia"]   = $this->getNoticia();<br />        $this->vet_dados["nome_tela"] = $this->lang->line('noticia_del_regitro');//nome da tela<br />        $this->vet_dados["acao"]      = "excluir";<br /><br />        return $this->parser->parse("noticia/noticia_del_view", $this->vet_dados, TRUE);<br /><br />    }<br /><br />    public function getNoticia($id=null) {<br /><br />        $this->db->from("noticia");<br /><br />        if ($id != null) {<br />            $this->db->where("id_noticia", $id);<br />            return $this->db->get()->row();<br />        } else {<br />            return $this->db->get()->result();<br />        }<br /><br />    }<br /><br />    public function getCategoria($id=null) {<br /><br />        $this->db->from("categoria");<br />        $this->db->orderby("nome_categoria");<br /><br />        if ($id != null) {<br />            $this->db->where("id_categoria", $id);<br />            return $this->db->get()->row();<br />        } else {<br />            return $this->db->get()->result();<br />        }<br /><br />    }<br /><br />    public function inserirNoticia() {<br /><br />        if ($this->input->post('titulo_noticia')) {<br />            $this->db->set('titulo_noticia', $this->input->post('titulo_noticia',TRUE));<br />        }<br /><br />        if ($this->input->post('id_categoria')) {<br />            $this->db->set('id_categoria', $this->input->post('id_categoria',TRUE));<br />        }<br /><br />        if ($this->input->post('texto_noticia')) {<br />            $this->db->set('texto_noticia', $this->input->post('texto_noticia',TRUE));<br />        }<br /><br />        $this->db->set('data_noticia', date("Y-m-d H:i:s"));<br /><br />        $this->db->insert('noticia');<br /><br />        return $this->db->insert_id() > 0 ? TRUE : FALSE;<br /><br />    }<br /><br />    public function alterarNoticia() {<br /><br />        if ($this->input->post('titulo_noticia')) {<br />            $this->db->set('titulo_noticia', $this->input->post('titulo_noticia',TRUE));<br />        }<br /><br />        if ($this->input->post('id_categoria')) {<br />            $this->db->set('id_categoria', $this->input->post('id_categoria',TRUE));<br />        }<br /><br />        if ($this->input->post('texto_noticia')) {<br />            $this->db->set('texto_noticia', $this->input->post('texto_noticia',TRUE));<br />        }<br /><br />        $this->db->where('id_noticia', $this->input->post('id_noticia'));<br /><br />        return $this->db->update('noticia');<br /><br />    }<br /><br />    public function excluirNoticia() {<br /><br />        if ($this->input->post('id_tabela')) {<br />            $this->db->where_in('id_noticia', $this->input->post('id_tabela'));<br />            $this->db->delete('noticia');<br />            return $this->db->affected_rows() > 0 ? TRUE : FALSE;<br />        } else {<br />            return FALSE;<br />        }<br /><br />    }<br /><br />    /**<br />     * Método que faz a validação dos campos<br />     *<br />     * @return boolean<br />     */<br />    public function validacao() {<br /><br />        $regra['titulo_noticia'] = "trim|required";//campo obrigatório<br />        $regra['id_categoria']   = "trim|required|numeric";//campo obrigatório e numerico<br />        $regra['texto_noticia']  = "trim|required";//campo obrigatório<br /><br />        //descrição traduzida<br />        $campo['titulo_noticia'] = $this->lang->line('campo_titulo_noticia');<br />        $campo['id_categoria']   = $this->lang->line('campo_id_categoria');<br />        $campo['texto_noticia']  = $this->lang->line('campo_texto_noticia');<br /><br />        $this->validation->set_rules($regra);//seta campos<br />        $this->validation->set_fields($campo);//seta descrição traduzida<br /><br />        return $this->validation->run();<br /><br />    }<br /><br />    /**<br />     * Método que pega os campos postados e preenche como veio do formulário<br />     *<br />     * @param object $obj<br />     * @return object<br />     */<br />    public function validador($obj) {<br /><br />        if (isset($this->validation->titulo_noticia)) {<br />            $obj->titulo_noticia = $this->validation->titulo_noticia;<br />        }<br /><br />        if (isset($this->validation->id_categoria)) {<br />            $obj->id_categoria = $this->validation->id_categoria;<br />        }<br /><br />        if (isset($this->validation->texto_noticia)) {<br />            $obj->texto_noticia = $this->validation->texto_noticia;<br />        }<br /><br />        return $obj;<br /><br />    }<br /><br />}<br /><br />/* End of file noticia_model.php */<br />/* 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.

é empreendedor, diretor da Zorbit Soluções Corporativas em TI (https://www.zorbit.com.br), trabalha com Tecnologia há mais de dez anos. Especialista em desenvolvimento web e infra-estrutura em Cloud Computing. Tem se especializado em entregas contínuas, gerenciamento de projetos ágeis e aplicativos móveis.

Ver perfil