2010-07-23 55 views
1

目前,我有一個基本的HTML模板文件。當我想創建一個新頁面時,我複製模板並在特定標籤之間放置一些require_once語句。我想知道是否有更好的方法可以讓每次都不需要複製模板。下面是一個典型的例子:我怎樣才能改進這個模板系統?

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link rel="stylesheet" type="text/css" href="css/second.css" /> 
    <script language="JavaScript" type="text/javascript" 
     src="js/validation_functions.js"></script> 
    <title>Order a Ticket for the ball</title> 
    </head> 
    <body> 

    <div id="banner">St. Tom's Ambulance Ball</div> 

    <!-- START[container] --> 
    <!-- "body" --> 
    <div id="container"> 

     <!-- START[header] --> 
     <div id="header"> 

      <!-- header --> 
      <div id="header_text">introduction</div> 
      <div id="header_cell2">the process</div> 
      <div id="header_cell3">start</div> 

     </div> 
     <!-- END[header --> 

     <!-- START[content] --> 
     <!-- "other container" --> 
     <div id="content"> 

      <!-- START[form] --> 
      <div id="form"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.form.view.php")); 
       ?> 
      </div> 
      <!-- END[form] --> 

      <!-- START[data] --> 
      <!-- "main content" --> 
      <div id="data"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.data.view.php")); 
       ?> 
      </div> 
      <!-- END[data] --> 

      <!-- START[side] --> 
      <div id="side"> 
       <?php 
       require_once(realpath($config["directories"]["views"]."/index.side.view.php")); 
       ?> 
      </div> 
      <!-- END[side] --> 

     </div> 
     <!-- END[content] --> 

     <!-- START[footer] --> 
     <div id="footer"> 
      <!-- footer --> 
      <div id="footer_text"> 
       <ul> 
        <li><a href="index.php">home</a></li> 
        <li><a href="">partners</a></li> 
        <li><a href="">projects</a></li> 
        <li><a href="">contact us</a></li> 
       </ul> 
      </div> 

      <div id="footer_cell2">&nbsp;</div> 
      <div id="footer_cell3">&nbsp;</div> 

     </div> 
     <!-- END[footer] --> 

    </div> 
    <!-- END[container] --> 

    </body> 
</html> 

編輯:我注意到了你的建議使用GET。新的想法是將每個請求url形成爲index.php?page = page_name。這個請求然後由主控制器處理,然後主控制器根據$ _GET ['page']的值設置模板的變量。爲此,現在模板將是:

<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
    <link rel="stylesheet" type="text/css" href="css/second.css" /> 
    <script language="JavaScript" type="text/javascript" 
     src="js/validation_functions.js"></script> 
    <title><?php h($title) ?></title> 
    </head> 
    <body> 

    <div id="banner">St. Tom's Ambulance Ball</div> 

    <!-- START[container] --> 
    <!-- "body" --> 
    <div id="container"> 

     <!-- START[header] --> 
     <div id="header"> 

      <!-- header --> 
      <div id="header_text"><?php h($header_1) ?></div> 
      <div id="header_cell2"><?php h($header_2) ?></div> 
      <div id="header_cell3"><?php h($header_3) ?></div> 

     </div> 
     <!-- END[header --> 

     <!-- START[content] --> 
     <!-- "other container" --> 
     <div id="content"> 

      <!-- START[form] --> 
      <div id="form"> 
       <?php 
       require_once(realpath($view_1)); 
       ?> 
      </div> 
      <!-- END[form] --> 

      <!-- START[data] --> 
      <!-- "main content" --> 
      <div id="data"> 
       <?php 
       require_once(realpath($view_2)); 
       ?> 
      </div> 
      <!-- END[data] --> 

      <!-- START[side] --> 
      <div id="side"> 
       <?php 
       require_once(realpath($view_3)); 
       ?> 
      </div> 
      <!-- END[side] --> 

     </div> 
     <!-- END[content] --> 

     <!-- START[footer] --> 
     <div id="footer"> 
      <!-- footer --> 
      <div id="footer_text"> 
       <ul> 
        <li><a href="index.php">home</a></li> 
        <li><a href="">partners</a></li> 
        <li><a href="">projects</a></li> 
        <li><a href="">contact us</a></li> 
       </ul> 
      </div> 

      <div id="footer_cell2">&nbsp;</div> 
      <div id="footer_cell3">&nbsp;</div> 

     </div> 
     <!-- END[footer] --> 

    </div> 
    <!-- END[container] --> 

    </body> 
</html> 

注:H()是一個函數,呼應一個字符串之前,首先是去掉所有不需要實體標籤。

在相關說明中,在每個頁面的頂部有一些控制器文件,這些文件包含在require_once中。我在想,如果有可能實現基於這樣一個特定的字符串(功能/頁的名稱),即「指數」的功能,僅僅包括文件:

function include_controller($page){ 
    switch($page){ 
    case "index": 
     require_once(realpath($config["directories"]["controllers"]."/index_.php")); 
     break; 
    case "checkout": 
     require_once(realpath($config["directories"]["controllers"]."/checkout_.php")); 
     break; 
    default: 
     break; 
    } 
} 
+0

使用Zend或其他主流框架? – PurplePilot 2010-07-23 12:14:53

+0

你看過類似的東西:http://www.smarty.net/? – Rimian 2010-07-23 12:19:05

回答

1

而不是硬編碼的在每個文件中都包含一個控制器文件,在該文件中可以通過$ _GET變量傳遞要顯示的頁面。控制器然後處理邏輯幷包括適當的頁面或頁面。很多MVC框架都是這樣做的。

編輯:要回答第二個問題,而不是使用開關,您可以檢查以確保文件存在。如果是,請包含該文件,否則會輸出錯誤(「頁面不存在」或類似內容)。

function include_controller($page){ 
    if (file_exists($config["directories"]["controllers"]."/$page_.php")) { 
     // page exists, include it 
     require_once($config["directories"]["controllers"]."/$page_.php")); 
    } else { 
     // page not found 
    } 
} 

顯然,你應該做的功能多了幾分穩健和可能限制將被納入到某個目錄或某事的文件。另外請確保您正確過濾$頁面變量,以便用戶無法訪問任何文件。

+0

感謝您的意見。他們一直很有幫助。 – Fortisimo 2010-07-23 14:53:58

0

如果你的服務器支持它,你可以選擇你想要的東西引用包括在.htaccess中所有的網頁:

php_value auto_prepend_file "header.php" 
php_value auto_append_file "footer.php" 

(發現這個在codingforums.com

+0

該頁面還提供了一些關於如何使用重寫規則進行的提示。 – Curtis 2010-07-23 12:17:51

1

記住這一個文件作爲模板文件。然後,對於您網站中的所有功能,請始終打開此文件。讓我們坐這個文件是index.php。所以所有功能請求都會轉到index.php。但具有不同的參數,以便爲功能A.

的index.php?功能=一 對於功能b

的index.php?功能= B

可以增加更多的參數也。

現在基於a,b和一組參數查看您希望包含哪些文件作爲需求一次。

+0

你的建議聽起來很有趣。我想知道,我將如何設置所有功能請求到index.php? – Fortisimo 2010-07-23 12:41:00

0

如果您選擇指定正在請求的頁面的不同方式(如使用GET變量),則可以通過一個模板來獲取。您可以將頁面加載到數據庫中並指定每個包含的部分,然後使用一個php'模板引擎'從數據庫加載所請求的頁面,並輸出包含正確內容的模板。

1

像其他人已經說過的那樣,最好使用某種MVC框架。或者至少使用模板引擎(如Smarty)。你的例子沒問題,但對於90年代:)