设为首页收藏本站关注微信<<< 抵制 IE6 人人有责 >>>
搜索
热搜: 活动 交友 discuz
查看: 1856|回复: 1
打印 上一主题 下一主题

[WEB前端] 超简单PHP代码分离模板技术

[复制链接]
跳转到指定楼层
楼主
发表于 2015-9-14 20:44:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近了解到了PHPWIND里的一个代码分离的小技巧
大体就是在PHP文件中通过包含文件去生成HTML文件,在PHP文件中定义好变量,html文件中用注释的方式隐藏PHP代码,在PHP文件中包含的时候读取输出HTML代码显示。其中html文件中的注释部分用PHP语法执行,替换变量和循环读取变量值都是可以用PHP语法的,所以也就可以运用这种方法去做简单的美工与程序的分工了。
文件一:template.php
[PHP] 纯文本查看 复制代码
<?php
//Example of simple template
//Powered by kev
//http://www.kevin-ying.com
//Email:china@kevin-ying.com
//2007-03-28 14:28
$sitename = "www.kevin-ying.com";
$name       = "kevin-ying";
$siteurl    = "http://www.kevin-ying.com";
$email      = "china@kevin-ying.com";
$titles     = array("kevin-ying","G_vin","kevin-ying","G_cscs","G_DCDC","chinese","world");
$content    = "This is a example of simple template with php. I am a newer phper and looking forword to read your comments here . Thank you for you coming . I am kevin-ying from China . My website address is [url]http://www.kevin-ying.com[/url] . Email address is : [email]china@kevin-ying.com[/email]. ";
require_once "template.htm";
?>


文件二:template.htm
[HTML] 纯文本查看 复制代码
<!--
<?php
print <<<EOT
-->
<html>
<head>
<title>Example of simple template.. Powered by kevin-ying [url]www.kevin-ying.com[/url]</title>
</head>
<body>
<table width="88%" border="0" align="center" cellpadding="2" cellspacing="2">
    <tr>
      <td align="center"><h2><A href="{$siteurl}">{$sitename}</A></h2></td>
    </tr>
    <tr>
      <td><p>Website : <A href="{$siteurl}">{$sitename}</A></p>
      <p> </p></td>
    </tr>
</table>
<TABLE width="88%" border=0 align="center" cellPadding=5 cellspacing="1" bgcolor="#CCCCCC">
<TBODY>
<TR>
<TD width="25%" bgcolor="#FFFFFF">
<strong>Menu : </strong><br>
<!--
EOT;
foreach($titles as $title) {
print <<<EOT
-->
<LI>{$title}<BR></LI>
<!--
EOT;
}
print <<<EOT
--></TD>
<TD bgcolor="#FFFFFF">{$content}<br>
    {$content}</TD>
</TR>
</TBODY>
</TABLE>
<p>
    <!--
print <<<EOT
-->
</p>
<p>  </p>
<TABLE class=topborder cellSpacing=1 cellPadding=1 width=88% align=center border=0>
    <TBODY>
    <TR align=middle height=22>
      <TD>| <A  
         
        href="#">HomePage</A> | <A  
        href="javascript:addToFavorites(document.location.href,document.title);">Favorite</A> | <A  
        href="mailto:{$email}">Email this page</A> | <A  
        href="{$URL}admin/"  
        target="_blank">Manage website</A> | </TD></TR>
    <TR vAlign=bottom align=middle height=20>
      <TD>Copyright© 2007 <A href="{$siteurl}">{$sitename}</A><BR>
Powered by <A href="{$siteurl}">{$name}</A>
      </TD>
    </TR>
</TBODY>
</TABLE>
</body>
</html>
<!--
EOT;
?>
-->


..............................................................................
两天后...我也想用这种方法做个上传功能模块
index.php:
以下函数主要作用是读取一个目录有几个子目录并将子目录名放在一个数组中
[PHP] 纯文本查看 复制代码
<?php
function listdir($dir_name){
$dir=opendir($dir_name);
    while ($file_name=readdir($dir)) {
         if(($file_name!='.') && ($file_name!='..')) {
    if (is_dir($dir_name."/".$file_name)){
      $file_names[] = $file_name;
      }
         }
    }
    closedir($dir);
}
listdir("imgclass");//imgclass为父目录名
include("index.tpl");
?>


index.tpl
[HTML] 纯文本查看 复制代码
<!--
<?php
print <<<EOT
-->
<p>上传图片:</p>
<form enctype="multipart/form-data" method="post" action="index.php?action=uploadimg">
<select name="imgclass">
<!--
EOT;
foreach($file_names as $file_name){
print <<<EOT
-->
<option value="{$file_name}">{$file_name}</option>
<!--
EOT;
}
print <<<EOT
-->
</select>
<input type="file" name="image" size="50" value="浏览"   />
<input type="submit" value="上传图片">
</form>
<!--
EOT;
?>
-->


结果就是失败...下拉列表框中读不到数据...头都快想炸了...有点想放弃了(都是因为基本功不扎实啊)
想啊...想的...是不是变量的作用范围问题呢,所以值传不过来呀!
将listdir()中的$file_names定义成全局的应该没问题了吧,试一下,,哈哈,,:),果然是这样...运行正常哦!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享淘帖
回复

使用道具 举报

