smarty3.1.30 模板引擎的使用
来源:互联网 发布:php周末培训班 编辑:程序博客网 时间:2024/06/05 08:41
模板引擎简介
模板引擎就是将用户界面(html)和程序代码(php)分离的一种解决方案。
eg:
没有使用第三方库,使用PHP内置函数,只是简单的字符串处理。
tmp.html文件
<html> <head> <title>PHP函数分离代码和界面文件</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <div style="color:red;font-size:20px;">{welcome}</div> <br><hr><br> <p>{hang}</p> </body></html>
index.php文件
<?php $str = file_get_contents("./tmp.html"); $str = str_replace('{welcome}',"欢迎",$str); $str = str_replace('{hang}',"你",$str); echo $str;
smarty特点
- 速度快:相对于其他模板引擎,smarty可以提供更快的相应速度
- 编译型:模板和PHP文件混排编译
- 缓存技术:编译生成的文件在一定缓存时间内生成html静态文件,当我们访问模板时将直接转向静态html文件
- 插件技术:可以自定义函数,外来插件
- 强大的表现能力
smarty下载与文件介绍
下载smarty
文件解压后:
demo:系统提供的实例文件
libs:核心文件
– plugins:自定义插件文件夹
– sysplugins:系统插件文件夹
– debug.tpl:调试模板
– Smarty.class.php:Smarty3.0中的核心类文件
– SmartyBC.class.php:向后兼容类,Smarty2.0版本
smarty使用
创建文件目录,目录树在后图有
templates:定义默认模板文件夹
templates_c:定义编译目录
cache:定义缓存文件夹
configs:定义默认配置文件夹缓存
$smarty->caching = true;
// 开启缓存
$smarty->cache_lifetime = 120;
// 缓存文件时间调试
$smarty->debugging = true;
// 开启调试
初步使用举例 eg,只添加了两个文件:
index.php
<?php require './smarty/Smarty.class.php'; // smarty 相关配置 $smarty = new Smarty(); // $smarty->debugging = true; $smarty->caching = true; $smarty->cache_lifetime = 10; if($smarty->isCached("index.tpl")) { $smarty->display("index.tpl"); // display 可以在脚本中多次使用,一次展示多个模板 return; } // 传值到模板 $smarty->assign("title","welcome"); $smarty->assign("hang","你"); // 显示模板 $smarty->display("index.tpl");
index.tpl
<html> <head> <title>Smarty 初步</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <div style="color:red;font-size:20px;">{$title}</div> <br><hr><br> <p>{$hang}</p> </body></html>
文件结构
恭喜,已入门,是时候表演真正的技术了
smarty 重要的就是Smarty.class.php文件,建议阅读一遍,查看相关属性方法
smarty 相关属性和方法
- 左右定界符 left_delimiter 和 right_delimiter
- 相关方法
2.1$smarty->assign("title","welcome");
// 传welcome 到模板中 替换title
2.2$smarty->display("index.tpl");
// 显示并输出相应的模板,目录是默认模板配置目录
2.3 - 修改默认4个文件夹目录
3.1$smarty->setTemplateDir("./templates");
// 修改默认模板文件夹
3.1$smarty->setCompileDir("./templates_c");
// 修改默认编译文件夹
3.1$smarty->setConfigDir("./configs");
// 修改默认配置文件夹
3.1$smarty->setCacheDir("./cache");
// 修改默认缓存文件夹 - 调试
$smarty->debugging = true;
// 开启调试
编程中的现实问题
注释代码
{* 这里是smarty注释 *}<br><!-- 这里是HTML注释 --><p>{$hang}</p>
复杂变量(数组、多维数组、对象)的使用
// smarty文件$smarty->assign("array_yi", array("jh","hn","dy"));$smarty->assign("array_er", array(array(0,1),array("00","11"),array("000","111")));$smarty->assign("contacts", array(array("phone"=>"phph"),array("phone" => "555")));class Person{ private $name; function __construct($name) { $this->name = $name; } public function speak() { echo $this->name.'在说话...'; }}$smarty->assign('user',new Person("jh"));// 模板文件<p>{$array_yi[2]}</p><p>{$array_er[2][1]}</p><p>{$contacts[1]["phone"]}</p><p>{$user->speak()}</p>// 结果dy111555jh在说话...
模板文件中自建临时变量
{assign var='temp' value='声明一个temp变量并赋值'}{$temp}{$temp = "另一种方法"}{$temp}{$temp = array("jh","声明数组")}{$temp[1]}// 结果声明一个temp变量并赋值 另一种方法 声明数组
从配置文件中读取变量 - 配置文件在config目录下
// 配置文件name = Welcome to Smarty! // 全局变量[jubu]jubu_name = jubu_var // 局部变量// 模板文件使用配置文件变量{config_load file = "config.txt"} // 全局变量使用{$smarty.config.name}{config_load file = "config.txt" section="jubu"} // 局部变量使用{$smarty.config.name}{$smarty.config.jubu_name}
模板使用PHP文件的函数 - 自定义函数
// index.phpfunction hehe(){ return "hehehehe";}// 模板文件{hehe()}
smarty预保留变量 - 超全局变量
{$smarty.template} {* 模板的名称 *}{$smarty.get.page}{* 相当于 $_GET['page'] *}{$smarty.post.page}{* 相当于 $_POST['page'] *}{$smarty.config} {* 读取配置文件里变量,后面加变量名。等效{#变量名#} *}{$smarty.cookies.username}{* 相当于 $_COOKIES['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.current_dir} {* 获取当前模板目录 *}{$smarty.version} {* 获取当前Smarty版本 *}{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}
变量调节器(文本格式化)
{$var|capitalize} {* 首字母大写 *}{$var|count_characters:true} {* 字符计数 *}{$var|cat:var2} {* 连接字符串 *}{$var|count_paragraphs} {* 段落计数 *}{$var|count_sentences} {* 句子计数 *}{$var|count_words} {* 计算词数 *}{$var|data_format:"%Y%m%d"} {* 时间格式化 *}{$var|default:"value"} {* 如果变量为空或为定义,那么采用默认值 *}{$var|escape} {* 编译转码 *}{$var|indent:10:"*"} {* 首行缩进,后面的参数表示每个缩进字符要放的字符 *}{$var|lower} {* 字符串小写 *}{$var|nl2br} {* \n转<br/> *}{$var|regex_replace:"/[\t\n]/",""} {* 正则替换 *}{$var|spacify:"^^"} {* 在字符之间插入相应字符如^^ *}{$var|string_format:'%d'} {* 字符串格式化 *}{$var|strip:'*'} {* 去掉重复空格 *}{$var|strip_tags} {* 去除html标签 *}{$var|truncate:30:'...'} {* 字符串截取,注意,优缺点 *}{$var|upper} {* 大写 *}{$var|wordwrap:30:'<br>'} {* 行宽约 *}// 可以自建调节器// 组合调节器{$var|lower|truncate:30|spacify}
smarty 模板内置函数
{debug} 开启调试窗口
捕获一段HTML代码
{capture name="content"}<h1>h1</h1><br><center>center</center>{/capture}{$smarty.capture.content}
foreach - PHP方式
{foreach $array_yi as $key => $val} {$key} {$val}{/foreach}
foreach - smarty语法进行遍历
{foreach from=$array_yi key="key" name="array_yi" item="val"} {$key} {$val}{/foreach}
二维数组循环遍历 - 方式一
{foreach $array_er as $val} {$val[1]}{/foreach}
二维数组循环遍历 - 方式二
{foreach from=$array_er key="key" name="array_er" item="val"} {$val@iteration}{$val[0]}{/foreach}共循环了{$smarty.foreach.array_er.total}次 | {$val@total}次// 内置其他函数{$smarty.foreach.name.index} {* @index 下标0 *} {$smarty.foreach.name.iteration} {* @iteration 迭代(当前是第几次循环),默认从1开始 *}{$smarty.foreach.name.first} {* @first bool当时第一次该值为真 *}{$smarty.foreach.name.last} {* @last bool当时最后一次该值为真 *}{$smarty.foreach.name.show} {* @show 数据显示true显示数据,false不显示数据 *}{$smarty.foreach.name.total} {* @total 循环的总次数 *}
二维数组循环遍历 - 方式三
// name:代表section名称,在循环过程中,会作为索引,必选// loop:代表循环数组,由其来确定循环的次数,必选// start:默认从第几个元素开始遍历// step:每次循环次数,默认是1// max:最大循环次数{section name=索引 loop=循环数组 start=开始(0) step=步阶(1) max=最大循环次数}{/section}// 举例{section name="index" loop=$array_er} {$array_er[index][0]} {$array_er[index][1]}{/section}
fetch 载入文件/引入文件到当前文件,并赋值给变量
{fetch file="./configs/other.config" assign="ddd"}{$ddd}// 结果 => 输出改文件所有信息
include 模板
{include file='other.html'}
include_php 文件
{include_php file='other.php'}
if elseif else
{if empty($title)}have title{elseif $title}title is {$title}{else}no title{/if}
literal 字符原样输出,不解析
{literal} {$title}{/literal}// 结果{$title}
strip 字符原样输出,不解析
{strip} ....{/strip} // 功能及应用:去除任何位于{strip}{/strip}标记数据中记录的首尾空格和回车, // 可以保证模板容易理解且不用担心多余的空格导致问题
counter - 进行计数
cycle 实现轮显效果
{html_image file=”pumplink.png”} 引用一张图片
{html_table loop=$data cols=4 table_attr=”border=0”} 循环输出数组到一张表
html_checkboxes 、 html_options 、 html_radios 作为拓展需要使用去查询
编写PHP程序(非模板程序)上面要注意的哪些 和 辅助开发函数、变量
SMARTY_DIR 常量 = Smarty.class.php文件的路径
assign 分配变量到模板文件
assignByRef 分配变量到模板文件(引用)
$hang = "你";$smarty->assign("hang",$hang);$hang = "我们";// 结果你$hang = "你";$smarty->assignByRef("hang",$hang);$hang = "我们";// 结果我们
append 追加数据到数组,过程分为两步
第一是追加数据到数组中
第二分配变量到模板文件中(也就不需要assign赋值了)
appendByRef 追加元素地址到数组中
clearAllAssign 清除所有赋值变量
clearAssign 清除指定变量的值
clearCache 清理缓存
configLoad 载入配置文件
clearConfig 清除配置文件信息
display 执行输出并显示指定页面
fetch 载入文件到字符串 - 不同于模板中的fetch函数
// 把结果生成临时html文件存储起来 = 模拟静态页 = 存储静态页require './smarty/Smarty.class.php';$smarty = new Smarty();$smarty->assign("title","welcome");$str = $smarty->fetch("index.tpl");file_put_contents('./'.time().'.html', $str);
// 判断模板文件是否存在if($smarty->templateExists("index.tpl")){ $smarty->display("index.tpl");}else{ trigger_error('没有找到模板文件', E_USER_ERROR);}
// 判断有没有缓存某个文件,如果缓存了就直接输出if($smarty->isCached("index.tpl")){ $smarty->display("index.tpl"); // display 可以在脚本中多次使用,一次展示多个模板}$smarty->clearCache('index.tpl') // 清除指定模板缓存文件$smarty->clearAll() // 清除所有缓存文件
过滤器
如果页面有临时缓存,谨慎使用过滤器
分为三种:Prefilters:预过滤器 、Postfilters:后过滤器 、Outputfilters:输出过滤器
eg:
$smarty->assign("guolv","fff333 fff222 fff111");function f3($data){ file_put_contents('./'.time().'.html', $data); return str_replace("fff333" , "333fff" , $data);}// 输出过滤器$smarty->registerFilter('output', 'f3' );
缓存
设置
$smarty->setCacheDir($cache_dir) // 设置缓存目录,不设置默认cache文件中$smarty->caching=true // 开启缓存机制caching=true,默认为false$smarty->cache_lifetime = 120; // 缓存时间,单位为秒
优势
1、速度要更快
2、减少服务器I/O开销,减小服务器的压力
3、减小对服务器数据库的压力
缓存在什么时候会重新生成
1、时间过期
2、缓存被删除
3、编译文件改变
4、模板文件改变
检测模板有没有被缓存
if($smarty->isCached("index.tpl")){ $smarty->display("index.tpl");}
删除缓存的方式
$smarty->clearCache('tpl.tpl') // 清除指定模板缓存文件$smarty->clearAll() // 清除所有缓存文件// 数据库的增删改之后,就要清除该缓存// update后要清除的缓存$smarty->clearCache("index.html"); //清除浏览缓存$smarty->clearCache("edit.html",$_POST['id']); //清除修改表单缓存// 多级缓存if(!$smarty->isCached("stu/edit.html",$_GET['id'])){ $stu = $mod->find($_GET['id']); $smarty->assign("data",$stu);}$smarty->display("stu/edit.html",$_GET['id']);
模板中局部缓存 (添加true参数)
// 方法一 , 刷新页面会提示,$smarty->assign("linshi","linshi_huancun",true);{if empty($linshi)}no{else}yes-{$linshi}{/if}// 方法二 , 刷新页面会提示,$smarty->assign("linshi","linshi_huancun",true);{nocache} {if empty($linshi)} no {else} yes-{$linshi} {/if} 这一块会缓存,不会缓存上面的变量{/nocache}
单页面多缓存
当访问某个页面 news.php?id=5 时,第一次会查询数据库并缓存,之后就直接显示缓存文件的内容,减小服务器、数据库压力// 只需要在display后面跟上id属性$smarty->display("index.tpl",$_GET['id']); // 结果会在cache文件夹下,会根据id值多生成不同的缓存文件
缓存集合
$smarty->display("index.tpl",$_GET['id'] . '|' . $_GET['page']); // 结果同单页面多缓存,会在cache文件夹下,根据多个条件生多生成多个的缓存文件比如:45^2^1a4de3f1e073e6a12c90ba07969d236f14.index.tpl.php 45^3^1a4de3f1e073e6a12c90ba07969d236f14.index.tpl.php8^6^1a4de3f1e073e6a12c90ba07969d236f14.index.tpl.php
结束
文章内容是边学习边写示例代码后做的笔记,初次上传,有什么纰漏还望大家指正。
1、参考博客链接 - 参考链接
2、参考博客链接 - 参考链接
最后引用别人的一张图片,感觉还不错
- smarty3.1.30 模板引擎的使用
- Yii2 使用十五 安装smarty3模板引擎及使用
- ecshop手机端模板引擎切换到smarty3.1.30-之改造insert_ads
- ecshop手机端模板引擎切换到smarty3.1.30-之改造楼层
- PHP框架中集成Smarty3模板引擎(一) ------ CakePHP 1.3
- PHP框架中集成Smarty3模板引擎(二) ------ CakePHP 2.0
- PHP框架中集成Smarty3模板引擎(三) ------ CodeIgniter 2.1
- PHP框架中集成Smarty3模板引擎(四) ------ symfony 1.4
- ecshop模板切换到smarty3.1.30
- Smarty模板引擎的使用
- Smarty模板引擎的使用
- freemark模板引擎的使用
- Hogan模板引擎的使用
- thymeleaf模板引擎的使用
- Hogan模板引擎的使用
- 1.smarty3的安装和使用
- Smarty3.1.18的配置和简单使用
- smarty3注册模板插件
- win7如何添加开机启动程序(开机就自动运行打开)
- 用户信息表练习/删除/全选/添加
- Idea和eclipse优缺点
- spring和springmvc整合案例
- drawText()中的文字基线
- smarty3.1.30 模板引擎的使用
- 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
- bzoj 4870: [Shoi2017]组合数问题
- 探秘隐藏在对象中的get和set方法
- Jhipster 的相关链接
- 快速汉化pycharm为中文
- Android自定义文本选中模式(全选、复制,剪切,粘帖)
- 数组中出现次数最多的数字
- 【总结】队内互测 + 近期刷题