在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 相关文章推荐
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php使用function_exists判断函数可用的方法
Nov 19 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
php session的应用详细介绍
Mar 22 PHP
PHP实现的多维数组排序算法分析
Feb 10 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
php和js实现根据子网掩码和ip计算子网功能示例
Nov 09 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
Protoss热键控制
2020/03/14 星际争霸
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
php escape URL编码
2008/12/10 PHP
php除数取整示例
2014/04/24 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
PHP中抽象类、接口的区别与选择分析
2016/03/29 PHP
prototype 的说明 js类
2006/09/07 Javascript
js tab 选项卡
2009/04/26 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
JavaScript包装对象使用介绍
2013/08/29 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jquery事件preventDefault()方法用法实例
2015/01/16 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
浅谈Angular单元测试总结
2019/03/22 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
python执行等待程序直到第二天零点的方法
2015/04/23 Python
python 爬取疫情数据的源码
2020/02/09 Python
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
护士演讲稿范文
2014/01/05 职场文书
《掌声》教学反思
2014/02/23 职场文书
求职面试个人自我评价
2014/02/28 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
2015年药房工作总结
2015/04/25 职场文书
朋友离别感言
2015/08/04 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
详解在SQLPlus中实现上下键翻查历史命令的功能
2022/03/18 SQL Server