Sunteți pe pagina 1din 25

Dica rpida para debugar cdigo

Quero mostrar pra vocs uma dica rpida pra debugar o cdigo usando o CodeIgniter.
Talvez muitos j saibam e seja meio bvio, mas tudo bem.
Algumas vezes precisamos imprimir na tela o contedo de algum array para analisar seus
ndices e ver o que tem dentro dele.
Voc j sabe que no pode simplesmente dar um echo num array porque no vai funcionar
devido aos tipos diferentes.
Ento, voc pode usar o var_dump, porm, ele traz muitas informaes que s vezes no so
necessrias.
Ento, voc pode usar o print_r, que traz exatamente as informaes resumidas como
precisamos.
Porm, para que o cdigo fique legvel no browser, precisamos dar uma formatada antes,
assim:
$matriz = array('a', 'b',
1 'c', 'd');
2
3
4
5

echo "<pre>";
print_r($matriz);
echo "</pre>";

Ao usar a tag pre, os dados ficam bonitinhos na tela.


Agora convenhamos, ficar digitando essas linhas a todo momento um saco certo? Ento
porque no criamos umhelper que fique disponvel para toda a aplicao.
Por isso, vamos fazer assim. Crie um arquivo chamado funcoes_helper.php e salve-o na
pasta: application/helpers
Dentro dele, coloque o seguinte cdigo:
1
2
3
4
5
6
7
8
9

<?php
function pd($valor){
echo "<pre>";
print_r($valor);
echo "</pre>";
die();
}

Dentro do arquivo criei uma simples funo chamada pd() que significa print and die.
Se voc quiser usar o var_dump, pode criar tambm uma funo chamada dd(), dump and die.
Mas aqui sua imaginao livre, basta criar o jeito que achar melhor.
Depois, abra este arquivo: application/config/autoload.php
Ache a linha onde os helpers so carregados e acrescente dentro do array o
ndice funcoes ficando assim:
$autoload['helper'] =
1
array('funcoes');

Agora, toda vez que a aplicao for carregada as funes dentro do helper estaro
disponveis para serem usadas.
Feito isso, agora de qualquer lugar de sua aplicao voc poder chamar a funo para
analisar o contedo de um array, assim:
$array =
1
array('banana','tijolo','monitor','unha','vula');
2
3

pd($array);

Ento, a tela ir imprimir isso:


Array
1
(
2
[0] => banana
3
[1] => tijolo
4
5
[2] => monitor
6
[3] => unha
7
[4] => vula
8
)

Como usar o Profiler, ferramenta de debug nativa do CodeIgniter


Se voc desenvolvedor web ento com certeza conhece as ferramentas de debug existentes
nos navegadores.
No Google Chrome se voc apertar F12, CTRL+SHIF+I ou boto direito em cima de algum
elemento e clicar em Inspecionar Elemento, voc ter acesso ferramente de debug do
navegador, que lhe permite fazer vrias anlises. Desde alterar o CSS, cdigo HTML, brincar
com o JavaScript do site, medir tempo de carregamento, etc, alm de muitas outras coisas.
No Firefox tambm existe tal ferramenta igualmente til.
Porm, como so ferramentas que rodam do lado do cliente, ou seja, no navegador, voc no
consegue debugar com tanta eficincia assim seu cdigo. Por exemplo: a partir destas

ferramentas voc no consegue visualizar uma queryrecm executada no seu cdigo.


Para contornar este problema, o CodeIgniter nos apresenta uma ferramenta nativa de debug,
chamada Profiler.
Ela tem vrios usos, como por exemplo: simples testes que envolvem tempo de carregamento
da pgina, queries que voc rodou, checar o contedo do $_POST etc.
Para habilitar esta ferramenta bem simples. Dentro de qualquer controller, acrescente a
seguinte linha:
$this->output1
>enable_profiler(TRUE);
Se quiser desabilitar, basta mudar o parmetro TRUE para FALSE, assim:
$this->output1
>enable_profiler(FALSE);
O legal que voc no precisa carregar nenhuma biblioteca previamente para usar esta
ferramenta, pois ela faz parte da biblioteca Output do CodeIgniter que carregada por
padro.
Feito isto, quando voc chamar o controller respectivo, voc ter na parte de baixo da
sua view uma tabela colorida com uma srie de informaes que podem lhe ajudar a
encontrar algum problema no seu cdigo.
Veja o print abaixo, clique para ficar maior:

