cheap dedicated servers

Newton Wagner se desenvolvendo na web

15Dec/062

Code Igniter: Estendendo o Controller

Continuando a adaptação da framework Code Igniter para utilização no meu projeto, e também para utilização no meu trabalho, desta vez vou falar de como estender o Controller para sempre carregar uma visualização padrão, e inserir nela a view de conteúdo.

Como já disse anteriormente, para criar extensões das core classes do CI, devemos salvar o arquivo com na pasta application\libraries, com o prefixo MY_. Nesse caso, teremos o arquivo MY_Controller, e a classe de mesmo nome.

Vamos para o código, depois eu explico os detalhes:

class MY_Controller extends Controller
{
	/**
	 * metodo construtor da classe
	 */
	function MY_Controller()
	{
		parent::Controller();
	}
	/**
	 * mostra a view definida utilizando uma estrutura pre-definida
	 * @param	[str] nome da view a ser exibida
	 * @param	[arr] array com os dados da view a ser exibida
	 */
	function _mostrar($nmView, $viewData)
	{
		$conteudo = $this->_carregarConteudo($nmView, $viewData);
		$data = array(
			"conteudo" => $conteudo
		);
		$this->load->view('estrutura', $data);
	}
	/**
	 * carrega a view a ser inserida em uma estrutura pre-definida
	 * @param 	[str] nome da view a ser inserida
	 * @param 	[arr] array com os dados da view a ser exibida
	 * @return 	[vew] objeto de View para ser incluido
	 */
	function _carregarConteudo($nmView, $viewData)
	{
		return $this->load->view($nmView, $viewData, TRUE);
	}
}

Criamos o metodo _mostrar(), que deve ser utilizado nas suas classes de controle para exibir uma view (ao invés de usar $this->load->view()). O método _carregarConteudo() não é totalmente necessário para este exemplo, mas ele é responsável por carregar a view de conteúdo da sua página, ou seja, o que será inserido dentro da view geral.

Nossas classes de controle da aplicação, agora teriam funcionamento parecido ao desta:

class Meucontrole extends MY_Controller
{
	function Meucontrole()
	{
		parent::MY_Controller();
	}
	function index()
	{
		$data = array("var"   => "valor");
		$this->_mostrar('minhaview', $data);
	}
}

Declaramos a classe estendendo de MY_Controller, definimos o método construtor, e, no método de exibição, definimos "var" para ser utilizada na view "minhaview", através do método _mostrar() que criamos anteriormente. Dessa forma, o conteúdo de "minhaview" será inserido na view "estrutura", através da variável conteudo.

Este é mais um exemplo simples, que pode ser incrementado conforme suas necessidades. Pode-se criar chamadas de Menus dinâmicos, Banners de Publicidades, tudo automaticamente, sem precisar carregá-los em todo controle que você criar.

Artigos Relacionados:

12Dec/060

Bug estendendo o Code Igniter: MY_Model

No meu artigo sobre como estender o Core do Code Igniter, eu informei sobre um possível bug que não nos permite criar nosso MY_Model, como manda o user guide da framework.

Reportei o bug no fórum e até hoje não obtive resposta do desenvolvedor do CI, mas acredito que a solução que encontrei é aceitável. A alteração deve ser realizada no arquivo Loader.php, que está na pasta system\libraries. No método model() desta classe, temos o seguinte trecho:

if ( ! class_exists('Model'))
{
    require_once(BASEPATH.'libraries/Model'.EXT);
}

Ou seja, ele carrega a classe Model, mas não realiza nenhuma verificação se criamos alguma estensão (MY_Model). Para resolver o problema, verifiquei que existe uma função que executa esta tarefa de carregar uma classe buscando por extensões. Logo, bastava utilizá-la. No lugar do código anterior, coloquei a chamada para a função:

load_class('Model', false);

O if não é necessário, pois a função também realiza esta verificação. O segundo parâmetro é utilizado para que a classe não seja instanciada, apenas carregada. Assim, evitamos o problema de instanciar classes, dentro de um controle, sem que elas tenham sido definidas.

Artigos Relacionados:

1Dec/066

Estendendo o Core do Code Igniter

Uma das razões que nos faz utilizar uma framework é poupar tempo. Porém, as vezes é preciso fazer algumas adaptações para melhorarmos ainda mais a eficiência no desenvolvimento da aplicação. É aí que a framework precisa oferecer flexibilidade.

Como já disse anteriormente, estou utilizando o Code Igniter para desenvolver um projeto pessoal, e vou mostrar o princípio de uma pequena adaptação que vai me poupar muito tempo e várias linhas de código.

