php之Smarty模板使用方法示例详解

本文详细剖析了smarty模板的使用方法,对于学习smarty的朋友有一定的参考价值。详情如下:

一、模板中的注释

每一个Smarty模板文件,都是通过Web前台语言(xhtml,css和javascript等)结合Smarty引擎的语法开发的。
用到的web前台开发的语言和原来的完全一样,注释也没有变化。
Smarty注释语法是'左结束符变量值*'和'*右结束符变量值',在这两个定界符之间的内容都是注释内容,可以包含一行或多行,并且用户浏览网页查看原代码时不会看到注释,它只是模板内在的注释,以下是注释的例子。

$smarty->left_lelimiter = '<{';
$smarty->right_delimiter = '}>';

注释:

<{* this a note *}>

二、模板中变量声明

在Smarty中一切以变量为主,所有的呈现逻辑都让模板自行控制。有几种不同类型的变量,变量的类型取决于它的前缀是什么符号或者被什么符号包围。变量可以直接被输出或者作业函数属性和修饰符的参数或者用于内部的条件表达式等

<{$name}> <{*常规类型变量,需要调用模板内的assign函数分配值*}>
<{$contacts[row].phone}> <{*数组类型变量,需要调用模板内的assign函数分配值*}>
<body bgcolor="<{#bgcolor#}>"> <{*从配置文件中读取的变量的值并输出*}>

如果在Smarty模板中输出从php中分配的变量,需要在变量前面加$符号并用定界符将它括起来,命名方式和php的变量命名方式一样,并且定界标示符号又有点像是php中的<?php ?>(事实上它们确实会被替换成这个)

三、模板中输出从php分配的变量

在Smarty模板中经常使用的变量有两种:一是从php中分配的变量;另一种是从配置文件中读取的变量
注意:模板中只能输出从php中分配的变量,不能在模板中为这些变量重新赋值,变量都是全域的,只要分配一次就可以了,如果分配两次以上的话,变量内容会以最后分配的为主
Smarty中提供的foreach或section语句用于遍历输出数组中的每个元素,索引数组和关联数组在模板中输出的方式略有不同,索引数组在模板中的访问方式和在php脚本中的引用是一样的,关联数组中元素在模板中指定的方式是使用'.'访问的。
在模板中访问对象和php脚本中的方式一样,都是通过'->'这个运算符完成的。

四、Smarty 模板中变量的数学计算

在模板中变量不能直接赋值,但可以参与数学运算,只要在php脚本中可以执行的数学运算都可以在模板中应用,如下所示:

<{$foo + 1}> <{* 变量加1 *}>
<{$foo * $bar}> <{* 两个变量相乘 *}>
<{$foo->bar - $bar[1] * $foo->bar - 3 * 7}> <{* 复合类型变量参加运算 *}>
<{if($foo + 2 == 10)}> <{* 数学运算在程序逻辑中应用 *}>

在Smarty模板中可以识别嵌入在双引号中的变量,但有的变量必须用反引号'`'(此符号和'~'在同一个键上)包住,如下所示:

<{"test $foo test"}> <{* 双引号中使用变量 *}>
<{"test `$foo[0]` test"}> <{* 双引号中反引号包住的数组变量 *}>
<{"test `$foo.bar` test"}> <{* 双引号中反引号包住的对象成员变量 *}>

五、smarty模板使用示例

第1步:加载Smarty模板引擎,如:require 'libs/Smarty.class.php'
第2步:创建Smarty对象,如:$smarty = new Smarty();
第3步:修改Smarty默认行为,如:开启缓存、模板的存放路径等
第4步:将程序中取得的数据通过Smarty对象的assign()方法赋值给模板中相应的变量
第5步:用Smarty对象的display()方法将模板内容输出

assign()方法:

这个方法用来给模板中的变量赋值,使用比较容易
原型:void assign(string varname,mixed var)
这个方法可以将php所支持的类型数据赋值给模板变量包含数组和对象
使用方式有如下两种:

//指定一对'名称/数值'
$smarty->assign('question','你好吗');
$smarty->assign('answer','不怎么好');
//指定包含'名称/数值'
$smarty->assign(array('question' => '你好吗','answer' => '不怎么好'));//这种方式比较少用

display()方法:

基于Smarty的脚本中必须用到这个方法,而且一个脚本中只能使用一次,它负责获取和显示由Smarty引擎引用的模板
原型:var display(string template[,string cache_id][,string compile_id])
参数一:template是必选的,指定一个合法的模板资源的类型和路径
参数二:cache_id指定一个缓存标识符的名称
参数三:compile_id在维护一个页面多个缓存时使用
使用方法如下
$smarty->display('tpl/template_dir/template.html');

简单实例:

1、libs:是Smarty类库
2、tpl/cache_dir:存放缓存模板
3、tpl/compile_dir:存放编译后模板文件
4、tpl/config_dir:存放特殊配置文件
5、tpl/template_dir:存放模板文件
6、smarty.php文件里 new 出了一个 Smarty类对象,并设定各对象的属性值,如下代码

<?php
require 'libs/Smarty.class.php';//加载Smarty.class.php文件
define('SITE_ROOT','./tpl/');//定义一个常量
$tpl = new Smarty();
$tpl->template_dir = SITE_ROOT . 'template_dir';//存模板文件
$tpl->compile_dir = SITE_ROOT . 'compile_dir';//存编译过的模板文件
$tpl->config_dir = SITE_ROOT . 'config_dir';//存特殊配置文件
$tpl->cache_dir = SITE_ROOT . 'cache_dir';//存Smarty缓存文件
$tpl->caching = 1;//启用缓存
$tpl->cache_lifetime = 60*60*24;//缓存时间1天
$tpl->left_delimiter = '<{';//左结束符
$tpl->right_delimiter = '}>';//右结束符

7、index.php文件 首页代码如下

<?php
 require 'smarty.php';
 $tpl->assign('title','title测试');
 $tpl->assign('content','content测试');
 $tpl->display('template.html');

8、tpl/template_dir/template.html 这是一个模板文件 代码如下

 <html>
 <head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <title>
   <{$title}>
 </title>
 </head>
 <body>
 <{$content}>
 </body>
</html>
(0)