Utilizei o Mini-crud que fiz neste post para o exemplo.


No controller Cadastro.php coloquei a linha que habilita o profiler imediatamente antes da
linha que carrega a viewque informa que os dados foram gravados com sucesso.
Assim, eu consigo capturar tudo o que foi postado na pgina.
Repare que o profiler mostra o tempo de carregamento da pgina, qual o endereo, qual o
mtodo e classe chamados, e o principal, a query executada, inclusive com o contedo de cada
campo.
Assim fica fcil descobrir se todos os valores esto sendo postados a partir do seu formulrio
para ter certeza que eles esto chegando no seu mtodo.
Se voc quiser ver eu explicando com mais detalhes como que usa o profiler, veja o vdeo que
fiz exatamente sobre este assunto.

Habilitando Layouts No
CodeIgniter (Template Engine)
Parte 1
Vejo muitos desenvolvedores criticarem o CodeIgniter por ele no utilizar o conceito
de Layout ou ter um Template Engine dentro dele.

Template engine ou o conceito Layouts , falando em um exemplo rpido e prtico seria


mais ou menos o seguinte:
Pense que voc tem um topo e um rodap que nunca mudam no seu portal.
Ou seja, muda apenas o meio das pginas. Veja a figura abaixo.

E a? Voc vai ter que colocar esse topo e esse rodap em todas as pginas que voc
chamar?
Ou voc malandro e vai fazer um include dentro das telas?

O Include seria uma soluo interessante mais uma Template Engine faria isso sozinho
para voc.

Pra quem no conhece nenhuma soluo para isso, o Smarty uma template Engine

das mais conhecidas no mundo do PHP.


Voc tem uma lista com outras sugestes de Templates Engine nesse link da web
Resources
Outros frameworks como o CakePHP tem uma soluo dentro dele que faz esse
trabalho.

Nesses tempos que desenvolvo em CodeIgniter j vi bizarrices do tipo colocar o


Smarty dentro do CodeIgniter ou trazer bibliotecas de outras frameworks para o Core
do CodeIgniter.

Mas podemos estender o Core do Framework e fazer ele trabalhar junto com a gente
sem precisar de muitas manobras e malabarismos. Na documentao do CodeIgniter
achamos essa prtica com o nome de Hooks ou se preferir o portugus ganchos.

H alguns anos um cara que considero um dos Gurus do desenvolvimento, Mozart


Petter, o qual tive a honra de trabalhar junto, pesquisou uma soluo nesse sentido
para que no precisssemos abandonar o CodeIgniter.
Voc encontra vrios links pesquisando no google por Layouts in CodeIgniter, onde
destaco o seguinte Blog http://hasin.wordpress.com/2007/03/05/adding-yieldcodeigniter/
Abaixo vou colocar uma soluo em 7 passos para voc implementar isso em seu
projeto de CI.
importante que voc procure entender em cada passo como o CodeIgniter vai
visualizar isso tudo.
*No se deixe confundir. fcil. Se ficar difcil h algo errado, volte e reveja os passos.
Como os cdigos so muito extensos, vou dividir em dois posts.
Parte 1 Esse (passo 1 ao 4) e Parte 2 (passo 5 ao 7) que voc acessa aqui.
Para quem no estiver com muita pacincia, estou disponibilizando tambm um
exemplo pronto de tudo funcionando que voc pode baixar aqui.
Apenas confira se o .htaccess serve para o seu servidor ou mquina.
DETALHE IMPORTANTE:
Esse projeto de exemplo foi atualizado no dia 20 de novembro de 2010. Sugesto
do Diego Felix (@diegofelix).
Confira a explicao da alterao no final da segunda parte ou clicando aqui.
1 Habilitando o Codeigniter para estender o Core