沙发
 楼主| 发表于 2015-9-14 20:48:12 | 只看该作者
用模板技术实现PHP代码和HMTL代码分离

1、模板的由来
在没有模板技术之前,使用PHP开发程序,通常都是php代码和html混编在一起。比如说新闻列表,很可能就是一个newslist.php页面,结构如下:
[HTML] 纯文本查看 复制代码
<? 
//从数据库中读取出要显示的新闻记录 
?> 
<html> 
<head>…….. 
</head> 
<body> 
<? 
While ($news = mysql_fetch_array($result)) { 
?> 
<!--输出新闻标题 -- > 
<? 
} 
?> 
</body> 
</html> 


那么这样有什么问题呢?首先,不利于分工合作。一般来说,都会由程序员来写代码,美工人员设计页面。那么在这种方式中,程序员必须等待美工人员把界面设计好才能开始工作。也就是说程序员和美工的工作是不能同步的。其次、不利于维护,可维护性差。比如说程序固定后,要修改界面,那么必须由美工修改后,程序员再重新添加。最后,程序结构混乱,可读性差。HTML和PHP混编在一起,一旦程序一多,就会变的非常的凌乱。
理解模板原理——使用PHP标签的模板技术
模板技术正是为了解决这些问题而出现的,为了解决这些问题,最早出现的是使用php标签的模板技术。
首先,我们要明白模板的目的是什么。模板主要要实现几个任务呢?第一、美工和程序的分离。更确切的说法是获取数据和显示数据的分离。第二、分工。良好的分工合作。
比如说新闻列表,如果使用模板,我们就可以把新闻列表的操作分成两部分:
1、 getnews.php 负责从数据库中读取数据到数组$news中,不关心$news是如何显示的。
2、 Shownews.php 负责把$news数组输出成HTML页面。而它不需要理会$news是从哪里来的。
好,这样,我们就实现了美工和程序的分离,达到了我们的初步目的,但是如何把这两个页面联合起来,并实现listnews.php的功能呢?
这就需要另外一个页面listnews.php,来负责把“美工(显示数据)”和“程序员(获取数据)”连接起来。应该说这个页面就是很简单了。
假设getnews.php的代码如下:
[PHP] 纯文本查看 复制代码
<? 
$news =“新闻列表”;//实际中应该是从数据库中读取出来的。 
?> 


Shownesw.php的代码如下:
[PHP] 纯文本查看 复制代码
<html> 
<head> 
<title>显示新闻</title> 
</head> 
<body> 
<?=$news?> 
</body> 
</html>

那么,这个联合页面listnews.php的代码就很简单了
[PHP] 纯文本查看 复制代码
<? 
Include(‘getnews.php');//获取数据 
Include(‘shownesw.php');//显示数据 
?> 


总结
使用PHP标签的模板系统,能够很好的实现美工和程序的分离,同时方便程序员和美工人员的分工合作,比如在上面的例子中shownews.php由美工人员来维护,getnews.php由程序人员来维护。而listnews.php就可以由系统设计人员来维护了。当然这中间需要增加一些约定的文档。
事实上,这个简单的例子也说明了最基本的MVC模型。其中M,模型,也就是负责读取数据,相当于我们的getnews.php。V,就是试图,用来显示数据,也就对应了shownews.php。最后是控制器C,对应我们的listnews.php
学习解释性模板技术——PHPLIB
Phplib的模板系统以小巧灵活、方便简单的特点赢得了很多phper的喜欢,在模板技术中占有一定的地位,它和fasttemplate之类的模板引擎都属于解释性模板技术。
在具体讲解phplib的使用之前,先说明为什么使用php标签的模板系统要继续改进。其实,这主要还是因为PHP标签对美工人员来说不方便。他们更加喜欢直接使用这种可视化的标签,比如{title}。
首先,我们自己把之前我们那个例子修改成使用可视化的标签来处理。第一步,把shownews.php改成shownews.tpl,里面的php标签换成可视化的标签,shownews.tpl的代码如下:
[HTML] 纯文本查看 复制代码
<html> 
<head> 
<title>显示新闻</title> 
</head> 
<body> 
{title} 
</body> 
</html>

第二步,如何实现listnews.php的效果呢?其实很简单,我只要直接把{title}替换成不就可以了吗?所以,修改后的listnews.php的代码如下:
[PHP] 纯文本查看 复制代码
<? 
Include('getnews.php');//获取数据 
echo str_replace('{title}',$news,file_get_contents('shownews.tpl')) 
?> 


其实phplib的原理正是这样!比如说我们要使用phplib来实现上面功能,我们只需要修改listnews.php.修改后代码如下:
[PHP] 纯文本查看 复制代码
<? 
Include('getnews.php');//获取数据 
include('template.class.php'); 
$t=new Template(); 
$t->set_file(‘shownesw,'shownews.tpl'); 
$t->set_var('news',$news); 
$t->parse('out', ‘shownesw'); 
$t->p('out'); 
?> 


另外关于phplib的区域,大家可以去查阅相应的手册。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|手机版|Archiver|源于生活(个人生活娱乐工作的笔记)css3,html5,学习笔记    

GMT+8, 2024-4-27 07:09 , Processed in 0.109201 second(s), 25 queries .

Powered by Mr.Kevin-ying

© 2004-2015

快速回复 返回顶部 返回列表