在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 相关文章推荐
PHP_Flame(Version:Progress)的原代码
Oct 09 PHP
PHP $_FILES函数详解
Mar 09 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
PHP开发框架kohana中处理ajax请求的例子
Jul 14 PHP
php+mysqli使用预处理技术进行数据库查询的方法
Jan 28 PHP
php简单判断文本编码的方法
Jul 30 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
php构造函数与析构函数
Apr 23 PHP
PHP 根据key 给二维数组分组
Dec 09 PHP
PHP FileSystem 文件系统常用api整理总结
Jul 12 PHP
PHP 观察者模式深入理解与应用分析
Sep 25 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
PHP实现服务器状态监控的方法
2014/12/09 PHP
PHP图片加水印实现方法
2016/05/06 PHP
javascript 写类方式之五
2009/07/05 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
基于JavaScript实现继承机制之原型链(prototype chaining)的详解
2013/05/07 Javascript
jquery可见性过滤选择器使用示例
2013/06/24 Javascript
js select option对象小结
2013/12/20 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
Vue实现购物车功能
2017/04/27 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
Vue+Spring Boot简单用户登录(附Demo)
2020/11/12 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
python获取本地计算机名字的方法
2015/04/29 Python
Python简单实现enum功能的方法
2016/04/25 Python
Python 查看文件的读写权限方法
2018/01/23 Python
基于python生成器封装的协程类
2019/03/20 Python
Django框架model模型对象验证实现方法分析
2019/10/02 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
多视角3D可旋转的HTML5 Logo动画
2016/03/02 HTML / CSS
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
篝火晚会策划方案
2014/05/16 职场文书
保险专业求职信
2014/07/07 职场文书
投资入股合作协议书
2014/10/28 职场文书
2014小学教师年度考核工作总结
2014/12/03 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
机械原理课程设计心得体会
2016/01/15 职场文书
小学语文新课改心得体会
2016/01/22 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python