A primeira coisa a fazer habilitar o codeIgniter para estender o Core, permitir os


hooks.
Isso feito no arquivo config.php dentro da pasta config.
Procure a varivel $config[enable_hooks] e troque seu valor para TRUE, ficando como
abaixo.

/*
|-------------------------------------------------------------------------| Enable/Disable System Hooks
|-------------------------------------------------------------------------|
| If you would like to use the "hooks" feature you must enable it by
| setting this variable to TRUE (boolean). See the user guide for details.
|
*/
$config['enable_hooks'] = TRUE;

Pronto! Prximo passo.

2 Definindo um Hook

Dentro da pasta config temos um arquivo onde deve ser feitas as definies dos hooks
que voc quer utilizar.
o arquivo hooks.php. Para cada hook preciso definir um array com alguns
parmetros para que o CodeIgniter saiba o que fazer.

Importante: O ndice do array vai funcionar apenas como nome do seu hook. Voc no
vai us-lo em nenhum lugar a princpio.

Para o nosso Hook vamos definir.

O nome da Classe que voc precisa.


O nome do mtodo da classe que voc deseja chamar.

O nome do arquivo onde est desenvolvida a classe.


O directrio onde ela se encontra.
Fica da seguinte forma:

$hook['display_override'][] = array('class' => 'Layout',


'function' => 'init',
'filename' => 'Layout.php',
'filepath' => 'hooks');

Esses itens podem variar de acordo com o que voc quiser ou precisar fazer.
O manual uma grande referncia para te ajudar com isto e traz alguns detalhes que
no abordo aqui.

Certo! Voc habilitou e definiu um Hook, ou gancho. Vamos para o prximo passo.

3 Adicionando algumas constantes necessrias

No arquivo index da aplicao so definidas algumas constantes que ajudam no


desenvolvimento da nossa aplicao, como por exemplo,
a extenso dos arquivos que sero usados, constante EXT, e o BASEPATH que traz o
caminho da pasta do sistema.

Vamos adicionar aqui mais 3 constantes que vai nos facilitar l na frente quando
formos fazer nossa classe.

LAYOUTPATH Caminho onde ficar os layouts que construirmos.


JSPATH Caminho onde ficar os arquivos com javascript.
CSSPATH Caminho onde ficar os arquivos de estilo. CSS.
Ficando da seguinte forma:

/*
|--------------------------------------------------------------| DEFINE APPLICATION CONSTANTS
|--------------------------------------------------------------|
| EXT

- The file extension. Typically ".php"

| SELF

- The name of THIS file (typically "index.php")

| FCPATH

- The full server path to THIS file

| BASEPATH - The full server path to the "system" folder


| APPPATH - The full server path to the "application" folder
|
*/
define('EXT', '.php');
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
define('FCPATH', str_replace(SELF, '', __FILE__));
define('BASEPATH', $system_folder.'/');
define('LAYOUTPATH', $application_folder.'/layouts/');
define('JSPATH', $application_folder . '/js/');
define('CSSPATH', $application_folder . '/css/');
Reparem que usei a varivel $application_folder, que definida no mesmo arquivo,
para completar o caminho das minhas constantes.
Voc pode e deve mudar isso de acordo com seu projeto.

Essas constantes vo facilitar tambm para caso voc precise mudar o caminho dos
arquivos CSS por exemplo. Basta alterar aqui.

4 Construindo seu Layout

Vamos agora construir o seu Layout.


Seria aquele topo e aquele rodap que voc no quer mexer. Ou um menu lateral.

Voc pode construir o que quiser.

O local onde vamos criar nossos layouts foi definido na constante LAYOUTPATH.

Voc pode ter quantos layouts quiser e nome-los como quiser.


Mas quando formos construir a classe voc ver que definimos um Layout default para
quando nenhum for chamado.
esse que vamos criar agora. default.php

No exemplo abaixo eu criei um topo que tem um menu e um rodap simples.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"


