Quarta-feira, 04 de novembro de 2009 às 11h15

Sobrescrevendo métodos do CodeIgniter sem perder suas funcionalidades originais

Faça o curso: jQuery na Prática

Leia os artigos anteriores:

Operações de banco de dados com o CodeIgniter

Framework CodeIgniter: motivos e modo de usar

*

Vamos continuar a seqüência de artigos sobre o fremework CodeIgniter. No último artigo falei sobre o uso de banco de dados com o CI; hoje veremos como podemos estender uma classe padrão do CI para adicionar métodos mais específicos para um determinado projeto, ou mesmo para vários projetos.

O CodeIgniter possui uma característica interessante e muito simples de ser utilizada. Vamos supor que queremos adicionar algo a uma função do core do CI, mas não queremos perder a função em si, já que ela possui diversas coisas embutidas na própria classe. Acrescentando a isso, supomos também que essa funcionalidade nova será útil em todo o projeto. Para isso, o CI possui uma forma rápida e prática de se aproveitar da herança (orientação a objetos) para que, com poucos passos, seja criada uma classe intermediária, que servirá como substituta da classe original, mas sem perder todas as outras coisas já implementadas na classe original, e ainda sem que seja necessária a alteração de todas as referências que já estão chamando a classe original, ou seja, essa alteração não irá afetar em nada o restante do site em produção.

Para o nosso exemplo, vamos adicionar um problema simples: queremos que para cada arquivo da camada view que for chamada, seja possível ser identificado que arquivo está sendo parseado, através do código-fonte. Essa prática é utilizada em muitos lugares para que seja fácil a identificação de qual arquivo precisa ser alterado em determinado módulo do site.

Na prática, vamos adicionar um comentário em formato html dessa maneira (supondo que o arquivo sendo visualizado no momento seja o admin/usuario/add.php):

<!--TemplateName: admin/usuario/add.php-->

Dessa maneira é mais simples a manutenção da camada view do site.

Nos artigos anteriores já foi mostrado um pouco de como funciona comando view(), hoje vamos continuar usando essa chamada ao método view, mas vamos criar uma camada intermediária com a nossa versão nessa camada.

O método view está localizado na classe pré-carregada: Loader, e ele possui a seguinte assinatura:

view( String, Array/Object, Boolean )

Os dois primeiros parâmetros já foram utilizados nos artigos anteriores, servem como o caminho do arquivo php que será a visualizado e um array ou object (que internamente se transforma em array) com os dados que estarão visíveis dentro da view. Esse terceiro parâmetro é um valor do tipo boolean que indica se deseja que o template não seja exibido no browser, mas sim seja retornado seu valor como uma string para alguma variável de retorno qualquer, o padrão é false, ou seja, o padrão joga o conteúdo no browser.

É esse o método que iremos sobrescrever. Para isso, vamos criar um arquivo no diretório: /system/application/libraries/ com o nome: "MY_Loader.php".
Esse prefixo "MY_" está definido dentro do config do Framework (o mesmo config já discutido nos capítulos anteriores), basta achar a seguinte linha

$config['subclass_prefix'] = 'MY_';

e trocar o seu valor, caso ache importante fazer isso. Eu acho mais interessante sempre usar os padrões já utilizados, em caso de outra pessoa que já conhece o CI precisar mexer, pois fica mais intuitivo.

Nesse novo arquivo, basta criar uma classe com o mesmo nome, que estenda a classe original, com o prefixo CI_ Depois disso, basta criar um construtor da classe, chamando o construtor da classe pai... ficará dessa forma:

class MY_Loader extends CI_Loader{
    function MY_Loader()
    {
        parent::CI_Loader();

    }
}

Após esses passos, o sistema estará utilizando essa versão da classe Loader, e essa versão da classe Loader possui todas as características da classe original, agora tudo que precisamos fazer para que a tarefa inicial seja cumprida é criar um método view. É simples, basta criar um método que tenha a mesma assinatura, dar um "echo" de uma string com o comentário do nome do arquivo atualmente sendo parseado e depois chamar o view original. Ficará dessa forma:

function view($view, $vars = array(), $return = FALSE)
{
      echo "<!--TemplateName: ".$view.".php-->\n\r";
      parent::view($view,$vars, $return);
}

Simples assim!

Para testar o funcionamento disso, basta entrarmos em algumas das funções que já criamos nos artigos anteriores e visualizar o código-fonte.

Por exemplo, vamos entrar na url: exemplo/index.php/welcome/listar

O código-fonte mostrado é o seguinte (a primeira linha possui o arquivo que estamos parseando, ou seja a idéia funcionou normalmente):

<!--TemplateName: listar.php-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Listar</title>
</head>
<body>
<h1>listar!</h1>
123456<br />exemplo valor 2<br />Array
(
    [A] => 1
    [B] => 777
)
<br />Alantiel F. Marins - 21<br />Thomas H. Cormen - 53<br />Número de registros retornados: 2</body>
</html>

Fizemos um exemplo bem simples, mas essa idéia pode ser usada para sobrescrever qualquer outro método da CI e as coisas que podem ser feitas ficam a cargo da imaginação e necessidade de cada um.

Nenhum comentário até agora

Cancelar resposta

Qual a sua opinião?

Faça login abaixo ou cadastre-se rapidamente.


Sobre o Autor
Alantiel Freire Marins é Desenvolvedor Web há mais de 4 anos, representante da Fatec Zona Sul na maratona brasileira de programação por dois anos consecutivos. Estudante de Algoritmos e Estrutura de dados, atualmente é webmaster do UOL.

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.