16.PHP的模板引擎Smarty(上)

Smarty模板引擎

Smarty模板引擎是一个PHP模板引擎,是一个从应用程序中剥离表现层的工具,是一种从程序逻辑层(PHP)抽出外在(HTML/CSS)描述的php框架,即分开了程序逻辑和外在的内容

安装Smarty及初始化

  • 下载Smarty之后,将libs文件夹放在应用程序根目录
  • 使用require()语句,将libs文件夹中的Smarty.class.php文件导入进来
<?php
require("./libs/Smarty.class.php");

#创建一个实例
$smarty=new Smarty();
?>
  • 初始化Smarty类库的默认设置

image-20201106091233201

image-20201106091331139

  • 创建一个文件,用于集中设置Smarty的各种属性,文件名称为init.inc.php
<?php
require("./libs/Smarty.class.php");

#创建一个实例
$smarty=new Smarty();

$smarty->setTemplateDir("./template/");
$smarty->setCompileDir("./template/template_c/");
$smarty->setPluginsDir("./template/plugins/");
$smarty->setCacheDir("./template/cache/");
$smarty->setConfigDir("./template/configs/");

$smarty->caching=false;
$smarty->cache_lifetime=60*60*24;
$smarty->left_delimiter='<{';
$smarty->right_delimiter='}>';

?>
  • 创建一个模板文件test.htm
<!DOCTYPE html>
<html>
<head>
    <title>${title}</title>
</head>
<body>
    ${content}
</body>
</html>
  • 创建模板的程序逻辑
<?php

require("init.inc.php");

#替换变量
$smarty->assign("title","Smart实例");

#替换变量
$smarty->assign("content","hello,siqu");

#调用模板,显示结果
$smarty->display("test.htm");

?>

Smarty的基本应用

  • assign()方法

可以传递一对名称/数值对,也可以传递相关联的数组

image-20201106095535722

  • display()方法

在基于Smarty的脚本中必须使用这个方法,并且只能使用一次,因为它负责获取和显示由Smarty引擎引用的模板

image-20201106095712406

  1. 第二个参数可选,指定缓存标识符的名称
  2. 第三个参数在维护一个页面的多个缓存时使用

Smarty模板设计的基本语法

模板中的注释

image-20201106100033244

模板中的复杂变量

  1. 可以使用数字或非数字索引,使用PHP原生语法风格引用索引数组
  2. 在模板中访问关联数组,可以使用PHP原生语法风格,也可以使用”.“来进行访问
  3. 在模板中使用PHP分配的变量时,可以通过”->“后接指定的属性名或者方法的方式访问PHP分配的成员,和PHP中访问对象的成员或者方法完全一致
  • 可以在模板中使用表达式,甚至是函数
    <{$x+$y}>
    <{$lenth=strlen($str)}>
    <{$lenth}>
  • smarty可以识别嵌入在双引号当中的变量,只要此变量只包含数字、字符、下划线和[],对于其他的符号,必须使用两个反引号“””来包裹住
  • 模板中可是使用可变变量
$foo_{$bar}

模板中的函数应用

  1. 直接在模板中调用PHP中的函数
<?php

require("init.inc.php");

function myfun(){
    return date("H:i:s");
}

$smarty->display("test.htm");

?>
<!DOCTYPE html>
<html>
<head>
    <title>函数应用</title>
</head>
<body>
    <{myfun()}>
</body>
</html>
  1. 调用smarty内置函数,或者插件时,使用标签的方式调用函数,标签名相当于函数名,标签属性,相当于是函数参数
{functname atrr1="value" atrr1="value"}
  1. 块函数应用,需要使用闭合标签

image-20201106102600226

属性

Smarty函数的属性,相当于是函数的参数,静态属性不需要添加引号

image-20201106102724032

忽略smarty引擎解析

  • 如果“{”和“}”之间有空格,那么{}里面的内容会被忽略解析
  • 使用内置的{literal}{/literal}块函数,块中的内容会被smarty忽略解析

Smarty模板中的变量应用

  • 使用assign()函数将PHP中的变量分配到Smarty模板当中
  • 从配置文件中读取变量
  • 在模板中使用保留变量,直接在模板中访问请求变量(get、post、cookies、session、env),这些变量都保存在{$smarty}数组中
<?php

require("init.inc.php");

session_start();

$_SESSION["name"]="siqu";

$smarty->display("test.htm");

