您好我正在试图弄清楚如何使用类进行PHP模板系统,我不喜欢header.php footer.php或者smarty或者其他任何blabla,只需要template.html,class.php和page1 .php,page2.php等...用我自己的PHP代码,我发现很多网站的人都在教这个怎么做但我仍然有很多问题。
1)我想将EXTRA css添加到某些页面
2)有些页面有像mysql查询这样的PHP代码和类似的东西
3)在模板中我想要的变量CONTENT不仅是单词,而是大量的div和东西,在某些页面中CONTENT变量里面有查询,比如填充a(例如)下拉菜单。
希望有人可以指导我,我实际上有我的tempalte for explame,(标签只是随机的)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<title>CompanyName | ##TITLE##</title>
<link href="layout.css" rel="stylesheet" type="text/css" />
<link href="styles.css" rel="stylesheet" type="text/css" />
##EXTRA_CSS##
<link rel="shortcut icon" href="/favicon.ico" />
<!--[if IE 6]>
<script src="DD_belatedPNG_0.0.8a-min.js"></script>
<script>
DD_belatedPNG.fix('img, div');
</script>
<![endif]-->
##EXTA_JS##
</head>
<body>
<div id="main">
<div id="container_black">
<div id="container_white">
<div id="container_header">
<div id="logo_top"></div>
<div id="lineas_verticales_top">
<div class="volver_portada"><a href="index.shtml">Volver a portada</a></div>
<div class="english_spanish"><u>Español</u> | <a href="../en/index.shtml" class="english_spanish">English</a></div>
</div>
<div id="nav_bar_black"><div id="nav_bar_red"><div id="nav_bar_yel">
<ul class="menuholder">
<li class="menu_principal"><a href="#" title="Principal">Principal</a></li>
<li class="menu_empresa"><a href="#" title="Empresa">Empresa</a></li>
<li class="menu_productos"><a href="#" title="Productos">Productos</a></li>
<li class="menu_clientes"><a href="#" title="Clientes">Clientes</a></li>
<li class="menu_recetas"><a href="#" title="Recetas">Recetas</a></li>
<li class="menu_contacto"><a href="#" title="Contacto">Contacto</a></li>
</ul>
</div></div></div>
<div id="topbg_degr"></div>
</div>
<div id="container_left">
<div id="conmargen_left_top"></div>
<div id="container_conmargen_left_middle">
##CONTENT##
</div>
<div id="conmargen_left_bottom"></div>
<!--[IF INDEX]
<div id="fono"></div>
<div id="dir"></div>
-->
</div>
<!--[IF INDEX]
<div id="nav"></div>
-->
<div id="container_right">
<div id="conmargen_right_top"></div>
<div id="container_conmargen_right_middle">
<!--[IF PAGE OR PAGE OR PAGE]
<a href="#" id="recetas_poster" title="recetas"></a>
[ELSE IF]
<a href="#" id="clientes_poster" title="recetas"></a>
[ELSE IF]
<a href="#" id="productos_poster" title="recetas"></a>
-->
</div>
<div id="conmargen_right_bottom"></div>
</div>
<!--[IF INDEX]
<div id="frame_facebook">
<a href="#" class="facebook" title="CompanyName"><span>CompanyName</span> en Facebook</a>
<div class="breakL"></div>
<fb:like href="#" layout="button_count" show_faces="true" width="100" font="tahoma"></fb:like>
</div>
-->
<br/>
</div> <!-- cierre del container white -->
</div> <!-- cierre del container black -->
<div id="footer">
<div class="footer_comment">
CompanyName Todos los derechos reservados 2011
</div>
</div>
</div> <!-- cierre del main -->
<br/>
</body>
</html>
例如contact.php,内容将是一个表单,并在页面的顶部,我有这个巨大的PHP代码,我验证和所有。
如果有人愿意让我走上正确的道路,我真的很感激。先感谢您。
答案 0 :(得分:0)
可能有一百种不同的方法可以解决这个问题,每种方法都有各自的优点和缺点 - 正如您所说的那样使用数据库和/或ajax调用和/或页眉和页脚。你真的必须找出哪种方式最适合你的特定项目或编码风格,或两者兼而有之。
然而 - 如果你真的只想要'template.html',但是有一些页面包含PHP,javascript,MySQL或其他任何内容 - 那我建议。
使用占位符创建template.html,例如{PAGE_TITLE},{MAIN_CONTENT}或您需要的任何内容。
创建page1.php / page2.php等并执行任何服务器端工作,生成与占位符匹配的变量。将它们存储为数组可能很方便,即:
PAGE_VARS array(
['TITLE'] => My Page
['CONTENT'] => This is my page content
)
在“页面”脚本的末尾,将template.html的全部内容加载到字符串
中$template = file_get_contents('template.html')
然后,使用基本循环使用替换变量构建模板:
foreach ($PAGE_VARS as $KEY=>$VALUE) {
$template = str_replace("{".$KEY."}",$VALUE,$template)
}
(随意使用上面的一些正则表达式来获得聪明且可能更高效,这只是一个简单的例子。)
输出模板。
echo $template;
答案 1 :(得分:0)
你可以创建一个这样的快速类(class.php)作为你的'模板引擎':
class Template {
var $contents;
function load($file) {
if ($fp = fopen($file, "r")) {
$this->contents = fread($fp, filesize($file));
fclose($fp);
}
}
function replace($str,$var) {
$this->contents = str_replace("<".$str.">",$var,$this->contents);
}
function show() {
$search = array(
'/\t/', //Remove Tabs
'/<!--[^\[-]+?-->/', //Remove Comments
'/\n\n/' //Remove empty lines
);
$replace = array(
'',
'',
''
);
$this->contents = preg_replace($search, $replace, $this->contents);
echo $this->contents;
}
}
在您的template.html文件中,添加要放置内容的特殊标记,如下所示:
<html><head></head>
<body>
<div id="id1"><page_title></div>
</body>
</html>
...
然后创建一个在标签内写入的函数(每个区域一个):
function writetitle($s) {
$GLOBALS['writes']++;
$GLOBALS['page_title'] .= $s;
return;
}
最后,在你的page.php中,调用该类,编写内容并生成页面:
require_once('class.php');
//Load Class
$template = new Template;
$template->load("template.html");
//Some query :
$query = mysql_query('SELECT...');
$res = mysql_num_rows($query);
//write your content :
writetitle('my title, '.$res.'');
//Generate the page :
$template->show();
执行此操作,您可以根据需要创建任意数量的区域。 writetitle 就像 echo 一样,因此您可以进行查询和所需的一切。
我希望它有所帮助。
答案 2 :(得分:0)
让PHP解析您的模板文件的内容我建议使用PHP而不是您自己的伪代码编写模板。
写
是完全有效的...
<body>
<?php if($fooBar == "hahahaha"):?>
<a href="www.foobar.com">The cool foobar link</a>
<?php endif;?>
</body>
...
然后我会创建一个包含所有常见html等的layout
文件。然后使用小模板片段插入到主要内容所在的布局中。
通过在模板中包含实际的PHP代码,PHP引擎可以处理它们,并且您不必编写自己的逻辑来处理循环,if语句等。
看看Zend Framework,你就会明白如何编写模板引擎。