Sim... o último episódio até foi pequeno mas, a razão para tal, deveu-se à necessidade de dar um foco maior às partes dinâmicas do template, pois elas não parecem ser assim tão fáceis de compreender. Pelo menos, não o são para mim. Vamos a isso?
1.3) A explicação - as partes dinâmicas do nosso template - geral
o nosso template não tratará apenas de chamar as views. Lembre-se, o principal do template é conter toda a informação que poderá ser utilizada de igual modo, num número significativo de páginas do nosso site.
Se nós temos um css que deverá ser usado em várias páginas, porque não chamá-lo dentro da head tag do nosso template? Se nós temos um javascript que poderá ser usado em várias páginas porque não, também, colocar as suas instruções dentro do template? Está seguindo a lógica? Espero que sim.
E o nosso menu de navegação? Imaginando que temos um menu de navegação no topo da nossa página. Onde deveremos colocar ele? No template? Ou na nossa view de cabeçalho - v_header ?
Eu diria que depende de SUA organização. Livre escolha. :)
Mas, continuemos a analisar o nosso template:
De onde vem esta variável $titulo? E esta variável $main? É claro que estas serão as variáveis responsáveis por dar dinamismo ao nosso template. Mas vamos por partes.
1.3.1) A explicação - as partes dinâmicas do nosso template - o $titulo
Primeiro o $titulo:
<title><?php echo $titulo;?></title>
A variável $titulo vem dos nossos controllers. Se nós tivermos falando do título da página de produtos, então, o nosso controller de produto, deverá ter um array onde, a sua key terá o nome de ’titulo’ e o seu valor, a seguinte string: “Os nossos produtos”. Depois, esse array será carregado e associado ao nosso template. Feito isso, nós poderemos aceder a elementos desse array a partir de variáveis. Eis um exemplo:
No nosso controller:
c_produtos.php
- $data['titulo'] = "Os nossos produtos";
- $this->load->vars($data);
- $this->load->view('geral_tpl');
Simples hm? Ele guardou os dados da variável, colocou esses dados disponíveis para todas as views através do método load->vars(), e finalmente, nós podemos carregar o nosso template com a variável $titulo definida, que os valores aparecerão no nosso titulo da página.
Mas, não só de um controlador se faz o nosso site. Eu disse atrás que a variável $titulo vem dos nossos controladores. O plural foi propositado. Cada controlador definirá a key titulo com valores diferentes. Como aparece então um título diferente para cada página?
Como saberá ele que controlador carregar para mostrar uma determinada informação e não outra?
A resposta: Pelo URI.
Estou em crer, e cada vez mais começo a notar, que o router é um elemento bem poderoso de uma Framework. Se nós tivermos um URI assim:
http://www.meusite.com/c_produtos/ nós saberemos que o controlador a ser chamado será o dos produtos. Logo, podemos ficar descansados que, a view que será chamada e os dados que a view irá conter, serão os dados fornecidos por esse controlador.
1.3.2) A explicação - as partes dinâmicas do nosso template - o $main
Agora o $main:
<?php $this->load->view($main); ?>
Aqui nós estamos, claramente, a fazer o processo de load de uma view, dentro de outra view. Confuso? Eu acho bem simples, quando comparado com o método de estender o controller. Mas, vamos seguir o rasto desta variável $main. :)
Pelo que foi dito acerca da variável $titulo, já deveremos saber que esta variável $main virá de um controlador, certo? E saberemos mais do que isso. Saberemos que esta variável $main virá de um array no controlador, cuja key terá o nome de ‘main’.
Ora, na nossa view, nós estamos colocando a variável $main em vez de um nome de uma view, logo, que valor deverá ter a nossa key ‘main’ no nosso array no controlador?
Espero que já tenha respondido mentalmente: “O valor da nossa key ‘main’ corresponderá ao nome[1] de uma view”.
Por isso, e sem mais demoras:
- $data['main'] = 'v_produto';
- $this->load->vars($data);
- $this->load->view('geral_tpl');
O processo é idêntico ao feito para a variável $titulo. Mas aqui, nós estamos passando na key main, os nomes de uma view, neste caso, v_produto. Vamos espreitar esta view:
- <div id=”produto”>
- <p>Aqui estarão os detalhes dos produtos.</p>
- </div>
E é isto. Simples simples.
[1] Qual nome? O nome da classe, ou o nome do ficheiro? O nome do ficheiro. Sem a extensão. Porquê o nome do ficheiro e não da classe? Porque estamos trabalhando com o URI e, lá, o valor é baseado nos ficheiros e não nos nomes das classes. O mesmo já não se passará com os nomes dos métodos. O nosso URI poderá conter o nome dos nossos métodos dentro das classes.
No próximo e último episódio, iremos completar o nosso template com duas coisas que são muito frequentes ao longo de nossas páginas: CSS e Javascript em,
O nascimento de um site com Codeigniter - Estrutura e Preparação do Site - Parte III - Episódio 3 de 3
Até lá. :)


Parabens e uma duvida...
Bem, primeiramente parabéns pela serie de tutoriais.. realmente muito bom!
A minha duvida é exatamente sobre as views... onde ficam os códigos html?
dentro de um arquivo com o mesmo nome e com alguma extensão padrão (tipo .php ou .html) em qual pasta?
ou no Banco de Dados, ou em algum outro lugar?
Desculpe, talvez seja uma pergunta básica, mas nao podia deixar de perguntar!
Obrigado e mais uma vez parabéns, aguardo o próximo tuto! ^^
www.viniciusalmeida.com.br
Resposta e outra dúvida
Sobre a organização das views eu entendi:
Extensão: .php
Local: /private/application/views
Quando ele menciona v_produto por exemplo, é uma view, logo deve ser criada na pasta acima, com o nome v_produto.php.
Ao passo que c_produtos é um controller, e deve ser criado na pasta /private/application/controllers com o nome c_produtos.php
A menção da pasta "private" é supondo que você está usando uma pasta remota via FTP / Painel de controle do seu site.
-----
Acessando o link do controller, me dá este erro:
Fatal error: Using $this when not in object context in /home/meuusuario/private/application/controllers/c_produtos.php on line 4
Meu c_produtos.php esta assim:
O que será que eu fiz de errado?
Tente fazer de outra maneira
tente fazer desta maneira.