2011-05-24 46 views
0

您好我想弄清楚如何做一个PHP模板系统与类,我不喜欢header.php footer.php或聪明或任何blabla,只是想template.html,class.php和page1.php,page2.php等......用我自己的php代码,我发现很多网站的人都在教这个如何做,但我仍然有很多问题。用于不同的页面与不同的CSS和MySQL的PHP​​模板

1)我想EXTRA CSS添加到

2部分页面)有些页面有PHP代码,如MySQL查询和类似的东西这将是一个变量,其中曾经我想,

3)内容在模板中不仅仅是单词,而是大量的div和东西,CONTENT变量在一些页面中也有查询,比如填充(例如)下拉菜单。

希望有人可以指导我在这,我居然有我的explame tempalte,(标签都只是随机的)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 

<head> 
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
<meta http-equiv="X-UA-Compatible" content="IE=8" /> 
<title>CompanyName | ##TITLE##</title> 

<link href="layout.css" rel="stylesheet" type="text/css" /> 
<link href="styles.css" rel="stylesheet" type="text/css" /> 
##EXTRA_CSS## 
<link rel="shortcut icon" href="/favicon.ico" /> 

<!--[if IE 6]> 
    <script src="DD_belatedPNG_0.0.8a-min.js"></script> 
    <script> 
      DD_belatedPNG.fix('img, div'); 
    </script> 
<![endif]--> 

##EXTA_JS## 

</head> 

<body> 

    <div id="main"> 
     <div id="container_black"> 
      <div id="container_white"> 

       <div id="container_header"> 

        <div id="logo_top"></div>   
        <div id="lineas_verticales_top"> 
         <div class="volver_portada"><a href="index.shtml">Volver a portada</a></div> 
         <div class="english_spanish"><u>Español</u> | <a href="../en/index.shtml" class="english_spanish">English</a></div> 
        </div> 
        <div id="nav_bar_black"><div id="nav_bar_red"><div id="nav_bar_yel"> 

         <ul class="menuholder"> 
          <li class="menu_principal"><a href="#" title="Principal">Principal</a></li> 
          <li class="menu_empresa"><a href="#" title="Empresa">Empresa</a></li> 
          <li class="menu_productos"><a href="#" title="Productos">Productos</a></li> 
          <li class="menu_clientes"><a href="#" title="Clientes">Clientes</a></li> 
          <li class="menu_recetas"><a href="#" title="Recetas">Recetas</a></li> 
          <li class="menu_contacto"><a href="#" title="Contacto">Contacto</a></li> 
         </ul> 

        </div></div></div> 
        <div id="topbg_degr"></div> 

       </div> 

       <div id="container_left"> 
        <div id="conmargen_left_top"></div> 
        <div id="container_conmargen_left_middle"> 

         ##CONTENT## 

        </div> 
        <div id="conmargen_left_bottom"></div> 

        <!--[IF INDEX] 
        <div id="fono"></div> 
        <div id="dir"></div> 
        --> 

       </div> 

       <!--[IF INDEX] 
       <div id="nav"></div> 
       --> 

       <div id="container_right"> 
        <div id="conmargen_right_top"></div> 
        <div id="container_conmargen_right_middle"> 

         <!--[IF PAGE OR PAGE OR PAGE] 
         <a href="#" id="recetas_poster" title="recetas"></a> 
         [ELSE IF] 
         <a href="#" id="clientes_poster" title="recetas"></a> 
         [ELSE IF] 
         <a href="#" id="productos_poster" title="recetas"></a> 

         --> 

        </div> 
        <div id="conmargen_right_bottom"></div> 
       </div> 

       <!--[IF INDEX] 
       <div id="frame_facebook"> 
       <a href="#" class="facebook" title="CompanyName"><span>CompanyName</span> en Facebook</a> 
       <div class="breakL"></div> 
       <fb:like href="#" layout="button_count" show_faces="true" width="100" font="tahoma"></fb:like> 
       </div> 
       --> 

       <br/> 

      </div> <!-- cierre del container white --> 
     </div> <!-- cierre del container black --> 

     <div id="footer"> 
       <div class="footer_comment"> 
        CompanyName Todos los derechos reservados 2011 
       </div> 
     </div> 

    </div> <!-- cierre del main --> 
<br/> 

</body> 

</html> 

例如contact.php,内容将是一个形式,并在页面顶部,我有这个巨大的PHP代码,我验证和所有。

我真的很感激,如果有人会让我在正确的道路上做到这一点。先谢谢你。

+1

'有些页面有像mysql查询和类似东西的php代码 - 它通常被称为'代码异味'。阅读关于MVC和框架。或两者兼得:http://www.yiiframework.com/doc/guide/1.1/en/basics.mvc – 2011-05-24 09:53:49

