smarty模板总结一

来源:互联网 发布:淘宝虚拟对话生成器 编辑:程序博客网 时间:2024/05/17 02:58
一.什么是模板引擎
模板引擎(这里是指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)
分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个
标准的HTML文档
模板引擎不属于特定技术领域,他是跨领域,跨平台的概念。在Asp下有模板引擎,
在PHP下也有模板引擎,在C#下也有,甚至JavaScript、WinForm开发都会用到模板引擎技术


二.模板引擎分类
模板引擎的实现方式有很多,最简单的是‘置换型’的模板引擎,这类模板引擎只是将
指定模板引擎内容(字符串)中的特定标记(子字符串)替换一下,便可以生成了最终需要
的业务数据(比如网页)


置换型模板引擎实现简单,但其效率底下,无法满足高负载的应用需求(比如有海量访问的网站),
因此还出现了“解释型”模板引擎和“编译型”模板引擎等
Smarty模版引擎属于“编译型”模板引擎。


三.引擎的作用
模板引擎可以让(网站)程序实现界面与数据分离,这就大大提升了开发效率,
良好的设计也使得代码重用变得更加容易,我们司空见惯的模板安装卸载等概念,
基本上都和模板引擎有着千丝万缕的联系。模板引擎不只是可以让你实现代码分离
(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),
还可以实现代码单元共享(代码重用),甚至是多语言、动态页面与静态页面自动均衡
(SDE)等等与用户界面可能没有关系的功能。
例:自定义模板引擎
class Smarty{
    //把html页面和数据库例拿到值写进这个数组了
    private $data=array();
    public function assign($name,$value){
        $this->data[$name]=$value;
    }
    //这个方法是为了把html里的文件进行修改从而得到一个新的动态页面
    public function display($name){
        //通过拼接来拿到html文件所在位置
        $file='templates/'.$name;
        //打开文件
        $str=file_get_contents($file);
        //取出文件中要更新的值进行替换
        $reg='/\{\$([a-zA-Z_]\w*)\}/';
        //更新的值
        $replace='<?php echo $this->data["\\1"] ?>';
        //把更新的值替换到原来的位置
        $tplc=preg_replace($reg,$replace,$str);
        //创建一个文件
        $tplcFile="templates_c/".$name."_compile.php";
        //把内容写进新文件中
        file_put_contents($tplcFile,$tplc);
        //展示文件内容
        include_once "$tplcFile";


    }
}


四.Smarty模板引擎
1.Smarty是采用php写的一个模板引擎,设计的目的是要将php代码与html代码分离
使php程序员只专注于Php代码的编写,网页美工只专注于网页的美化


2.Smarty引擎的优点
优点:
速度:相对于其他模板引擎而言。


编译型:采用了Smarty编译的程序在运行时要编译成一个非模板技术的Php文件,使后续的调用更快


缓存技术:Smarty提供了一种可选择使用的缓存技术,他可以将用户最终看到的HTML文件缓存成一个
静态的HTML页


插件技术:Smarty采用面向对象的实现,可以非常方便的定义一些插件


强大的表现逻辑:PHP负责后台,Smarty负责前端


模板继承:这使得模板更直观,更有效率,易管理


五.安装Smarty及初始化配置
1.到Smarty官网下载最新的稳定版本
http://www.smarty.net/download.php
然后解压压缩包,在解压后的目录可以看到一个名叫libs 的Smarty类库目录,安装Smarty只需要这一个文件夹
直接将libs文件夹复制到程序主文件夹下
在当前目录下创建一个文件,代码如下:
/* 指定Smarty.class.php所在位置,注意'S'是大写的*/
require './libs/Smarty.class.php';
/* 实例化Smarty类的对象$smarty */
$smarty = new Smarty();


