2010-07-23 56 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年代:)