Jump to content
alves077

[Dúvida] importar template em html

Recommended Posts

alves077

Boa tarde,

Estou a criar um site, queria ter o template do site unificado só em um ficheiro, e depois qualquer outra página que cria-se fazia o include desse ficheiro. Queria dividir o template em três ficheiros diferentes, cabeçalho, menu e rodapé e depois qualquer página iam buscar os dados e essas paginas, preenchendo assim a pagina em HTML com os três ficheiros. Assim qualquer alteração do template não necessitava de alterar ficheiro a ficheiro.

Qual é a melhor maneira de fazer o include em HTML?

Já vi algumas alternativas na net, mas estou com algumas dúvida qual a melhor maneira de fazer..

Já vi a fazerem em javascript, mas não sei se é a melhor opção..

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
I-NOZex

eu tenho um bom codigo, em php puro de uma template engine usando em parte o paradigma mvc

como nao me posso limitar a espetar ca o codigo sem o explicar, fica aqui a mensagem reservada a um update quando tiver mais tempo, para te mostrar o codigo e te explicar como funciona ;)

mas basicamente, tem uma main class, um ficheiro que recebe os request e processa/obtem os dados, um outro que é o main template (que abre e fecha as tags de html) e um outro template para cada tipo de pagina (uma pagina de listagem de posts, outra da view do post em si... mas eu ja explico melhor ;) )

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄

Edit: ora aqui fica a layout engine que referi:

http://www.portugal-a-programar.pt/files/file/94-x/

Nao foi totalmente desenvolvido por mim, e nao me recordo a fonte, no entanto, por ser algo basico, modelei a meu gosto ao extraires vais ter um ficheiro com o nome index_controller.php

> este é o ficheiro que recebe os requests, obtem e processa os dados e os encaminha para o view, aqui fica o codigo fonte:

 

<?php
require('class/template.class.php'); //faz include da class
$view = new Template(); //instancia a layout engine por assim dizer (instancia a class)
$view->title = "hello, world"; //define as variaveis que vao estar presentes nos ficheiros view/template
$view->links = array("one", "two", "three");
$view->body = "Hi, sup";
$view->content = $view->render('view/index_content.php'); //renderiza a view respectiva do tipo de pagina
echo $view->render('view/main.tpl'); //renderiza a master view, e mostra o resultado no browser
?>
 

depois deste ficheiro, existem 2 pastas, a view, e a class; a pasta class contem o ficheiro template.class.php que é apenas uma classe com metodos e propriedades que tratam de juntar os ficheiros todos a fim de ter uma renderizaçao final num so ficheiro, por assim dizer

codigo fonte:

 

<?php
class Template {
 private $vars  = array();

 public function __get($name) {
return $this->vars[$name];
 }

 public function __set($name, $value) {
if($name == 'view_template_file') {
  throw new Exception("Cannot bind variable named 'view_template_file'");
}
$this->vars[$name] = $value;
 }

 public function render($view_template_file) {
if(array_key_exists('view_template_file', $this->vars)) {
  throw new Exception("Cannot bind variable called 'view_template_file'");
}
extract($this->vars);
ob_start();
include($view_template_file);
return ob_get_clean();
 }
}
?>
 

na pasta view estao 2 ficheiros, o main.tpl e o index_content.php

o main.tpl contem o html comum a todos os possiveis ficheiros html (abre a tag html, define a head, abre o body, variavel que faz "include" do resto do template, e fecha o body e html)

codigo:

 

<html>
<head>
	<title><?php echo $title; ?></title> <!-- escreve a variavel do titulo da pagina -->
</head>
<body>
<h1><?php echo $title; ?></h1><!-- escreve o nome da pagina  -->
<div>
<?php echo $content; ?><!-- inclui o conteudo, juntamente com o template especifico do tipo de pagina -->
</div>
</body>
</html>
 

e por fim temos o ficheiro index_content.php, este é o que apresenta os dados seguindo o layout especifico do tipo de pagina, propriamente dito:

 

<ul>
<?php foreach($links as $link): ?>
<li><?php echo $link; ?></li>
<?php endforeach; ?>
</ul>
<div>
<?php echo $body; ?>
</div>
 

por cada tipo de pagina, convem que haja um novo controller e a sua respectiva view, imaginando que queres a pagina contactos, que vai ter um layout diferente, terias de criar o ficheiro contact_controller.php e o ficheiro contact_content.php

