当前位置: 首页 > news >正文

PHP-深入学习Smarty

本文中的边界标签分别为"<{"和"}>"

start-12, 都是静态模板中的内容, 即使函数也只是模板中的标签或者变量调解器;

13-end, 都是smarty对象的方法和属性

表达式中不能乱使用空格

1.注释

  <{* 我是注释内容 *}> //相当于PHP的注释, 而不是HTML文件的注释, 所以不会出现在页面源码中

2.函数

  每一个smarty标签输出一个变量或者调用某种函数(像include, foreach, section等均可认为为函数)

  <{ funcname varname1="aaa" varname2="bbb" }>

  <{ assign var="name" value="$firstname $lastname" }>

3.函数参数

  大部分函数都有自己的属性(参数), 以便说明和修改函数进行操作

  静态数值、布尔值(true, false, yes, no)以及变量做为参数值不需要加引号, 字符串必须加引号

  <{ include file="abc.html" }>

  <{ include file=$filename }>

  <{ funcname display_days=yes }>

4.函数参数为字符串时引号内变量的嵌入

  正常情况下(不会引起冲突)可以直接嵌入

  <{ func var="Hello $name !" }>

  <{ func var="Hello $names[0] !" }>

  而<{ func var="Hello $names.first_name" }> //则只会解释$names而不会解释$names['first_name'], 因为"."可以认为是边界符(同空格等)

  冲突情况下用"`"(与~同键)

  <{ func var="Hello `$names.first_name`" }> //会解释$names['first_name']

  <{ func values="one, two, `$smarty.config.val`" }>

  <{ func  }>

 5.数学运算

  <{ $num+1 }> //$num和加号"+"及1之间不能使用空格

  <{ $num1*$num2 }>

  <{ if $num%2 }>

6.索引数组, 关联数组, 对象的使用

  <{ $names.firstname }> //关联数组

  <{ $names[0] }> //索引数组

  <{ $person->name }> //对象

