2011-03-03 28 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