2.初始化Smarty类库的默认配置
/** file: init.inc.php Smarty对象的实例化及初使化文件    */
define("ROOT", str_replace("\\", "/",dirname(__FILE__)).'/');  //指定项目的根路径
require ROOT.'libs/Smarty.class.php';                         //加载Smarty类文件
$smarty = new Smarty();                                      //实例化Smarty类的对象$smarty
/* 推荐用Smarty3以上版本方式设置默认路径,成功后返回$smarty对象本身,可连贯操作 */
$smarty ->setTemplateDir(ROOT.'templates/')    //设置所有模板文件存放的目录
        ->setCompileDir(ROOT.'templates_c/')   //设置所有编译过的模板文件存放的目录
        ->setPluginsDir(ROOT.'plugins/')       //设置为模板扩充插件存放的目录
        ->setCacheDir(ROOT.'cache/')           //设置缓存文件存放的目录
        ->setConfigDir(ROOT.'configs/');       //设置模板配置文件存放的目录
$smarty->caching = false;                      //设置Smarty缓存开关功能
$smarty->cache_lifetime = 60*60*24;            //设置模板缓存有效时间段的长度为1天
$smarty->left_delimiter = '<{';                //设置模板语言中的左结束符
$smarty->right_delimiter = '}>';                //设置模板语言中的右结束符
$smarty->auto_literal = false;                   //设置分隔符允许出现空格


3.在另一个文件中操作Smarty引擎
/* 第一步:加载自定义的Smarty初始化文件 */
require "init.inc.php";
/* 第二步:用assign()方法将变量置入模板里 */
$smarty->assign("title", "测试用的网页标题");
/* 也属于第二步,分配其他变量置入模板里,可以是任何类型的变量 */
$smarty->assign("content", "测试用的网页内容");
/* 利用Smarty对象中的display()方法将网页输出 */
$smarty->display("test.html");


六.模板设计时美工的常用操作
1.模板中的注释
格式: {* this is a comment *}
smarty注释不会在模板文件的最后输出中出现,这与<!-- HTML 注释-->不同,
即html注释在页面源码中可见,而smarty注释则不能。这点非常有用,试想,
注释只存在于模板里面,而在输出的页面中谁也看不见


2.模板中的变量应用
模板变量用美元符号$开始,可以包含数字、字母和下划线,这与php变量很像。
你可以引用数组的数字或非数字索引,当然也可以引用对象属性和方法
$smarty->assign(“num”,100);                             //向模板中放置整数
$smarty->assign(“str”,“hello”);                        //向模板中放置字串
$smarty->assign(“dd”,100.24);                        //向模板中放置浮点数
$smarty->assign(“a1”,array(10,20,30,40));                  //向模板中放置索引式数组
$smarty->assign(“a2”,array(“name”=>“zhangsan”,“age”=>20)); //向模板中放置关联数组
$smarty->assign(“ob”,new Stu());                       //向模板中放置对象
class Stu{
    public $name="zhangsan";
    public $age=30;
}


//在Smarty使用数学和嵌入标签:
{$x+$y}                         // 输出x+y的和.
{assign var=foo value=$x+$y}     // 属性中的变量
{$foo[$x+3]}                     // 变量作为数组索引
{$foo={$counter}+3}               // 标签里面嵌套标签
{$foo="this is message {$counter}"} // 引号里面使用标签


//可以嵌套短变量分配:
{$foo=$bar+2} //在模板中定义一个变量
{$foo = strlen($bar)}           // 使用函数并赋值定义变量
{$foo.bar=1}                     // 赋值给指定的数组索引
{$foo.bar.baz=1}                     // 赋值给指定的数组多维索引
{$foo[]=1}                     // 不指定数组索引来给数组赋值


//Smarty "dot" 语法
//(注意: 嵌入的{}用来解决指代不明的情况):
{$foo.a.b.c}         //=>  $foo['a']['b']['c']
{$foo.a.$b.c}       //=>  $foo['a'][$b]['c']
{$foo.a.{$b+4}.c}   //=>  $foo['a'][$b+4]['c']   表达式作为索引
{$foo.a.{$b.c}}     //=>  $foo['a'][$b['c']]       嵌套索引


//PHP式语法, "dot"语法外的另一种选择:
{$foo[1]}
{$foo['bar']}
{$foo['bar'][1]}
{$foo[$x+$x]}
{$foo[$bar[1]]}