回答

0

可能有一百种不同的方法可以解决这个问题,每种方法都有各自的优点和缺点 - 就像您已经说过的那样使用数据库和/或ajax调用和/或页眉和页脚。你必须弄清楚哪种方式最适合你的特定项目或编码风格,或者两者兼而有之。然而,如果你真的只想'template.html',但有一些页面与PHP,JavaScript,MySQL或其他任何内容 - 然后我会建议。

使用占位符(例如{PAGE_TITLE},{MAIN_CONTENT}或任何您需要的)创建template.html。

创建page1.php/page2.php等并执行任何服务器端工作,生成变量以匹配占位符。这可能是很方便的将它们存储为一个数组,即:

PAGE_VARS array( 
       ['TITLE'] => My Page 
       ['CONTENT'] => This is my page content 
       ) 

在您的“页面”脚本的末尾,template.html的整个内容加载到一个字符串

$template = file_get_contents('template.html') 

然后,建立你的模板,使用替代变量或是一个基本的循环:

foreach ($PAGE_VARS as $KEY=>$VALUE) {  
    $template = str_replace("{".$KEY."}",$VALUE,$template) 
} 

(随意弄巧,可能与上述一些正则表达式更高效,这只是一个简单的例子。)

输出您的模板。

class Template { 
    var $contents; 

    function load($file) { 
     if ($fp = fopen($file, "r")) { 
      $this->contents = fread($fp, filesize($file)); 
      fclose($fp); 
     } 
    } 

    function replace($str,$var) { 
     $this->contents = str_replace("<".$str.">",$var,$this->contents); 
    } 

    function show() { 
     $search = array(
       '/\t/', //Remove Tabs 
       '/<!--[^\[-]+?-->/', //Remove Comments 
       '/\n\n/' //Remove empty lines 
       ); 
      $replace = array(
       '', 
       '', 
       '' 
       ); 
     $this->contents = preg_replace($search, $replace, $this->contents); 
     echo $this->contents; 
    } 
} 

在模板:

echo $template; 
+0

感谢您的帮助,我仍然有一个疑问,你说“这是我的网页内容”,是它可以把一个巨大的内容?与div和额外的PHP? – Gmo 2011-05-24 10:06:10

+1

传递给$ PAGE_VARS的数据应该是最终的内容。例如,如果要显示MySQL查询的结果,请首先生成查询,然后将结果设置为$ PAGE_VARS ['CONTENT']。 – moteutsch 2011-05-24 10:14:56

+1

而且,是的,您可以在占位符中使用HTML,但不能使用PHP。你不应该需要任何东西,就像我上面解释的那样。 – moteutsch 2011-05-24 10:16:05

0

可以这样,这将是你的 '模板引擎' 创建快速类(class.php)。HTML文件,添加你想要把你的内容的特殊标签,就像这样:

<html><head></head> 
<body> 
<div id="id1"><page_title></div> 
</body> 
</html> 

...

然后创建一个功能到标签内写入(每区一个):

function writetitle($s) { 
    $GLOBALS['writes']++; 
    $GLOBALS['page_title'] .= $s; 
    return; 
} 

最后,在page.php文件,调用类的,写你的内容,并生成页面:

require_once('class.php'); 
//Load Class 
$template = new Template; 
$template->load("template.html"); 

//Some query : 
$query = mysql_query('SELECT...'); 
$res = mysql_num_rows($query); 

//write your content : 
writetitle('my title, '.$res.''); 

//Generate the page : 
$template->show(); 

土井只要你愿意,你可以创建尽可能多的区域。 writetitle就像echo,所以你可以做出查询和你想要的一切。

我希望它有帮助。

+0

即时通讯在php中真的很新,但是当你说每个区域的意思是一个函数时,函数的功能如下: 函数writetitle($ s){GLOBALS ['writes'] ++; $ GLOBALS ['page_title']。= $ s; $ GLOBALS ['extra_CSS']。= $ s; ... return; } ??那样对不对? – Gmo 2011-05-24 22:42:39

0

让PHP解析你的模板文件的Insetad我建议使用PHP编写模板而不是你自己的伪代码。

这是完全有效的写

... 
<body> 
<?php if($fooBar == "hahahaha"):?> 
    <a href="www.foobar.com">The cool foobar link</a> 
<?php endif;?> 
</body> 
... 

我会再创建一个layout文件,所有常用的html等,然后用小模板片段,其中的主要内容去插入布局。 通过在你的模板中有实际的PHP代码,PHP机器人可以处理它们,并且你不必编写自己的逻辑来处理循环,如果语句等。

看看Zend Framework,你会得到如何编写模板引擎的好主意。