使用PHP包括分隔网站内容

时间:2011-03-03 15:58:00

标签: php layout

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

<?php
include 'header.php';
?>
<body>
    <p>page content here</p>
</body>
<?
include 'footer.php';
?>

header.php将包含开头<html><head>和静态内容,footer.php将包含任何额外的静态内容和结束</html>标记。所以,我的问题是:这是一个好方法吗?我担心将<html>标签分散到多个文件是不好的做法。如果是这样,采用这种设计的正确方法是什么?

4 个答案:

答案 0 :(得分:14)

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

  1. 您假设每次调用都会调用header.php。那是错的。
  2. 您假设header.php将始终是静态的。那是错的。
  3. 您忘了为页面本身创建模板。
  4. 每个人都必须学习的主要规则是:

    在所有数据准备就绪之前,不得将任何一个字符发送到浏览器中。

    为什么?

    • 今天是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";
    ?>
    

    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