使用PHP包括分隔网站内容

per*_*lis 5 php layout

我正在寻找关于将网站内容分成逻辑块的最佳实践的建议.我希望页眉和页脚在整个站点中保持不变,这样如果我有几页不同的内容,它们将如下所示 - 对页眉和页脚所做的更改会自动更新,而不必更改每个页面.

<?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

不,你的做法是错的.
以下是您设计中的主要缺陷:

  1. 你假设每次调用都会调用header.php.那是错的.
  2. 你假设header.php将永远是静态的.那是错的.
  3. 您忘了为页面本身创建模板.

每个人都必须学习的主要规则:

在所有数据准备好之前,不必将任何一个字符发送到浏览器中.

为什么?

  • 今天是2011年.AJAX时代.如果您的代码必须发送JSONed数据而不是整个HTML页面,该怎么办?
  • 有一种叫做的东西HTTP header.有时我们必须发送它们.如果你已经发送了华丽的HTML标题,那就不可能了.
  • 它只适用于4页的网站.好的.想象一下,你很幸运,并获得了另一个4页网站的请求.您只需更改模板,不要触摸引擎文件.这真的很有好处.
  • 想象一下,您将<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)

简单,清洁和可维护.

  • @Shrap,对不起,我在这里不同意.他提供的例子对于简单的网站来说相当普遍.你把它带到许多开发人员不需要的水平.并且,有一些创造性的方法可以解决诸如标题示例之类的问题...例如将标题定义为变量并在调用标题之前设置它.他没有提到任何这一点.并且说不公正,这是不对的!我说这取决于具体情况. (7认同)
  • @persepolis这样的布局是基于多年的研究和经验.您将能够创建所有具有不同设计的网站,而无需触及核心文件.这是使用模板的巨大优势.还有许多其他改进.例如,基于数据库查询结果,您必须仅发送HTTP标头或JSON数据以提供AJAX调用.我的布局很容易,初始的布局也不可能.等等.毕竟,用它构建一个4页的网站会更容易. (3认同)

mat*_*mc3 9

在建立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)