Utilizando layouts no CodeIgniter

Na grande maioria dos sites e sistemas web é apenas modificado o miolo da aplicação, enquanto que o cabeçalho, rodapé, menu, etc. permanecem iguais. E utilizando o modelo MVC, normalmente para cada action do controller temos uma view correspondente, sendo que geralmente um controller: Main com uma action: index, terá a view main/index.php.

No Code Igniter teríamos que fazer tudo manualmente, já que não há como definir um layout que será carregado em cada view, nem esse carregamento automático.

Pelo menos não havia... :D

Criei um pequeno hook que faz esse serviço. Crie seu controller como abaixo:

PHP:
  1. class Main extends Controller {
  2.  
  3.   function Main()
  4.   {
  5.     parent::Controller();
  6.   }
  7.  
  8.   function index()
  9.   {
  10.     $this->data->foo = $this->db->get('main_table');
  11.   }
  12.  
  13.   function show()
  14.   {
  15.     $this->data->foo = $this->db->get('another_table');
  16.     // Você pode definir manualmente a view e o layout da seguinte forma:
  17.     $this->view = 'main/index';
  18.     $this->layout = 'popup';
  19.   }
  20. }

E ao acessar as duas actions a view main/index.php será chamada com os valores definidos na variável $this->data. Também será carregado o layout application/views/layouts/default.php na função index e application/views/layouts/popup.php na função show.

Download

Faça o download da hook ou de uma aplicação de exemplo (CI 1.6.2).

Instalação

Para utilizar este hook, copie o arquivo Layout.php dentro da pasta application/hooks/, defina a opção $config['hooks'] com true no config e adicione o seguinte no arquivo application/config/hook.php:

PHP:
  1. $hook['post_controller'][] = array(
  2.   'class'    => 'Layout',
  3.   'function' => 'view',
  4.   'filename' => 'Layout.php',
  5.   'filepath' => 'hooks',
  6.   'params'   => array()
  7. );

Espero que goste tanto de utilizar isto quanto eu. Me salva algumas linhas de código.

4 Comentários

  1. Marco escreveu em 21 de maio de 2008 as 15:01:

    Felipe, não era bem isso que eu estava dizendo não.
    Vc foi um pouquinho além. Mas um pouquinho bem grande :)
    Cara, muito bom.
    Vou fuçar um pouco nele e qualquer dúvida/sugestão eu volto.

    Abs

  2. Beto escreveu em 21 de maio de 2008 as 15:39:

    Putz!
    Show de bola, e eu quebrando a cabeça de como montar isso ;)

    []´s

  3. Marco escreveu em 23 de maio de 2008 as 09:45:

    Olá Felipe,
    Seguinte, usei seu exemplo e funcionou perfeito só que ao lançar num site meu, a view não está carregando automaticamente.
    Então verifiquei que o problema é na configuração do $application_folder.
    Se colocar o path completo, dá um erro “Unable to load the requested file: welcome.php”
    Olha só o retorno da função “_direct_file($path)” do seu hook:
    Sem o path completo (’system’)
    string(17) “welcome/my_layout”
    Com o path completo (/home/coyote/httpdocs/felipedieseloriginal/application
    string(7) “welcome”
    Vc poderia dar uma ajuda para contornar isso ?

    Abs

  4. Marco escreveu em 23 de maio de 2008 as 14:15:

    Felipe, meu problema foi resolvido alterando o seguinte no hook:
    1) function Layout()
    Alterei
    $this->view = $this->_direct_file(APPPATH . ‘/views’);
    para
    $this->view = $this->_direct_file(APPPATH . ‘views’);
    Obs.: o ‘/’ não é necessário, senão na url fica ‘//views’

    2) function _direct_file($path)
    comentei a linha:
    //$path = dirname(FCPATH) . ‘/’ . $path;

    abs

Deixe seu comentário