Templates no CodeIgniter

21 de maio de 2012, em Integração, por

Como vimos no artigo sobre views no CodeIgniter (e reforçamos na explicação sobre como models, views e controllers trabalham juntos), os models no CI são muito importantes, pois exibem toda a informação necessária ao site/software/sistema.

Como visto, nos controllers é que “chamamos” a(s) view(s), passando eventuais variáveis necessárias através de um array. Mas, num sistema “do mundo real”, é bastante comum que alguns controllers (se não, todos) tenham muitas e muitas funções e, como já sabemos, as URLs no CodeIgniter são “mapeamentos” das funções dos controllers.

E, nesses sistemas, também é bastante comum que haja padronização de determinados elementos do site, como, por exemplo, cabeçalho e rodapé. Então, para cada função-URL, haveria a necessidade, ao exibir o conteúdo principal através da chamada à view, também chamar as “views complementares”, tal como:

$this->load->view('include/head');
$this->load->view('conteudo', $data);
$this->load->view('include/footer');

Imagine, então, um controller que possui 20, 30, 40 (ou mais) funções com suas respectivas chamadas às “views complementares”. É um bocado de trabalho. E, de repente, é preciso mudar algum nome ou parâmetro em todas essas funções… Felizmente, existe uma maneira de contornar essa limitação: templates no CodeIgniter.

Explicando melhor templates no CodeIgniter

Geralmente, quando se fala em “templates”, logo vem à cabeça aqueles sites onde se compra e/ou se faz download de estruturas HTML/CSS/imagens de soluções genéricas de desenvolvimento web. Sim, esses também são templates, mas estamos falando de algo diferente aqui.

Templates, em nosso caso, são estruturas com elementos comuns em que podemos, conforme a situação, “enxertar” (ou, se preferir um termo mais comum, incluir) o conteúdo que queremos, sem a necessidade de, sempre, chamar as partes comuns (tais como cabeçalho e rodapé), já que as próprias partes comuns, agora, fazem parte do próprio template.

Existem diversas maneiras de implementar um sistema de templates no CI; entretanto, depois de alguns testes, a indicação deste artigo ficará com o Most Simple Template Library for CodeIgniter, que, como indica o próprio nome, é o sistema de template mais simples para CodeIgniter!

Usando a biblioteca Most Simple Template Library for CodeIgniter

A Most Simple Template Library for CodeIgniter é uma biblioteca, realmente, bastante simples de se usar. Normalmente, usa-se a chama a views da seguinte maneira:

$this->load->view('conteudo', $data);

Quer dizer, carregando a view “conteudo”. Usando o sistema de templates, a nova maneira é:

$this->template->load('template', 'conteudo', $data);

Ou seja, carregando a view “conteudo” dentro do template “template”.

Instalação

Instale o sistema de template através destes passos simples:

  • Baixe o arquivo ci_template_library.zip
  • Coloque o arquivo Template.php em application/libraries
  • Faça o autoload da biblioteca no arquivo application/config/autoload.php:
$autoload['libraries'] = array('template');

Uso da Most Simple Template Library

Primeiramente, é preciso criar o template que será usado. Por exemplo:

1
2
3
4
5
6
<html>
    <body>
        <div id="contents"><?php echo $contents ?></div>
        <footer>Copyleft</footer>
    </body>
</html>

Atenção ao fato de que a view (com os dados) sempre será enxertada no local em que, no template, tiver a variável $contents.

Peguemos o exemplo de uma view “conteudo”:

<header><h1>Nome do site</h1></header>
<p>Algum par&aacute;grafo com conte&uacute;dos.</p>

E, finalmente, no ponto do controller em que, normalmente, carregamos a view, agora carregamos o template, usando sua sintaxe própria:

$this->template->load('template', 'conteudo');

Variáveis de template

