Smarty_迷你模板引擎开发(1)

来源:互联网 发布:ntfs for mac os 10.5 编辑:程序博客网 时间:2024/04/25 06:46

  Smarty是一个使用PHP写出来的模板引擎,是目前业界最著名的PHP模板引擎之一。它分离了逻辑代码和外在的内容,提供了一种易于管理和使用的方法,用来将原本与HTML代码混杂在一起PHP代码逻辑分离。简单的讲,目的就是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。

Smarty开发图
这里写图片描述

模板文件(02.html)

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Untitled Document</title></head><body><div>{$title}</div><div>{$content}</div></body></html>

  迷你引擎类文件(MiniSmarty.class.php),通过模板引擎类,处理模板文件,得到混编文件(02.html.php),然后导入这个混编文件。

<?php//模板引擎类class MiniSmarty{    //“编译”模板文件({ }标记替换为php标记)    function compile($tpl){        //获得模板文件内部具体的模板内容        $cont = file_get_contents($tpl);        //echo $cont;        //替换:{ 替换为 < ?php echo         $cont = str_replace("{", "<?php echo ", $cont);        //替换:} 替换为 ;? >        $cont = str_replace("}", ";?>", $cont);        //echo $cont;          //把生成好的编译内容(php+html混编内容)放入一个文件里        file_put_contents('./02.html.php', $cont);        //引入混编文件        require "02.html.php";    }}

混编文件(02.html.php)

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Untitled Document</title></head><body><div><?php echo $title;?></div><div><?php echo $content;?></div></body></html>

客户端页面(02.php),使用模板类。

<?phpini_set('display_errors',1);$title = "今日头条";$content = "北京机动车限行";//1.引入Smartyrequire "02.MiniSmarty.class.php";//2.实例化smarty对象$smarty = new MiniSmarty;//3.调用compile方法,同时传递02.html模板文件参数//在该方法里面把02.html内部标记替换为php标记$smarty->compile('02.html');

这里写图片描述

但直接运行会出现错误

Notice: Undefined variable: title Notice: Undefined variable: content

  之所以出错,在于变量的作用域的问题,

$title = "今日头条";$content = "北京机动车限行"; 

  是全局变量,不能在类中直接使用。

解决方法:
  可以把模板引擎内部使用的变量信息都声明为该“模板类”的属性信息,这样在类的内部可以正常使用本身的属性信息。

改写模板引擎(02.MiniSmarty.class.php)

<?php//模板引擎类class MiniSmarty{    //给该类声明属性,用于存储外部的变量信息    public $tpl_var = array();    //把外部变量设置为类内部属性的一部分    function assign($k, $v){        $this->tpl_var[$k] = $v;      }    //“编译”模板文件({ }标记替换为php标记)    function compile($tpl){        //获得模板文件内部具体的模板内容        $cont = file_get_contents($tpl);        //echo $cont;        /*//替换:{ 替换为 < ?php echo         $cont = str_replace("{", "<?php echo ", $cont);*/        //替换:{ 替换为 < ?php echo $this->tpl_var['        $cont = str_replace("{\$", "<?php echo \$this->tpl_var['", $cont);        /*//替换:} 替换为 ;? >        $cont = str_replace("}", ";?>", $cont);*/        //替换:} 替换为 '];? >        $cont = str_replace("}", "'];?>", $cont);        //echo $cont;          //把生成好的编译内容(php+html混编内容)放入一个文件里        file_put_contents('./02.html.php', $cont);        //引入混编文件        require "02.html.php";    }}

客户端页面(02.php)

<?phpini_set('display_errors',1);//$title = "今日头条";//$content = "北京机动车限行";//1.引入Smartyrequire "02.MiniSmarty.class.php";//2.实例化smarty对象$smarty = new MiniSmarty;//把字符串信息设置为模板引擎类的属信息$smarty->assign('title', '今日头条');$smarty->assign('content', '北京机动车限行');//3.调用compile方法,同时传递02.html模板文件参数//在该方法里面把02.html内部标记替换为php标记$smarty->compile('02.html');

会重新生成混编文件(02.html.php)

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Untitled Document</title></head><body><div><?php echo $this->tpl_var['title'];?></div><div><?php echo $this->tpl_var['content'];?></div></body></html>

运行结果:

今日头条北京机动车限行

有关模板引擎小优化,请参考 Smarty_模板引擎优化

0 0