"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


<title>{title_for_layout}</title>

{css_for_layout}
{js_for_layout}

</head>
<body>
<div id="geral">

<div id="topo">
<ul id="menu">

<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
<li><a href="#">Link</a></li>
</ul>
</div>

<div id="meio">

{content_for_layout}

</div>

<br style="clear: both;" />

<div id="rodape">
<p class="rodape">
Todos os direitos reservados - Bla Bla Bla
</p>
</div>

</div>
</body>
</html>

necessrio prestar ateno em 4 variveis que deixamos soltas no meio desse HTML
do Layout.

Primeira {title_for_layout}
Segunda {css_for_layout}
Terceira {js_for_layout}
Quarta {content_for_layout}
Explicando rapidamente:
Essas Strings vo ser substitudas de acordo com o que definirmos no Controller em
um prximo passo.

No lugar de {title_for_layout} ir o ttulo da pgina. legal podermos definir um ttulo


pelo controlador para deix-lo dinmico e assim ajudar no SEO.

No lugar de {css_for_layout} e {js_for_layout} entraro os arquivos de CSS e


JavaScript que definirmos para nossa pgina.
Voc no precisa chamar todos os CSS ou JavaScripts se no for us-los. Essa uma
grande sacada dessa soluo.
Lembro de pegar projetos em Smarty onde estavo definidos inmeros JavaScripts e
CSS em um top.php onde em vrias pginas eles nem era usados.

Por ltimo, no lugar de {content_for_layout} ir o contedo da nossa View.


o meio, o que muda.
o que vamos fazer no prximo passo que est no prximo post.

Ateno!! Este artigo foi escrito em cima da verso 1 do Codeigniter. Para

detalhes de como usar com a verso 2 do framework clique aqui.


Continuando a parte 1 deste post.
Se voc perdeu a primeira parte clique aqui para ler a primeira parte.
5 Construindo sua View
Sua View deve ser feita normalmente, como voce j est acostumado a fazer,
com o nome que voc colocaria normalmente.
Apenas com o contedo que muda de uma pgina para outra.
O HTML que voc colocar aqui na View ir substituir a
varivel {content_for_layout}que definimos no layout acima.
Vou colocar nessa nossa view de exemplo apenas um ttulo e um pargrafo
para demonstrar.
Ficando assim:
<h1>Titulo VIEW</h1>

<p>Paragrafo teste teste teste teste.</p>

Chamei essa view de home.php.


6 Desenvolvendo a Classe
Quando definimos nosso Hook no passo 2, setamos que a pasta onde ficaria
nossa classe seria a pasta hooks que vem por padro no projeto do
CodeIgniter.

Vamos criar nossa classe dentro dessa pasta, e, com o nome que tambm
especificamos na definio do Hook que foi Layout.php
Se voc no seguiu o exemplo, faa suas devidas adaptaes.
A classe um pouco extensa, leia com ateno.
Para ajudar ela est com os comentrios do prprio Mozart Petter.

// Padrao do CI para no acessar a Classe direto pelo Browser


<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
* Layout Class
*
* @package hooks
* @description Implementa as views do tipo layout no framework.
*/