//访问Smarty节块变量,而非访问数组可变变量:
$foo
$foo_{$bar}
$foo_{$x+$y}
$foo_{$bar}_buh_{$blar}
{$foo_{$x}}


//对象链:
{$object->method1($x)->method2($y)}


3.模板中的函数应用
每一个smarty标签输出一个变量或者调用某种函数。在定界符内函数(一般定界符‘{}’包住)
和其属性(同样在定界符内)将被处理和输出。
例如: {funcname attr1="val" attr2="val"}
在模板里无论是内置函数还是自定义函数都有相同的语法。
内置函数将在smarty内部工作,例如{if}、{section}和{strip},不能修改他们。
自定义函数通过插件机制起作用,它们是附加函数。只要你喜欢,可以随意修改,
你也可以自行添加。
例如{html_options}和{html_select_date}


{date("Y-m-d",time())} //直接使用系统函数date和time


{myfun()}           //直接使用系统函数


{config_load file="colors.conf"} //调用Smarty内置函数加载配置文件


{include file="header.tpl"} //调用Smarty内置函数包含头部模板文件


//使用块状函数
{if $highlight_name}
Welcome, <font color="{#fontColor#}">{$name}!</font>
 {else}
Welcome, {$name}!
 {/if}


{include file="footer.tpl"}


4.忽略Smarty解析


忽略Smarty对某些语句段的解析很有必要。例如嵌入到模板中的javascript或Css代码。
使用了与Smarty默认定界符‘{’和‘}’一样的符号。
处理方式:
在Smarty模版,如果‘{’和‘}’大括号里包含有空格那么整个{}内容会被忽略,
你可以设置Smarty类变量$auto_literal=false来取消这种规则。
Smarty默认定界符‘{’和‘}’简洁地描述具体的内容,然而如果你有更好的定界符设置,
也可以用Smarty的$left_delimiter和$right_delimiter设置相应的值。
{literal}...{/literal}块被用来忽略模版语法的解析,你也可以用{ldelim}、
{rdelim}标签或{$smarty.ldelim}、{$smarty.rdelim}变量来忽略个别大括号


5.从配置文件中读取变量
加载配置文件后,配置文件中的变量需要用两个井号“#”包围或者是smarty的保留变量$smarty.config.来调用。
第一步:在configs目录下创建一个foo.conf文件:
//foo.conf文件内容
pageTitle       = "This is mine"
bodyBgColor = '#eeeeee‘
tableBorderSize = 3
tableBgColor = "#bbbbbb“
rowBgColor   = "#cccccc"


[index]
fontSize="18px"
//下面为配置文件变量“#号方法”的示例
如果想拿到index下的字体大小 包含文件的时候后面要section要给他起个名字:index
{config_load file='foo.conf'   section='index'}
<html>
  <title>{#pageTitle#}</title>  <body bgcolor="{#bodyBgColor#}">
    <table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
         <tr bgcolor="{#rowBgColor#}">
            <td>First</td><td>Last</td><td>Address</td>
          </tr>
    </table>
   </body>
</html>


6.在模板中使用保留变量


{$smarty.get.page} //等价于$_GET['page']
{$smarty.post.page} //等价于$_POST['page']
{$smarty.cookies.username} //等价于$_COOKIE['username']
{$smarty.server.SERVER_NAME} //等价于$_SERVER['SERVER_NAME']
{$smarty.env.PATH} //等价于$_ENV[‘PATH’]
{$smarty.session.id} //等价于$_SESSION['id']
{$smarty.request.username} //等价于$_REQUEST['username']
{$smarty.now} //当前时间戳
{$smarty.const} //获取系统常量{$smarty.const.__FILE__}
{$smarty.config} //获取配置文件中的配置信息
{$smarty.template} //返回当前模板名(不含路径)
{$smarty.current_dir} //返回当前模板路径名
{$smarty.version} //返回当前Smarty模板的版本
{$smarty.ldelim}, {$smarty.rdelim} //返回Smarty的左右定界符