相关推荐

  • 说说PHP的autoLoad自动加载机制

    __autoload的使用方法1: 最经常使用的就是这种方法,根据类名,找出类文件,然后require_one 复制代码 代码如下: function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; } // 这里会自动加载Http/File/Interface.php 文件 $a = new Http_File_Interface(); 这种方法

  • PHP autoload与spl_autoload自动加载机制的深入理解

    PHP autoload机制详解(1) autoload机制概述在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利.这 也是OO设计的基本思想之一.在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.下面是一个实际的例 子: 复制代码 代码如下: /* Person.class.php */<?phpclass Person {var $name, $age;f

  • PHP的autoload机制的实现解析

    一.autoload机制概述 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利.这也是OO设计的基本思想之一.在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可. 下面是一个实际的例子: 复制代码 代码如下: /* Person.class.php */ <?php class Person { var $name, $age; function __cons

  • thinkphp autoload 命名空间自定义 namespace

    使用thinkPHP过程中,一些自定义的类库和第三方类库需要找一个合适的位置放置,放到系统默认的org文件夹感觉不太好,破坏了thinkPHP的原生目录. 就看了一下官方手册,可以在模块或者应用的配置文件里自定义类库的命名空间. 不过使用中需要注意的是,你的自定义的命名空间名称需要和你的文件夹名称相对应,不能更改. 然后测试一下 以上所述就是本文的全部内容了,希望大家能够喜欢.

  • PHP函数spl_autoload_register()用法和__autoload()介绍

    __autoload()的用法就不再说了,以前已经在我的WEB开发笔记中说过.PHP __autoload函数(自动载入类文件)的使用方法, 原文地址:http://www.jb51.net/article/29625.htm . 说一说,spl_autoload_register()的用法吧,很简单,可以这样理解,就是声明一个自定义__autoload(),你可以是A函数,也可以是B函数,想怎么样就怎么样,函数体的写法,当然要和__autoload()一样就OK 了. 当PHP找不到类文件会调

  • php中autoload的用法总结

    PHP中提供了Autoload来帮助我们方便的进行文件的包含,但是autoload并非想象的那样能够处理所有的情况,今天就来记录一下前几天遇到的autoload存在的一些问题. 为什么要使用 Autoload 在PHP中使用类时,我们必须在使用前加载进来,不管是通过 require 的方式还是 include 的方式,但是会有两个问题影响我们做出加载的决定. 首先是不知道这个类文件存放在什么地方,另外一个就是不知道什么时候需要用到这个文件.特别是项目文件特别多时,不可能每个文件都在开始的部分写很

  • PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)

    举例来说,假设我们的项目想要使用 monolog 这个日志工具,就需要在composer.json里告诉composer我们需要它: { "require": { "monolog/monolog": "1.*" } } 之后执行: php composer.phar install 好,现在安装完了,该怎么使用呢?Composer自动生成了一个autoload文件,你只需要引用它 require '/path/to/vendor/autoloa

  • PHP文件缓存smarty模板应用实例分析

    本文实例分析了PHP文件缓存smarty模板应用.分享给大家供大家参考,具体如下: 一.使用缓存 要开启smarty的缓存,只需将caching设为true,并指定cache_dir即可. 使用cache_lefetime指定缓存生存时间,单位为秒 要对相同页面生成多个不同的缓存,在display或fetch中加入第二参数cache_id,如: $smarty->display('index.tpl',$my_cache_id); 此特性可用于对不同的$_GET进行不同的缓存   二.清除缓存

  • php中spl_autoload详解

    SPL有两个不同的函数 spl_autoload, spl_autoload_call,通过将autoload_func指向这两个不同的函数地址来实现不同的自动加载机制. spl_autoload 是SPL实现的默认的自动加载函数,它的功能比较简单.它可以接收两个参数,第一个参数是$class_name,表示类名,第二个参 数$file_extensions是可选的,表示类文件的扩展名" title="扩展名">扩展名,可以在$file_extensions中指定多个扩

  • PHP中__autoload和Smarty冲突的简单解决方法

    本文讲述了PHP中__autoload和Smarty冲突的简单解决方法.分享给大家供大家参考,具体如下: 一.问题: 最近,在项目中发现,PHP 的 __autoload 方法失效了.调试了好久,百思不得其解,查了下资料才知道原来是 Smarty 的原因.新版的 Smarty 改变了autoload的方式. 二.解决方法: 在 Smarty 的包含类文件后加一段代码,spl_autoload_register("__autoload"); 如下: <?php define('RO

  • PHP __autoload函数(自动载入类文件)的使用方法

    这也是OO设计的基本思想之一.在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可.下面是一个实际的例子: 复制代码 代码如下: class ClassA{ public function __construct(){ echo "ClassA load success!"; } } //定义一个类ClassA,文件名为ClassA.php class ClassA{ public function __construct(){ echo &

  • PHP中spl_autoload_register()和__autoload()区别分析

    关于spl_autoload_register()和__autoload(),相信大多数都会选择前者了? 看两者的用法: 复制代码 代码如下: //__autoload用法function __autoload($classname){    $filename = "./class/".$classname.".class.php";    if (is_file($filename))    {        include $filename;    }} /

  • PHP之autoload运行机制实例分析

    本文较为深入的分析了PHP的autoload运行机制.对于深入理解PHP运行原理有一定的帮助作用.具体分析如下: php实现autoload有两种方法: 1.拦截器__autoload() 2.设置全局变量函数指针autoload_func为指定函数.通常在c扩展中使用 本质上前者还是通过后者实现的. 分析过程,PHP5.3.6源码: =>Zend/zend_vm_def.h  1894行 ZEND_VM_HANDLER(109,ZEND_FETCH_CLASS,... =>zend_exec

随机推荐