在smarty中调用php内置函数的方法


Posted in PHP onFebruary 07, 2013

相信有很多朋友还不知道,可以在smarty模板里调用php的内置函数,我们一起来看看它的用法。

模板书写:
{'param1'|functionName:'param2':'param3'}

php函数原型:
echo functionName('param1','param2','param3');
实例:
{'1234567'|substr:'1':'2'}

下面这个和函数的参数顺序有关系

{'a'|str_replace:'A':'abcd'}

直接延伸到,直接在php中写一个函数调用,不需要注册修改器的.

更深一步的研究:发现数组会出错.

分配了一个数组array给Smarty,假设Smarty的分界符为'{' 和'}'。

在很多资料上都看到,在Smarty中要求数组的长度时,可以用在数组后便加|count的方法调用。即通过{array|count}获得 array的长度。但是今天在写模板时,发现这样得不到数组的长度,而只是得到一个返回的字符串Array。也就是说仅仅是返回了{array}的结果, 而没有返回其array的长度。
查看smarty\plugins文件夹,发现并没有count的相关方法,也就是说,count是直接调用了php中的方法。

后来通过网络上的资料,发现可以在count前面加@,从而正确的获取数组的长度。再进一步查看Smarty的源码,发现Smarty对属性调节器后边的 方法名进行处理时,会对前边加@的进行特殊处理。因此作出判断:在Smarty中的属性调节器中调用php中定义好的函数时,可以通过加@来表示。
1、对类型为数组的方法进行测试时,发现不加@符号都会出错。比如:要对一个数组调用count方法求出数组的长度,就可以这样调用{array|@count},而要对数组调用end方法得出数组的最后一组数据时,则可以通过{array|@end}。
2、在对字符串的相关函数进行测试,发现加不加@都可以正常的调用。
3、其他的尚未认真测试。

对于在smarty中调用复杂的php函数不予鼓励,因为Smarty的本意就是要实现代码和模板分离,不要偏离了人家的设计初衷。

模板书写:
{'param1'|functionName:'param2':'param3'}

php函数原型:
echo functionName('param1','param2','param3');

实例:
{'1234567'|substr:'1':'2'}
下面这个比较怪 和函数的参数顺序有关系
{'a'|str_replace:'A':'abcd'}

Smarty调用自定义函数
调用自定义函数需要用到register_function() 来注册
这里为大家举个例子,常见的字符串切割

函数如下

<?php
function SmartyLen($params){
extract($params);
$len=strlen($text);
$max=$length;
for   ($i=0;$i<$length;$i++){
           $chr=substr($text,$i,1);
           if(ord($chr)>0x80)//字符是中文
           {
               $length++;
               $i++;
      $len--;
            }
}
$str=substr($text,0,$length);
if($len>$max)$str.="...";
Return $str;
}

注册函数
$smarty->register_function('len',"SmartyLen");

模板调用
{len text="测试下" length="1"} //注意这里的text和length其实是函数里的2个参数函数的参数必须要以函数内部变量名一致,其实传回去的的是个数组,在函数里用extract($params);把数组中的变量导入到当前的符号表。

PHP 相关文章推荐
thinkphp3.0 模板中函数的使用
Nov 13 PHP
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
codeigniter自带数据库类使用方法说明
Mar 25 PHP
PHP读取RSS(Feed)简单实例
Jun 12 PHP
ThinkPHP CURD方法之data方法详解
Jun 18 PHP
PHP多维数组转一维数组的简单实现方法
Dec 23 PHP
PHP获取客户端及服务器端IP的封装类
Jul 21 PHP
YII框架中搜索分页jQuery写法详解
Dec 19 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
Dec 14 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
Apr 26 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 PHP
php字符串分割函数explode的实例代码
Feb 07 #PHP
php中使用preg_replace函数匹配图片并加上链接的方法
Feb 06 #PHP
php截取字符串并保留完整xml标签的函数代码
Feb 06 #PHP
php中存储用户ID和密码到mysql数据库的方法
Feb 06 #PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 #PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 #PHP
php中使用addslashes函数报错问题的解决方法
Feb 06 #PHP
You might like
ThinkPHP5 的简单搭建和使用详解
2018/11/15 PHP
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
详解Node.js模板引擎Jade入门
2018/01/19 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
Python 元组(Tuple)操作详解
2014/03/11 Python
在Python中操作文件之truncate()方法的使用教程
2015/05/25 Python
python 捕获shell脚本的输出结果实例
2017/01/04 Python
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
Python变量赋值的秘密分享
2018/04/03 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python批量创建指定名称的文件夹
2019/03/21 Python
django 配置阿里云OSS存储media文件的例子
2019/08/20 Python
python关于调用函数外的变量实例
2019/12/26 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
几个解决兼容IE6\7\8不支持html5标签的几个方法
2013/01/07 HTML / CSS
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
研究生自我鉴定范文
2013/10/30 职场文书
培训自我鉴定
2014/01/31 职场文书
《在家里》教后反思
2014/03/01 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
作弊检讨书
2015/01/27 职场文书
支行行长岗位职责
2015/02/15 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
初三化学教学反思
2016/02/22 职场文书
描述鲁迅的名言整理,一生受用
2019/08/08 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
vue2实现provide inject传递响应式
2021/05/21 Vue.js
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang
详解CSS3浏览器兼容
2022/12/24 HTML / CSS