?>
<!DOCTYPE html>
<html>
<head>
    <title>函数应用</title>
</head>
<body>
    <{$smarty.session.name}>
</body>
</html>

以下是保留变量表

image-20201106104342556

image-20201106104359317

在Smarty模板中的变量调解器

变量调节器是在变量输出之前,对变量进行相应的调整

变量调解器的语法

image-20201106105313201

在使用调解器之前,需要先设置或者添加插件目录配置,需要在init.inc.php中进行修改,添加libs文件下的plugins文件夹

<?php

require("init.inc.php");

$smarty->assign("name","siqu");
$smarty->display("test.htm");

?>
<!DOCTYPE html>
<html>
<head>
    <title>调解器应用</title>
</head>
<body>
    <{$name|upper}>
</body>
</html>

内置的调解器

image-20201106112142680

image-20201106112154696

自定义变量调解器插件

  1. 使用registerPlugin()方法

注册一个名为mystyle的调解器,主要有三个参数,变量名、颜色和大小

'.$var.'';
}

#替换变量
$smarty->assign("name","siqu");

#注册调解器,第一个参数modifier,第二个参数调解器名称,第三个参数要执行的PHP函数
$smarty->registerPlugin("modifier","mystyle","test");

$smarty->display("test.htm");

?>
<!DOCTYPE html>
<html>
<head>
    <title>函数应用</title>
</head>
<body>
    <{$name|mystyle:"red":20}>
</body>
</html>

image-20201106115333582

  1. 使用文件插件的形式添加调解器
  • 注意调解器所在的位置,最好使用$smarty->addPluginsDir( )添加一个自己的调解器插件目录

  • 文件命名为:modifier.修改器名称.php

  • 声明修改器的插件需要使用:smarty_modifier_修改器名称()来进行声明

  • 参数规则:第一个参数固定为变量,修改器要用到的参数,从第二个参数开始

文件:modifier.mystyle.php

<?php
    function smarty_modifier_mystyle($var,$color,$size){
        return '<font color="'.$color.'" size="'.$size.'">'.$var.'</font>';
    }
?>

运行效果与上例一致

Smarty模板中自定义函数

smarty中的函数能够想标签一样直接使用,简单方便,并且能够快速应用,简化重复代码

为smarty模板扩充函数插件

只需要使用registerPlugin()注册即可,在第一个参数使用function进行注册,第二、第三个参数与注册修改器一致,在函数声明上,模板中传递的所有参数都在第一个参数当中的关联数组中,第二个参数是用来接收自动传入的Smarty对象

<?php

require("init.inc.php");

function printName($params,$smarty){
    return "hello,".$params["name"];
}

$smarty->registerPlugin("function","printname","printName");

$smarty->display("test.htm");

?>
<{printname name="siqu"}>

利用文件插件的方式注册插件,在插件目录中命名规则为function.函数名.php,函数声明使用smarty_function_函数名($params,$smarty)

下面是文件function.printname.php

<?php
    function smarty_function_printname($params,$smarty){
        return "hello,".$params["name"];
    }
?>

下面是index.php

<?php
require("init.inc.php");

$smarty->display("test.htm");

?>

为smarty模板扩充块函数插件

块函数的形式是这样的:{func}…{/func}。函数会被Smarty调用两次,一次是在开始标签,另一次是在闭合标签,两种方式定义

  • 使用registerPlugin进行定义,第一个参数使用block
  • 使用block.块函数名.php,的结构进行定义,函数声明用smart_block_块函数名($params,$content,$smarty,&$repeat),只有块函数的开始标签具有属性
  1. 所有参数都在$params这个关联数组当中
  2. $content变量值取决于你的函数是被开始标签调用还是被闭合标签使用,假如是开始标签,则为NULL,如果是闭合标签,则$content变量值为模板块的内容,所接受到模板的输出而不是模板资源
    1. &$repeat参数通过引用传递给函数执行,并为其提供控制块显示多少次的可能性。在首次调用块函数(块开始标签)时&$repeat变量为true,在随后的所有块函数(闭合标签)调用中其值为false,函数每次执行返回的&$repeat值为true时,{true}…{/true}之间的内容会被求值,同时参数$content里的新块内容会再次调用执行函数(运行方法有点类似于递归函数),如果你嵌套了块函数,可以通过$smarty->_tag_stack变量访问找出父块函数
© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
四曲的头像-四曲博客

昵称

取消
昵称表情代码图片