7.导入配置文件的变量

  配置文件my.conf

    color = "#EEEEEE";

  导入<{ config_load file="my.conf" }>

  使用<{ #color# }>或者<{ $smarty.config.color }>

8.保留变量

  $smarty.[get|post|request|cookies|session|server|env].id 请求时的变量

  $smarty.now 当前时间戳 <{ $smarty.now | date_format: "%Y-%m-%d"}>

  $smarty.const 自定义常量

  $smarty.config 在使用config_load后导入的配置文件内容可以用此变量使用

  $smarty.section、$smarty.foreach 在使用smarty循环时用到的变量

  $smarty.template 当前使用的模板名称

9.变量调解器

  类似于Linux中的管道符, 后接命令(或函数)处理, 但与Linux不同的是变量调解器参数的使用方法为用冒号间隔参数

  注意: 如果你给数组变量应用单值变量的调节,结果是数组的每个值都被调节。如果你只想要调节器用一个值调节整个数组,你必须在调节器名字前加上@符号。例如: {$articleTitle|@count}(这将会在 $articleTitle 数组里输出元素的数目)

  capitalize: 首字母大写 <{ $title|capitalize }>

  count_characters: 计算字符数 参数true|false用来确定是否计算空格数 <{ $title|count_characters:true }>

  count_paragraphs: 计算段数 <{ $content|count_paragraphs }>

  count_sentences: 计算句数 <{ $content|count_sentences }>

  count_words: 计算单词数 <{ $content|count_words }>

  cat: 连接字符串 <{ $title|cat " Dota" }>

  date_format: 把时间戳格式化为日期形式 <{ $smarty.now|date_format:"%Y-%m-%d"}> 此参数与PHP或Python的strftime函数相同, 与date不同

  default: 为变量设置一个默认值, 当变量为空或者未设置的时候将赋值为默认值 <{ $title|default: "No title" }>

  escape: html转码, url转码; 参数为要转码类型, 包括html, htmlall, url, quotes, hex, hexentity等, 默认为html <{ $url|escape:"url" }>

  indent: 缩进 两个非必需参数, 第一个为缩进多少个字符, 第二个字符表示用什么字符进行缩进 <{ $content|indent:1:"&nbsp;" }>

  lower: 小写 <{ $title|lower }>

  upper: 大写 <{ $title|upper }>

  nl2br: 同PHP的nl2br函数, 把换行符转为<br /> <{ $content|nl2br }>

  regex_replace: 正则替换 两个必需参数, 一个为正则, 一个为要替换为的字符串 <{ $title|regex_replace:"/[\r\t\n]/":" " }>

  replace: 相当于PHP的str_replace <{ $title|replace:"John":"Nali" }>

  spacify: 插空, 是一种在字符的每个字符之间插入空格或者其他的字符(串), 默认参数为空格 <{ $title|spacify:"-"}>

  string_format: 相当于sprintf <{ $title|string_format:"%.2f" }>

  strip: 用一个空格或给定字符替换所有重复空格, 换行符以及制表符等, 默认为用空格替换 <{ $title|strip:"&nbsp;" }>

  strip_tags: 去除html标签, 无参 <{ $title|strip_tags }>

  truncate($length = 80, $suffix = "...", $limit = false): 截取字符串 <{ $title|truncate:30:"--":true }>

  wordwrap($width = 80, $used_wraper = "\n", $limit = false): 长字段自动换行 <{ $title|wordwrap:20:"<br />\n" }>

10.组合修改器

  把修改器组合起来使用 <{ $title|upper|truncate:20 }>

11.内建函数

  是smarty自带的内建函数, 是模板语言的一部分, 自定义函数与内建函数不可重名, 也不可以修改内建函数

  captrue: 捕获模板输出的数据, 并将其存储到一个变量里面, 而不是输出到页面, 任何在 <{ captrue name="mycap" }>和<{ /capture }>之间的数据将被存储到$mycap中, 变量名由name指定, 如果没有指定name则使用$default, 不能嵌套!在模板中使用$smarty.capture.mycap访问该变量

  config_load: 用于从配置文件中加载变量 <{ config_load file="config.php" }>

  foreach: 参数from-待循环数组 key-当前处理元素索引或者键名 item-当前处理元素 name-该循环的名称(用来访问该循环);其中from和item为必须 <{ foreach from=$names key=k item=name }>name:<{$name}><br /><{/foreach}>

  include: 参数file-路径相对于template_dir要包含的文件名, assign-模板的输出内容 这样就不会直接显示了 var-自定义传入变量以供要包含模板内部使用, 若与内部变量冲突则此变量有效 <{ include file="public.html" js="index.js" }>

  include_php: 同include使用方法, 但拥有参数once, 而无自定义参数列表 <{ include_php file="/htdocs/php/index.php" }>

  insert: 同include, 但是不论是否已经开启缓存, insert的内容都不会被缓存 参数:name-指定函数名称 之后会与"insert_"结合为insert_函数名,  也可传入自定义参数, assign-同include; script-插入函数前需要先包含的php脚本名称 <{ insert name="getAd" aid="1234" script="a.php" }>

  if elseif else: 修饰词 eq, ne, neq, gt, lt, lte, le, gte, ge, is even, is odd, is not even, is not odd, not, mod, div by, even by, odd by, ==, !=, <, >, <=, >=, &&, ||, !; 这些修饰词必须和变量或者常量用空格隔开 <{ if $name == "John" }>

  ldelim|rdelim: 代表定界符常量 {ldelim}在此文代表"<{", {rdelim}在此文代表"}>"

  literal: 不会解析其内文本 <{ literal }><script>function abc{alert("bcd");}</script><{ /literal }>

  php: 不赞成使用

  section, sectionelse: 参数name-键名, loop-要循环的数组, start-循环其实索引位置, step-循环步长(如果步长为负数, 则从后向前遍历), max-循环最大执行次数, show-是否显示该循环 必须指定name和loop <{ section name=k loop=$names }>{$names[k]}<br /><{ /section }> sectionelse表示数组为空时执行的操作

  strip: 去除字符串内任何首尾空格和回车, 会把html标签外无空格连起来<{ strip }><table border=0> <tr> <td> </td>  </tr> </table> <{ /strip }>

12.自定义函数

  assign: 赋值 <{ assign var="name" value="John" }>

  counter: 开始一个计数器 name-计数器名称 start-开始的数值 skip-步长 direction-方向(增减) print-本次调用本函数是否输出 assign-将值赋值给变量 <{ counter start=0 skip=1 print=true assign="c" }>

  cycle: 轮转(交替)使用一组值 name-名称 values-轮转的值, 默认以","分开 print-是否输出 delimiter-轮转的值的分隔符 assign-把值赋值给指定变量 <tr color="<{ cycle value="#000 , #FFF" }>"></tr>

  fetch: file-包含的文件名 assign-赋值给指定变量 <{ fetch file="a.html" assign="abc" }>

  其他的用来输出HTML的标签函数不如直接使用静态HTML

13.变量

  $template_dir-模板文件存放目录 $compile_dir-编译文件存放目录 $config_dir-配置文件存放目录 $cache_dir-缓存文件存放目录 #这些目录若为相对目录则是针对当前执行的php文件的相对目录

  $pugins_dir-插件文件存放目录(是一个数组) 默认是在smarty目录下的plugins目录, 如果指定了一个相对路径, smarty会首先在smarty目录下寻找, 然后到当前工作目录下寻找, 继而到php的include_path中寻找

  $caching-是否开启缓存  $cache_lifetime-缓存文件生存时间(-1永不过期, 0总是重新生成)

  $force_compile-强迫重新进行编译, 重新生成缓存

  $default_tempate_handler_func-当找不到模板文件时自动调用的方法

14.smarty对象的方法

  append($name, $value): 对象的$_tpl_vars数组中如果有$name键则向$_tpl_vars[$name]数组中添加一个值$value, 若$value为数组则合并

  append_by_ref($name, $value): 与append不同的是添加的变量的引用, 避免了内存的拷贝

  assign($name, $value): 使$_tpl_vars[$name]=$value

  assign_by_ref($name, $value): 同append_by_ref原理

  clear_all_assign(): 清除所有赋值, 即把$_tpl_vars设为空数组

  clear_assign([$string|$arr]): 清除指定赋值

  clear_all_cache(): 清除所有缓存文件

  clear_cache($tpl[, $cache_id][, $compile_id][, $expire_time]): 删除指定缓存文件

  clear_compile_tpl([$tpl]): 删除指定或者所有模板的编译文件

  clear_config([$con]): 删除指定或者所有配置变量

  config_load($file[, $paragraph]): 导入一个配置文件或者一个配置文件的其中一段

  display($file[, $cache_id][, $compile_id]): 包含并解析$template_dir目录下的$file模板 其内部执行其实调用的是fetch方法 也可以使用绝对路径"file:C:/www/a.html"作为$file的值

  fetch($file[, $cache_id][, $compile_id][, $display = false]): 包含进并解析一个模板内容并赋值给变量, 默认不输出

  get_config_vars([$var]): 获取指定或者所有配置变量值, 此方法用在config_load()之后

  get_template_vars([$var]): 获取指定或者所有已赋值的模板变量的值, 实际是返回$_tpl_vars数组

  is_cached($file[, $cache_id]): 判断指定缓存是否存在

  register_block(自定义块标签, 对应函数): 自定义标签是成对出现的, 对应函数有三个参数$params-对应标签中的参数, $content-对应加载快标签开始和结束之间的内容, &$smarty-不用管 然后在函数中return处理后的数据; 也可以在plungins下自定义block.快标签名称.php, 里面方法名为smarty_block_快标签名称($params, $content, &$smarty)

  register_function(自定义函数名, 对应函数): 自定义函数名是单出现的, 对应函数有两个参数$params, &$smarty, 可以用extract($params)进行拆分, 也可以通过关联键名来使用, 最后return处理后的数据

  register_modifier(自定义调解器名, 对应函数): 自定义调解器名是放在管道符之后的, 对应函数有无限个$str-要处理的数据, $var1...参数等, 最后做return处理

  register_object(自定义对象名, 对应对象): 可以用assign一个对象实现, 但本函数可以实现<{myobj->func var1="name" var2="sex"}>此类用户自定义函数, 而用assign也可以<{$myobj->func($var1, $var2)}>实现

  register_[pre|post|out]filter(自定义过滤器函数): 自定义过滤器函数有两个参数 $str-需要过滤的字符串(模板内容), &$smarty; 此函数对模板进行预处理过滤, 提交过滤, 输出过滤

  register_resource(): 注册资源, 暂缺

15.缓存

  设置生存时间$cache_lifetime 值-1表示永久缓存 0表示不缓存 2表示缓存两秒

  为指定模板指定生存时间 设置$caching=2; 而后设置$cache_lifetime为想要的时间;

  $force_compile 强制重新编译生成缓存

  is_cached()用来测试一个模板是否有有效的缓存

  内建函数insert的不能被缓存

  加入$cache_id生成多个模板缓存(可以用来缓存指定id的news或者用户信息等)

  

相关文章:

  • 一个诡异的网络问题追踪
  • cocos2d-x---CCLabelTTF加载字体库
  • 为什么rsync能够快速删除400000文件?
  • 全键盘操作Windows
  • Android中的后台邮件发送
  • 在Eclispe中新建了一个web项目,没有出现web.xml的原因
  • 样式规则的选择器
  • PostgreSQL安装详细步骤(windows)
  • c++策略模式(Strategy Method)
  • Data Domain和Avamar到底有什么不同呢?
  • pl/sql programming 03 语言基础
  • 【mysql基础】mysql学习笔记-2-存储引擎
  • 如何形成高端战力
  • java acm输入输出
  • Exchange210中的Rpc Client Access server属性
  • 分享一款快速APP功能测试工具
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 自己简单写的 事件订阅机制
  • 03Go 类型总结
  • Android系统模拟器绘制实现概述
  • JavaScript新鲜事·第5期
  • java多线程
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Linux后台研发超实用命令总结
  • Netty源码解析1-Buffer
  • PHP变量
  • Spring Cloud中负载均衡器概览
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 程序员该如何有效的找工作?
  • 初识 webpack
  • 搭建gitbook 和 访问权限认证
  • 记一次和乔布斯合作最难忘的经历
  • 巧用 TypeScript (一)
  • 小程序测试方案初探
  • 栈实现走出迷宫(C++)
  • 如何在招聘中考核.NET架构师
  • ​Spring Boot 分片上传文件
  • #QT项目实战(天气预报)
  • ..回顾17,展望18
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET多线程执行函数
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET中 MVC 工厂模式浅析
  • ::before和::after 常见的用法
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @RequestMapping 的作用是什么?
  • @Transactional 竟也能解决分布式事务?
  • []sim300 GPRS数据收发程序
  • [android] 天气app布局练习
  • [Angular 基础] - 指令(directives)
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [dart学习]第四篇:函数