A framework possui uma funcionalidade chamada Active Records, que simplifica os comandos básicos de acesso ao banco (Select, Update, Delete e Insert). Veja um exemplo de um Insert, tirado do próprio user guide:

$data = array(
               'title' => $title,
               'name' => $name,
               'date' => $date
);
$this->db->insert('mytable', $data);

Simples, porém, pra utilizar este método dentro de um método inserir() numa classe de modelo, eu preciso sempre especificar a tabela e seus campos em um array com seus respectivos valores.

Utilizando Modelos que representam as Tabelas do meu banco, isto é, a classe conter atributos iguais aos campos das tabelas, podemos criar uma estensão da classe Model para não ter trabalho com estes métodos, e fazer nossos modelos estenderem desta nova classe.

O código abaixo deverá ser colocado num arquivo chamado MY_Model.php dentro do diretório application\libraries, que o CI se encarrega de carregá-la pra você (1).

class MY_Model extends Model
{
    var $nmTabela;
    var $nmCampoId;

    /**
    * metodo construtor da classe
    * @param    [str] nome da tabela do objeto
    * @param    [str] nome do campo identificador do objeto
    */
    function MY_Model($nmTabela, $nmCampoId)
    {
        $this->nmTabela  = $nmTabela;
        $this->nmCampoId = $nmCampoId;

        parent::Model();
    }

    /**
    * metodo de insercao no banco
    * @param    [arr] array com os dados do objeto para insercao do banco
    * @return   [boo] sucesso ou falha no processo
    */
    function inserir($arrDados)
    {
        $atributos = get_class_vars( get_class($this) );
        foreach ($atributos as $nmAtributo => $valor)
        {
            if ( ($nmAtributo != 'nmTabela') && ($nmAtributo != 'nmCampoId') )
                $this->$nmAtributo = $arrDados[$nmAtributo];
        }

        return $this->db->insert('usuarios', $this);
    }
}

Dessa forma, toda classe de modelo da sua aplicação terá um método inserir() onde você só precisa passar por parâmetro um array (provavelmente vindo de um formulário) com o nome dos campos da classe e seus valores. O método se encarrega de definir os valores para os atributos do objeto e chamar a função de inserção.

Como o artigo ficou um pouco grande, resolvi omitir os métodos alterar() e excluir(), mas o arquivo completo está disponível para download aqui. Este foi apenas um exemplo simples do que podemos fazer em cima de uma boa estrutura.

(1) - Apesar do que diz o manual, o Code Igniter não carrega o MY_Model automaticamente. E não adianta também usar o autoload, pois ali o Model ainda não foi carregado. Você pode criar um MY_Controller que executa a chamada do MY_Model automaticamente, usando: $this->load->model('model');. Acredito que seja um bug do CI, mas ainda vou verificar com mais calma.

ATENÇÃO: No meu entendimento existe um BUG no framework em relação ao carregamento do MY_Model, conforme observação acima. A solução foi reportada para a equipe do CI, mas não tive retorno. A quem interessar, veja mais informações no artigo do BUG no Loader de Models.

Artigos Relacionados:

24Nov/064

Framework Code Igniter

Dando início aos estudos de frameworks PHP, vou falar um pouco sobre a que eu estou planejando adotar para trabalhar em um projeto pessoal. Apesar de não ter avaliado as outras fws disponíveis, como estou sem muito tempo, a maneira de testar vai ser usando.

Framework Code IgniterOuvi muita gente falando bem do Code Igniter, e resolvi dar esse voto de confiança. :)

Pra começar, gostei muito do guia do usuário. Explica o básico sobre o funcionamento do framework, fazendo que você passe pelas 3 camadas do MVC em um piscar de olhos. Além disso, explica algumas particularidades da framework, com uma linguagem tranquila e muitos exemplos.

A participação da comunidade é bem ativa, e a primeira dúvida que eu tive sobre a existência de uma funcionalidade nativa da framework (ou se eu teria que implementar), encontrei rapidamente no fórum, que tem uma boa quantidade de posts.

Com a mão na massa, em poucas horas já comecei a me sentir a vontade, implementando algumas melhorias estendendo algumas classes do núcleo da fw. Estou apenas começando, mas já acredito que ela vai cumprir seu papel e me poupar muitas horas de programação, além de me oferecer uma boa organização do código. Com o tempo, vou postando aqui mais informações sobre minha experiência com o Code Igniter.

Obs.: Para os fãs do CakePHP, entrei em contato com o dono do site cakephp.com.br e ele ficou de escrever a respeito da fw. Vamos aguardar...

Artigos Relacionados:

Lomadee, uma nova espécie na web. A maior plataforma de afiliados da América Latina.