claro que tambem poderas fazer com o ficheiro index_controller.php, assumindo um endereço tipo: http://servidor.com/index_controller.php?action=contact , por exemplo ;) nesse caso so tinhas de fazer a pagina contact_content.php, aproveitando o mesmo "controller"

testa la isso e o que nao entenderes diz :thumbsup:

parece muito complicado, mas a ideia no fundo é muito simples!

se pretendes algo mais basico, o que podes fazer é:

teres a head num ficheiro a parte, chamado por exemplo head.php que abre a tag html, define a head, e abre a body, e mete por exemplo tambem o menu (basicamente tudo que for comum a todas as paginas), se por exemplo queres umas paginas com sidebar e outras sem, metes tambem a side bar num ficheiro tipo: sidebar.php, e por fim, crias um ficheiro com o nome por exemplo footer.php, em que metes por exemplo a div de footer, e fechas o body e html...

depois, para cada ficheiro, imaginando o ficheiro contacto:

Citação

<? include('head.php');
include('sidebar.php'); ?>
 

<form>
<!-- contacto e tal -->
</form>
 

<? include('footer.php'); ?>
 

ficaria algo deste genero... é a forma mais simples que me recordo...

espero ajudar ;)

PS: O resultado, ao correres o index_controller.php vai ser isto:

TifSwsg.png

  • Vote 1

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
alves077

Hm .. gosto da ideia, desde já obrigado pela explicação detalhada, já fiquei com uma ideia mais clara como fazer. Já tinha usado a metodologia MVC com servlets e jsp em java, mas com php ainda não. Vou fazer aqui alguns experimentos alguma dúvida passo por aqui..

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
I-NOZex

de nada

entretanto so agora vi que isto ta na secçao de HTML :D

secalhar a minha resposta nao se enquadra muito bem, no entanto se a tua linguagem de servidor for php, apontei boas alternativas

espero que a minha explicaçao tenha sido clara, tentei explicar o melhor possivel, mas alguma duvida em concreto, dispoem :thumbsup:


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
alves077

Boas,

Desculpem voltar a esta conversa, mas agora que o tempo me permitiu voltar a esta aplicação, surgiram-me algumas dúvidas.

Acho que percebi a ideia, e como já disse anteriormente, gostei bastante. Só existem questões de implementação que ainda tenho algumas dúvidas. Como por exemplo, no main.template, isto é, onde tenho o template igual para todas as páginas, existe um pequeno conteúdo que tenho que mudar no menu de página para página. Não sei qual a melhor maneira para solucionar este problema. Um deles seria no controller definir uma variável, e aceder, depois do render, no main.template tornando este ficheiro um .php. E tendo essa variável no main.template com if's definir a página dependendo do controller que estiver, será esta a melhor opção?

Não queria tornar o main.template num .php, mas não sei muito bem como dar volta a questão.

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites
I-NOZex

a extensao .tpl é puramente ilustrativa... ate podia ser so main o nome do ficheiro... no fundo é um ficheiro php, apenas alterei a estensao por uma questao de associaçao ao que esse ficheiro representa ;)


B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
alves077

Sim eu sei, mas só queria saber a opinião de como estou a pensar resolver esse problema.

Share this post


Link to post
Share on other sites
I-NOZex

como expliquei, cada pagina tem um x_controller e um x_content diferente... logo basta definires a variavel nos controllers que queres, e chamar a variavel nos content associados... será isso?

pelo que percebi, imaginamos que tens as paginas: contactos, listagem de categorias e pesquisa, nessas 3 paginas faz de conta, queres que no menu apareça a opçao XYZ, é isso?

se for, é tal como disse, nos ficheiros controllers:

list_categorias

contactos

pesquisa

defines a variavel menu:

$view->menu = array("home"=>"/index", "blog"=>"/blog", "sobre"=>"/sobre", "XYZ"=>"/zyx");  

e nos content:

list_categorias

contactos

pesquisa

chamas a variavel menu:

<ul class="menu">
<?php foreach ($menu as $nome => $url): ?>
<li><a href="<?php echo $url;?>"><?php echo $nome;?></a></li>
<?php endforeach; ?>
</ul>

Edited by I-NOZex

B2R » Beat2Revolution v3.0b | Regista e divulga-nos

beat2revolution.net

Share this post


Link to post
Share on other sites
alves077

Sim era essa ideias, mas desde ser em cada view, ser no template geral, mas acaba para ir dar ao mesmo. Era isso que estava pensar fazer, definir uma variável que defina o menu a seu gosto.

Obrigado pela atenção,

alves077

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.