Como explicado, cada template, dentre os vários que podem ser criados, possui uma “variável implícita” $contents. E, para o caso de ser preciso, a library também permite que sejam configurados novos “slots” no(s) template(s). Para isso, usa-se a seguinte função no controller antes da chamada do template:

this->template->set('title', 'Nome do site');

E, no template, essa variável seria referenciada da seguinte maneira:

1
2
3
4
5
6
7
<html>
    <body>
        <header><h1><?php echo $title ?></h1></header>
        <div id="contents"><?php echo $contents ?></div>
        <footer>Copyleft</footer>
    </body>
</html>

E é possível acrescentar quantos slots forem precisos, não somente para um título, mas para outras partes vitais do template, como subtítulos, sidebar(s), etc.

Conclusão

Como pudemos ver, é possível “contornar” uma limitação do CodeIgniter através do uso de uma simples biblioteca. A Most Simple Template Library for CodeIgniter possui alguns outros truques e possibilidades, portante, confira a página oficial para aprender um pouco mais.

Outra excelente notícia é que a Most Simple Template Library for CodeIgniter funciona em perfeita sintonia com o uso de Modular Extensions. Usar um sistema de templates com HMVC é um combo e tanto, hã?

Use o sistema de templates sem moderação e, caso tenha alguma dúvida ou sugestão, basta comentar!

31 comentários em "Templates no CodeIgniter"

gravatar

Miguel  em 30 de maio de 2012

Habilitar o sistema de templates do próprio codeigniter através de hooks não vale a pena não ?

gravatar

Tárcio Zemel  em 3 de junho de 2012

Como assim? Que eu saiba, CI não tem um sistema de templates nativo…

gravatar

Hugo Júnior  em 5 de junho de 2012

Muito boa a explicação, já vi sobre várias classes de templates mais a maioria está sem update há alguns anos então deixei de lado o estudo, mais vou voltar a ver sobre esta, parabéns pelo Post.

Aproveito para deixar algumas dicas para novos posts que confunde muita gente e que gostaria que fosse abordado aqui:

- _remap()
- _output()
- Classe de Caching
- ORM

Abraços.

gravatar

Tárcio Zemel  em 12 de junho de 2012

Opa , Hugo, excelentes, sugestões! Com certeza vou escrever algo a respeito!

gravatar

Renato  em 17 de junho de 2012

Cara una dúvida, sou novo na programação em PHP e quero aprender a linguagem de forma efetiva. será que começar a programar no PHP usando um framework como o codeigniter não pode me prejudicar?

será que devo primeiro aprender o "PHP puro" para depois o uso de frameworks?

gravatar

Fabrício  em 19 de junho de 2012

Olá, ótimos artigos, parabéns. Gostaria de saber se tem alguém aqui utilizando a combinação Codigniter + Smarty. O MVC do C.I. detona junto om os templates do Smarty. Está virando consenso de que os dois formam a dupla perfeita. O que acham?

gravatar

Cálcio  em 20 de junho de 2012

@Renato, usar um FW eu só aconselharia se vc já estiver e/ou for usuário de alguma outra linguagem de programação orientada a objetos. Se vc não souber pelo menos o mínimo vai ficar mt perdido. Tb é essencial saber o básico do PHP de forma estruturada, pq por mais q um FW ajude em tarefas + chatas, vai precisar muito da parte básica, tipo for, while, if, case, functions etc.

gravatar

Cálcio  em 20 de junho de 2012

@Fabrício, Cara eu uso aqui no trabalho e pessoalmente odeio e acho extremamente inútil. Acho q o smarty só se aplica ao uso de MVC na unha (sem uso de FWs) e programação estruturada.

Os FWs ja tem sua forma de criar as views.

Na minha opinião CI + Smarty = reinventar a roda da view e trocar 6 por 1/2 dúzia.

Aproveitando o comentário, o msm acho de usar um ORM em algum FW, não sei bem no CI pois ñ o conheço tão bem, mas acho q ele já usa PDO, Se já usa pra que ORM?

[]’s

gravatar

