我正在寻找有关将网站内容分成逻辑块的最佳做法的建议。我希望页眉和页脚在整个站点中保持不变,这样如果我有几页不同的内容,它们将如下所示 - 对页眉和页脚所做的更改会自动更新,而不必更改每个页面。
<?php
include 'header.php';
?>
<body>
<p>page content here</p>
</body>
<?
include 'footer.php';
?>
header.php
将包含开头<html>
,<head>
和静态内容,footer.php
将包含任何额外的静态内容和结束</html>
标记。所以,我的问题是:这是一个好方法吗?我担心将<html>
标签分散到多个文件是不好的做法。如果是这样,采用这种设计的正确方法是什么?
答案 0 :(得分: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";
?>
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>
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>
简单,清洁和可维护。
答案 1 :(得分:9)
在建立Your Common Sense
的答案时,没有充分理由为每个页面提供2个文件。您可以轻松地将模板(YCS称为此.tpl.php)和实际页面合并为一个文件。
首先,从模板需要展开时可以展开的类开始:
<?php
#lib/PageTemplate.php
class PageTemplate {
public $PageTitle;
public $ContentHead;
public $ContentBody;
}
然后,制作你的布局:
<?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>
最后,添加包含正文内容的页面:
<?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>
答案 2 :(得分:4)
这是一个基本的方法但是,是的,它确实有效:)我肯定会费心去做很多模板和OOP,但你肯定是在正确的道路上
由于我不能发表评论,我将在这里回答;)如果他需要自定义标题,那么他需要一些更高级的功能。所以,正如我所说,这是基本的方法。但最后,如果他真的有一个静态的页眉/页脚,并且真的在任何地方使用它们,那么,是的,这是一个很好的方法。
所以,你可以打扰一些带有参数的高级标题,你可以在每页上提供这些参数。你可以继续使用整个MVC。最后告诉他使用预先制作的框架并停止打扰。如果你不让他做一些试验和错误,他怎么能学到呢?
答案 3 :(得分:-6)
index.php - 包含基于REQUEST变量的页眉,页脚和内容。
header.php - 标题内容
footer.php - 页脚内容
content1.php,content2.php等
的index.php:
<?php
include ('header.php');
// VERY IMPORTANT - do not use the GET variable directly like this
// make sure to filter it through a white-list
include(basename($_GET['page']).'.php');
include ('footer.php');
?>
如果您希望URL访问www.domain.com/pagename,您尝试加载到index.php的页面是“pagename”,请使用HTACCESS并执行一些URL重写:http://corz.org/serv/tricks/htaccess2.php