我正在寻找关于将网站内容分成逻辑块的最佳实践的建议.我希望页眉和页脚在整个站点中保持不变,这样如果我有几页不同的内容,它们将如下所示 - 对页眉和页脚所做的更改会自动更新,而不必更改每个页面.
<?php
include 'header.php';
?>
<body>
<p>page content here</p>
</body>
<?
include 'footer.php';
?>
Run Code Online (Sandbox Code Playgroud)
在header.php将包含开幕<html>,<head>和静态内容,以及footer.php将包含任何额外的静态内容和结束</html>标记.所以,我的问题是:这是一个好方法吗?我担心将<html>标签分散到多个文件是不好的做法.如果是这样,采用这种设计的正确方法是什么?
You*_*nse 14
不,你的做法是错的.
以下是您设计中的主要缺陷:
每个人都必须学习的主要规则:
在所有数据准备好之前,不必将任何一个字符发送到浏览器中.
为什么?
HTTP header.有时我们必须发送它们.如果你已经发送了华丽的HTML标题,那就不可能了.<title>根据页面内容为您的页面制作自定义标签.这不是很平常吗?但是如果不使用模板就无法实现.因此,您必须拥有一个包含页眉和页脚的常用网站模板,以及每个PHP脚本的专用模板.
示例布局将如下所示:
0.1.页面本身.
它输出什么,但只收集所需数据,并调用模板:
<?php
//include our settings, connect to database etc.
include dirname($_SERVER['DOCUMENT_ROOT']).'/cfg/settings.php';
//getting required data
$DATA=dbgetarr("SELECT * FROM links");
$pagetitle = "Links to friend sites";
//etc
//and then call a template:
$tpl = "links.tpl.php";
include "template.php";
?>
Run Code Online (Sandbox Code Playgroud)
0.2.template.php这是您的主要网站模板,
由页眉和页脚组成:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My site. <?=$pagetitle?></title>
</head>
<body>
<div id="page">
<?php include $tpl ?>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
0.3.最后links.tpl.php是实际的页面模板:
<h2><?=$pagetitle?></h2>
<ul>
<?php foreach($DATA as $row): ?>
<li><a href="<?=$row['link']?>" target="_blank"><?=$row['name']?></a></li>
<?php endforeach ?>
<ul>
Run Code Online (Sandbox Code Playgroud)
简单,清洁和可维护.
在建立Your Common Sense答案的过程中,没有充分的理由为每个页面提供2个文件.您可以轻松地将模板(YCS称为此.tpl.php)和实际页面组合到一个文件中.
首先,从您可以扩展的类扩展开始:
<?php
#lib/PageTemplate.php
class PageTemplate {
public $PageTitle;
public $ContentHead;
public $ContentBody;
}
Run Code Online (Sandbox Code Playgroud)
然后,制作你的布局:
<?php
# layout.php
require_once('lib/PageTemplate.php');
?>
<!DOCTYPE HTML>
<html>
<head>
<title><?php if(isset($TPL->PageTitle)) { echo $TPL->PageTitle; } ?></title>
<?php if(isset($TPL->ContentHead)) { include $TPL->ContentHead; } ?>
</head>
<body>
<div id="content">
<?php if(isset($TPL->ContentBody)) { include $TPL->ContentBody; } ?>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
最后,添加包含正文内容的页面:
<?php
#Hello.php
require_once('lib/PageTemplate.php');
# trick to execute 1st time, but not 2nd so you don't have an inf loop
if (!isset($TPL)) {
$TPL = new PageTemplate();
$TPL->PageTitle = "My Title";
$TPL->ContentBody = __FILE__;
include "layout.php";
exit;
}
?>
<p><?php echo "Hello!"; ?></p>
Run Code Online (Sandbox Code Playgroud)