Miguel  em 21 de junho de 2012

eu estou meio perdido.
estou tentando colocar mais 1 área além do $contents pra inserir uma view e não estou conseguindo. Alguém sabe como proceder ?

gravatar

Tárcio Zemel  em 21 de junho de 2012

+1

gravatar

Tárcio Zemel  em 21 de junho de 2012

Complementando, independentemente de se escolher, ou não, em usá-lo, lembre-se de que é mais um recurso que impacta na performance.

Para sites "comuns", nada o que se preocupar, mas, a medida que escalar o projeto se torna uma necessidade, definitivamente é algo para entrar na pauta de discussão do projeto.

gravatar

Tárcio Zemel  em 21 de junho de 2012

Basta seguir o que está escrito em "Variáveis de template".

gravatar

Renato  em 22 de junho de 2012

Então minha dúvida é ainda mais especifica, pois eu já fiz alguns projetos em PHP, porém não domino todos os comandos, por exemplo, sempre usei PDO e se pedir para usar mysql_connect eu não sei =/

Na faculdade eu trabalho com Java e ele é orientado a objetos, quanto a isso não tenho problemas. Minha dúvida é se mesmo cometendo erros idiotas de principiante usar o CI será bom ou ruim pata minha curva de aprendizagem? Por exemplo, não entendo o funcionamento de sessões e o CI faz isso de forma automática. Isso já sei que é horrível para aprender algo, pois abstrair o que não sei e terrível. Tipo quando estava aprendendo C usei muito biblioteca no inicio e isso atrapalhou muito minha vida no futuro.

Quero muito ser bom em PHP e fazer ele como minha linguagem padrão.

gravatar

Luan Persini  em 22 de junho de 2012

O melhor então seria procurar livros, cursos online ou videoaulas sobre o assunto, com uma grade sobre o que você quer REALMENTE aprender e não somente utilizar.

Se você entrar direto no CI você vai aprender rapidamente a UTILIZAR, mas aprenderá pouco php. Eu sempre fui auto-didático, e só depois de criar e desenvolver bastante é que fui aprendendo emquanto solucionava problemas.

gravatar

Renato  em 23 de junho de 2012

Muito obrigado pela resposta Luan é bem isso que vou fazer….

gravatar

Carlos Lorenzon  em 17 de julho de 2012