class Layout
{

public $base_url;

/**
* Metodo que executa as implementacoes.
* Este metodo e chamado atraves do arquivo hooks.php
* na pasta config.
*
* @return
*/
public function init()
{
// Instancia do CI.
$CI =& get_instance();

// Definindo o base_url.
$this->base_url = $CI->config->slash_item('base_url');

// Pegando a saida que o CI gera normalmente.


$output = $CI->output->get_output();

// Pegando o valor de title, se definido no controller.


$title = (isset($CI->title)) ? $CI->title : '';

// Links CSS definidos no controlador.


$css = (isset($CI->css)) ? $this->createCSSLinks($CI->css) : '';

// Links JS definidos no controlador.


$js = (isset($CI->js)) ? $this->createJSLinks($CI->js) : '';

// Se layout estiver definido e a regexp nao bater.


if (isset($CI->layout) && !preg_match('/(.+).php$/', $CI->layout))
{
$CI->layout .= '.php';
}
else
{
$CI->layout = 'default.php';
}

// Definindo caminho completo do layout.


$layout = LAYOUTPATH . $CI->layout;

// Se o layout for diferente do default, e o arquivo nao existir.


if ($CI->layout !== 'default.php' && !file_exists($layout))
{
// Exibe a mensagem, se o layout for diferente de '.php'.
if ($CI->layout != '.php') show_error("You have specified a invalid layout: " .
$CI->layout);
}

// Se o arquivo layout existir.


if (file_exists($layout))
{
// Carrega o conteudo do arquivo.
$layout = $CI->load->file($layout, true);

// Substitui o texto {content_for_layout} pelo valor de output em layout.


$view = str_replace('{content_for_layout}', $output, $layout);

// Substitui o texto {title_for_layout} pelo valor de title em view.


$view = str_replace('{title_for_layout}', $title, $view);

// Links CSS.
$view = str_replace('{css_for_layout}', $css, $view);

// Links JS.

$view = str_replace('{js_for_layout}', $js, $view);


}
else
{
$view = $output;
}

echo $view;
}

/**
* Gera os links CSS utilizados no layout.
*
* @return void
*/
private function createCSSLinks($links)
{
$html = "";

for ($i = 0; $i < count($links); $i++)


{
$html .= "<link rel='stylesheet' type='text/css' href='" . $this->base_url .
CSSPATH . $links[$i] . ".css' media='screen' />n";
}

return $html;

/**
* Gera os links JS utilizados no layout.
*
* @return void
*/
private function createJSLinks($links)
{
$html = "";

for ($i = 0; $i < count($links); $i++)


{
$html .= "<script type='text/javascript' src='" . $this->base_url . JSPATH .
$links[$i] . ".js'></script> n";
}

return $html;
}

}
7 Fazendo as chamadas no Controller
Chegou o momento final!
hora de juntar tudo isso que fizemos at agora.

A construo do seu controller normal, como voc est acostumado, mas


temos que inserir algumas variveis globais nele.
Uma para o Layout default do controller, para que voc no precise fazer a
mesma definio vrias vezes.
Uma para o ttulo, onde voc pode definir um default para todos as pginas
que vo surgir desse controller mas, o interessante estar um ttulo por
pgina.
Outra para guardar um Array dos CSSs que voc vai usar na pgina.
E por ltimo, outro Array para guardar os JavaScripts que voc vai usar na
pgina.
Vejamos como fica.
Acompanhe pelos comentrios.

<?php

/**
*
*/
class Principal extends Controller
{

/**
* Layout default utilizado pelo controlador.
*/
public $layout = 'default';

/**
* Titulo default.
*/

public $title = '::: Titulo default :::';

/**
* Definindo os css default.
*/
public $css = array('default');

/**
* Carregando os js default.
*/
public $js = array('home');

/**
* Construtora.
* @return
*/
function Principal()
{

parent::Controller();

// Metodoo index
function index()
{

// Carregando a view.
$this->load->view('home');
}

// Metodo teste
function teste()
{
//Title
$this->title = '::: TESTE Ttulo :::';

//CSS
$this->css = array('test');

//JS
$this->js = array('jquery');

// Carregando a View
$this->load->view('teste');
}

?>

Vamos reparar no seguinte.


H dois mtodos nesse controller que vo chamar pginas diferentes, o index e

o teste.

Para o index no definimos nada de Layout, Titulo, CSS ou JS.


Ou seja, vai vir tudo do valor default que usamos quando definimos as
variveis globais.

J no mtodo teste, por algum motivo precisamos de um CSS, um JS e um


Ttulo diferente.
Ento redefinimos esses valores no nosso mtodo com o que precisamos.

A gente poderia ter definido um outro Layout caso tivesse a necessidade, da


mesma forma com que fiz com esses valores.
A, claro, teria que criar um outro Layout na pasta layouts.

UPDATE 20 DE NOVEMBRO DE 2010


Detalhe importante observado pelo Diego Felix (@diegofelix), que comentou
esse detalhe abaixo nos comentrios, no dia 16 de setembro desse mesmo
ano.

Eu tenho como costume em meus projetos com CI, retirar a pasta system no
qual ele vem por padro.
Fao ento a alterao da varivel $system_folder no arquivo de configurao
e tudo segue sem problemas.
Exceto esse tutorial, que no leva em considerao essa pasta system.
Voc tem duas opes para consertar isso:

Primeiro:
No local onde so definidas as variveis contantes, adicionar sua pasta system
antes de $application_folder.
Exemplo: define(LAYOUTPATH, system/ . $application_folder./layouts/);
Particularmente acho essa soluo acima atrasada, por deixar o projeto
esttico.
Se ocorrer de voc alterar a pasta system, ter que alterar nesse local
tambm. Chato.
Segundo:
Seguindo essa linha de raciocnio, de no deixar o projeto esttico, prefiro fazer
o seguinte:
No local onde so definidas as variveis constantes, adicionar a
varivel$system_folder.
Exemplo: define(LAYOUTPATH, $system_folder . / .
$application_folder./layouts/);
Mas h um detalhe.
No arquivo index.php, em torno da linha 53, adicionado a
varivel $system_foldero seu caminho completo do servidor. Isso, claro, vai
gerar problemas para o projeto.
O que eu fao ento pegar as variveis constantes que usam a pasta system,
e jogar antes desse bloco.
Se voc seguir pelo projeto exemplo, ver que as coloquei logo depois do
comentrio END OF USER CONFIGURABLE SETTINGS.
Feito isso, caso voc altera sua pasta system, basta alterar no local de sempre
para o projeto continuar funcionando.

Pessoal isso!
Fazia tempo que queria escrever sobre isso, espero que ajude a galera por a.
Dvidas podem mandar sem problemas, vou responder no que estiver a meu

alcance.
Se voc teve dificuldades, baixe o projeto pronto aqui e d uma olhada mais de
perto.
Agradeo novamente ao Mozart Petter, grande Brother, que implementou essa
soluo que uso at hoje em meus projetos. E, como sempre, tambm ao
pessoal que garante minhas 30 visitas dirias, Valeu!

Fala pessoal!
O que mais gera acessos aqui no Blog so os artigos sobre
Codeigniter, e principalmente a parte de layouts. o
artigo Habilitando Layouts no CodeIgniter (Template
Engine) que est dividido em parte 1 e parte 2.
Como esse artigo tem mais de um ano, resolvi dar um upgrade
nele com algumas observaes.

Desde que ele foi escrito temos algumas novidades. A principal


dela o lanamento de uma verso crtica do Codeigniter. Mas
no se preocupe, a mecnica do artigo continua funcionando.
Apenas atente para alguns detalhes.

Preste ateno para a parte do seu controller:


Agora ele extende da classe CI_Controller e no mais da classe Controller.
Agora voc no tem de ter mais um mtodo construtor com o mesmo nome da classe.
Pode arrancar fora aquilo sem medo.

Outros:

No tutorial anterior h uma correo porque eu tratava minha pasta system diferente do
convencional. Com a ajuda e os comentrios de vocs, foi feita uma correo que est no
final do post. Agora na verso 2 est tudo ok. A pasta system vem separada da pasta
application.
Na verso 2 temos agora arquivos .htaccess, arquivos de configurao, dentro das pastas
application e da pasta system. Dentro deles h uma regra para recusar qualquer coisa que
tentar acessar a pasta. Certifique-se que, em caso de colocar seus arquivos de estilo, ou
seus arquivos javascript dentro de application por exemplo, alterar essa regra no
.htaccess.

Ento voc pode seguir normalmente o tutorial, apenas adapte


os detalhes citados acima.
Est com dificuldades ou preguia? Clique aqui para baixar um
exemplo com Layouts em cima do Codeigniter 2.
isso galera. Abrao!!

S-ar putea să vă placă și