2011-03-03 24 views
5

我正在寻求关于将网站内容分成逻辑块的最佳做法的建议。我需要一个页眉和页脚,这些页面在整个网站中都是不变的,所以如果我有几页不同的内容,它们都将如下所示 - 对页眉和页脚所做的更改会自动更新,而无需更改每个单独的页面。使用PHP包括分离网站内容

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

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

+3

这怎么可能是不好的做法? WordPress做到了。 '' – 2011-03-03 16:01:01

回答

13

不,你的做法是错误的。
这里是你的设计的主要缺陷:

  1. 你假设的header.php将在每个页面调用来调用。这是错误的。
  2. 你假设header.php将永远是静态的。这是错误的。
  3. 你忘了为页面本身创建一个模板。

主要规则每个人都拥有由心脏学会:

没有一个字符必须被送入浏览器,直到所有的数据已经准备好了。

为什么?

  • 今天是2011年。 AJAX时代。如果你的代码将不得不发送JSON数据而不是整个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> 

简单,干净和维护。

+6

@Shrap,对不起,我不同意这里。他提供的例子对于简单的网站很常见。你正在把它提升到许多开发人员不需要的水平。而且,围绕着诸如您的标题示例之类的问题有几种创造性的方法,例如将标题定义为变量并在调用标题之前将其设置。他没有提到这一点。并说出这是错的就是不对!我说这取决于情况。 – bpeterson76 2011-03-03 16:20:24

+1

我必须承认,这仅仅是一个四页,简单的网站,但感谢你指向正确的方向 - 你提出的问题是我进入更复杂的网站设计时要考虑的事情! – persepolis 2011-03-03 20:40:23

+3

@persepolis这样的布局是基于多年的研究和经验。您可以创建不同设计的网站数量,而无需接触核心文件。这是使用模板的巨大优势。还有很多其他的改进。例如,根据数据库查询结果,您只需发送HTTP头或JSON数据来服务AJAX调用。这对我的布局来说很容易,而且对于你的初始布局来说是不可能的。等等。毕竟,使用它建立4页的网站会更容易。 – 2011-03-03 20:50:20

-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'); 
?> 

如果您希望网址转到www.domain.com/pagename,您尝试加载到index.php的页面是“pagename”,请使用HTACCESS并执行一些URL重写:http://corz.org/serv/tricks/htaccess2.php

+0

+1为答案,但仍有更多可以完成。但请注意,您应该使用'<?php'而不是'<?'来打开您的PHP代码。短表现在已被弃用。 – Spudley 2011-03-03 16:05:28

+1

这里的风险在于,人们可能会使用完整的url提供$ _GET ['page'],并且包含能够浏览整个文件夹的恶意脚本。你最有可能不想要这个,瘦kabout首先检查该变量的值:) – Tsadiq 2011-03-03 16:15:31

+1

**这是文件注入在这里,极其危险的漏洞** – 2011-03-03 16:18:57

4

这是一个基本的方法,但是,是的,它的工作:)我肯定会用大量的模板和OOP的麻烦,但你肯定是在正确的道路

上,我可以”不再评论,那么我会在这里回答;)如果他需要一个自定义标题,那么他需要一些更高级的功能。所以,正如我所说,这是一个基本的方法。但最终,如果他真的有一个静态的页眉/页脚,并且真的在其他地方使用它们,那么,是的,这是一个好方法。

因此,你可能会打扰一些先进的标题,你可以在每个页面上提供参数。你可以继续完整的MVC内容。最后告诉他使用预制框架并停止打扰。如果你不让他做一些反复试验,他怎么能学会呢?

+0

如果他需要自定义标题怎么办? – 2011-03-03 16:15:53

+0

伙计,放下自定义标题的东西。很多人只是不在乎! – bpeterson76 2011-03-03 16:20:50

+0

我明白你想为他提供质量更好的html。但是你需要给他提供从阵列中添加metz的可能性。并为每个页面定制css/js。甚至可能连接它们以减少http请求。你可以。 – Tsadiq 2011-03-03 16:28:21

7

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> 
+0

这似乎也有每个页面的两个文件? (hello.php和ContentBody的内容)? – 2017-08-13 15:39:26