Comecei a pouco a estudar o CI, uso bastante o JSF com Prime Faces. Porém sempre adorei o PHP. Mas nunca usei um framework para o mesmo. Mas o pouco que vi estou adorando.
Você não comenta neste artigo sobre o Parser do template (http://codeigniter.com/user_guide/libraries/parser.html) você não recomenda o uso? Estou usando e achando muito bom ele

gravatar

Tárcio Zemel  em 18 de julho de 2012

Opa, Carlos! Tudo bom?

Na verdade, um esquema de templates em que se organiza e facilita as views e a Template Parser class do CodeIgniter são coisas diferentes.

Sobre Template Parser, recomendo a leitura do artigo já publicado CodeIgniter Template Parser Class.

Abraços!

gravatar

alexandre  em 23 de agosto de 2012

Estou começando co codeigniter… e esta dando um erro no meu que e bem assim.. de URL.
URL: http://localhost/site/controller_usuario/cadastro

ai eu valido…
URL: http://localhost/site/index.php/controller_usuario/validacao

se eu mudar de controllador… da um erro!
URL: http://localhost/site/index.php/controller_usuario/validacao/index.php

meu .htaccesse esse.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index.php|images|scripts|css|robots.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

meu config…
$config['index_page'] = 'index.php';
$config['uri_protocol']= 'AUTO';

ai vem a duvida por que ele nao reescreve toda a URL? apenas o ultimo parementro da url.?

gravatar

Tárcio Zemel  em 6 de setembro de 2012

Não entendi muito bem o que você quis dizer, mas não é preciso um "index.php" no final do URL.

Quando você usa isso, você não está mudando de controlador, você está indicando que a função "validacao" do "controller_usuario" possui um parâmetro "index.php".

gravatar

Randson  em 30 de outubro de 2012

Renato, eu comecei a programar em PHP ha algum tempo e se quer ouvi falar em framework na época. Então tive que quebrar muito a cabeça usando PHP puro mesmo e acho que isso foi bom, pq permitiu-me lhe dar com a linguagem de modo mais "íntimo". Fazer pelo menos 10% do que se faz com um framework sem framework ´da muito trabalho, mas ajuda vc a pegar as manhas da linguagem. Então como aprendizagem, pode ser válido, mas se vc tem metas e prazos a cumprir é melhor usar o framework mesmo. vlw

gravatar

Richard Feliciano  em 28 de dezembro de 2012

Cara, se você já programa em qualquer outra linguagem pode começar usar direto o Framework.

gravatar

edregis  em 17 de junho de 2013

Olá Tárcio. Acho que a dúvida do Carlos é a mesma que a minha.
No artigo sobre o Template Parser Class você colocou o seguinte:
// Chama a view "parseada"
$this->parser->parse('blog_index', $data);
E aqui neste artigo, para carregar o template você colocou:
$this->template->load('template', 'conteudo', $data);
Dúvida: como usar o Template Parser Class dentro de um Template?
Ou seja, quero usar a facilidade que o Template Parser Class me dá codificar, porém dentro de um Template, sacou?
Abs

gravatar

webfatorial  em 17 de junho de 2013

Ah, sim, não tinha entendido!

Ainda não cheguei a testar, mas deem uma olhada na própria página de instruções da biblioteca, no comentário #63. Um tal Hossein Salemi postou uma função que parece que vai dar um jeito nisso.

Att

gravatar

wouerner  em 4 de julho de 2013

Vlw, e bem produtiva essa biblioteca!

gravatar

Flavio Cesarino  em 22 de agosto de 2013

Estou seguindo este tutorial, e estou com um problema. O arquivo de view do controlador, está sendo carregado acima de tudo no arquivo de template, e está sendo renderizado mesmo sem utilizar a variável <?php echo $contents ?>, já nesta variável, não aparece nada

gravatar

will  em 6 de setembro de 2013

e há como adicionar scripts conforme a tela?

gravatar

jammerson  em 6 de dezembro de 2013

Parabéns pelo artigo e também pelo blog Tárcio.

Após seguir o exemplo, aqui tá funcionando redondinho, ao menos o set que não consigo passar um valor para a view.

Quero retornar algo do model, guardar em uma variável no controller e jogar pra View. Tá assim:

$this->template->set(‘title’, ‘Testando SET’);
$this->template->load(‘coord/templateC’, ‘coord/coordenador’);

e na view…

Quando acesso a view retorna o erro:

Undefined variable: title

Filename: coord/coordenador.php

Já vi na documentação da library e me parece estar tudo certo. pq não funciona? xS

gravatar

jammerson  em 6 de dezembro de 2013

cortou o conteúdo da view… ficou assim “echo $title”

gravatar

caique marcelino  em 23 de março de 2015

Cara me ajuda,como tu consegui resolver esse problema?

gravatar

Livio  em 1 de julho de 2015

Não consigo colocar ele pra funcionar com HMVC, simplesmetne não funcionou ainda, alguem da uma força ai

gravatar

Eldi  em 20 de setembro de 2015

I drop a leave a response when I like a post on a wetibse orI have something to contribute to the conversation.It is a result of the fire displayed in the post I browsed.And on this post 网站SEO疑难诊断二例 | 左行.软件站. I was actually moved enough to post a thought I dohave 2 questions for you if you do not mind. Is it onlyme or do some of the remarks appear as if they are written bybrain dead people? And, if you are writing at other social sites,I would like to keep up with everything new you have to post.Could you list every one of your communal pages like your twitter feed, Facebook page or linkedinprofile?

    Comente!