在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解析html的实现代码
Aug 08 PHP
php截取后台登陆密码的代码
May 05 PHP
深入php self与$this的详解
Jun 08 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
解析linux下安装memcacheq(mcq)全过程笔记
Jun 27 PHP
php二维数组排序详解
Nov 06 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
Apr 24 PHP
PHP经典面试题集锦
Mar 19 PHP
php获取twitter最新消息的方法
Apr 14 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
Jul 12 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
PHP小程序自动提交到自助友情连接
2009/11/24 PHP
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
PHP设计模式之调解者模式的深入解析
2013/06/13 PHP
php 浮点数比较方法详解
2017/05/05 PHP
JavaScript 乱码问题
2009/08/06 Javascript
location.href语句与火狐不兼容的问题
2010/07/04 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
2012/02/03 Javascript
点击进行复制的JS代码实例
2013/08/23 Javascript
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
2016/12/14 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
详解HTTPS 的原理和 NodeJS 的实现
2017/07/04 NodeJs
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
JQueryDOM之样式操作
2019/03/27 jQuery
Python 第一步 hello world
2009/09/25 Python
在Python的setuptools框架下生成egg的教程
2015/04/13 Python
Python中type的构造函数参数含义说明
2015/06/21 Python
Python实现文件复制删除
2016/04/19 Python
Python工厂函数用法实例分析
2018/05/14 Python
python 接口实现 供第三方调用的例子
2019/08/13 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
几个数据库方面的面试题
2016/07/01 面试题
财会自我鉴定范文
2013/12/27 职场文书
公司节能减排倡议书
2014/05/14 职场文书
篮球社团活动总结
2014/06/27 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