使用 PHP 包含分隔网站内容
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5183163/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using PHP include to separate site content
提问by persepolis
I'm looking for advice on the best practice for separating site content up into logical blocks. I want a header and footer that are constant throughout the site, so that if I have several pages of different content, they will all look as below — changes made to the header and footer then update automatically without me having to change each individual page.
我正在寻找有关将站点内容分成逻辑块的最佳实践的建议。我想要一个在整个站点中保持不变的页眉和页脚,这样如果我有几个不同内容的页面,它们都会如下所示 - 对页眉和页脚所做的更改然后自动更新,而我不必更改每个单独的页面。
<?php
include 'header.php';
?>
<body>
<p>page content here</p>
</body>
<?
include 'footer.php';
?>
The header.php
would contain the opening <html>
, <head>
and static content, and the footer.php
would contain any extra static content and the closing </html>
tag. So, my question is: Is this a good approach?I'm worried that spreading the <html>
tags across multiple files is bad practice. If so, what is the right way to approach this kind of design?
在header.php
将包含开幕<html>
,<head>
和静态内容,以及footer.php
将包含任何额外的静态内容和结束</html>
标记。所以,我的问题是:这是一个好方法吗?我担心<html>
在多个文件中散布标签是不好的做法。如果是这样,处理这种设计的正确方法是什么?
回答by Your Common Sense
Nope, your approach is wrong.
Here are main faults in your design:
不,你的方法是错误的。
以下是您设计中的主要缺陷:
- You're assuming that header.php would be called on the every page call. That's wrong.
- You're assuming that header.php will always be static. That's wrong.
- You forgot to create a template for the page itself.
- 您假设 header.php 将在每个页面调用中调用。那是错误的。
- 您假设 header.php 将始终是静态的。那是错误的。
- 您忘记为页面本身创建模板。
The main rule everyone have to learn by heart:
每个人都必须牢记的主要规则:
Not a single character has to be sent into browser, until all data gets ready.
在所有数据准备就绪之前,不必将单个字符发送到浏览器。
Why?
为什么?
- it's 2011 today. AJAX era. What if your code will have to send JSONed data instead of whole HTML page?
- there is a thing called
HTTP header
. Sometimes we have to send them. And it's gets impossible if you already have your ornate HTML header sent. - it's for just 4-page site. Okay. Imagine you've got lucky and got a request for another 4-page site. You will have to change only templates and don't touch engine files. That's really great benefit.
- Imagine you're going to make a custom
<title>
tag for your pages, based on the page content. Isn't it extremely common thing? But you can't make it without using templates.
- 今天是 2011 年。阿贾克斯时代。如果您的代码必须发送 JSON 数据而不是整个 HTML 页面怎么办?
- 有一种东西叫
HTTP header
。有时我们必须发送它们。如果您已经发送了华丽的 HTML 标头,这是不可能的。 - 它仅适用于 4 页的网站。好的。想象一下,您很幸运,收到了另一个 4 页站点的请求。您将只需要更改模板,而不要更改引擎文件。这真是大好处。
- 想象一下,您要
<title>
根据页面内容为页面创建自定义标记。这不是很常见的事情吗?但是如果不使用模板,你就无法做到。
So, you have to have one common site template containing header and footer and also dedicated templates for the every php script.
因此,您必须拥有一个包含页眉和页脚的通用站点模板,以及每个 php 脚本的专用模板。
An example layout is going to be like this:
一个示例布局将是这样的:
.1. page itself.
.1. 页面本身。
it outputs nothingbut only gather required data and calls a template:
它不输出任何内容,只收集所需的数据并调用模板:
<?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";
?>
.2. template.php
which is your main site template,
.2. template.php
这是您的主要网站模板,
consists of your header and footer:
由页眉和页脚组成:
<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>
.3. and finally links.tpl.php
is the actual page template:
.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>
easy, clean and maintainable.
简单、清洁和可维护。
回答by mattmc3
In building off of Your Common Sense
's answer, there's not a good reason to have 2 files for every page. You can easily combine your template (YCS called this .tpl.php) and your actual page into one file.
在构建Your Common Sense
的答案时,没有充分的理由为每个页面设置 2 个文件。您可以轻松地将您的模板(YCS 称为 .tpl.php)和您的实际页面合并到一个文件中。
First, start off with a class that you can expand as your template needs expand:
首先,从一个可以在模板需要扩展时扩展的类开始:
<?php
#lib/PageTemplate.php
class PageTemplate {
public $PageTitle;
public $ContentHead;
public $ContentBody;
}
Then, make your layout:
然后,进行布局:
<?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>
And finally, add your page with the body content:
最后,添加包含正文内容的页面:
<?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>
回答by tsadiq
This is a basic approach but, yeah, it does work :) I sure would bother with a lot of templating and OOP but you are definitely on the right path
这是一种基本方法,但是,是的,它确实有效:) 我肯定会打扰很多模板和 OOP,但您绝对走在正确的道路上
As i can't comment anymore, then i will answer here ;) If he need a custom title then he needs some more advanced functions. So, as i told, this is a basicapproach. But in the end, if he really have a static header/footer, and really use them everywhere, well, yes, this is a good way to go.
因为我不能再发表评论了,所以我会在这里回答;) 如果他需要自定义标题,那么他需要一些更高级的功能。所以,正如我所说,这是一种基本方法。但最后,如果他真的有一个静态的页眉/页脚,并且真的到处使用它们,那么,是的,这是一个很好的方法。
So ofc you could bother with some advanced headers with parameters you could feed on each page. You could go on a whole MVC stuff. In the end just tell him to use a pre-made framework and stop bothering. How could he learn if you don't let him do some trial and error ?
因此,您可能会打扰一些带有可以在每个页面上提供的参数的高级标题。你可以继续整个 MVC 的东西。最后只是告诉他使用预制框架并停止打扰。如果你不让他试错,他怎么能学会呢?
回答by circusdei
index.php -- includes header, footer, and content based on REQUEST variable.
header.php -- header content
footer.php -- footer content
index.php -- 包括基于 REQUEST 变量的页眉、页脚和内容。
header.php -- 页眉内容
footer.php -- 页脚内容
content1.php, content2.php, etc.
content1.php、content2.php 等
index.php:
索引.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');
?>
if you want the URL to go www.domain.com/pagename where the page you're trying to load into index.php is "pagename", use HTACCESS and do some URL Rewriting: http://corz.org/serv/tricks/htaccess2.php
如果您希望 URL 转到 www.domain.com/pagename,其中您尝试加载到 index.php 的页面是“pagename”,请使用 HTACCESS 并进行一些 URL 重写:http://corz.org/serv/技巧/htaccess2.php