在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&amp;java(一)
Oct 09 PHP
php addslashes 函数详细分析说明
Jun 23 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
基于PHP Socket配置以及实例的详细介绍
Jun 13 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
php封装的图片(缩略图)处理类完整实例
Oct 19 PHP
thinkPHP自定义类实现方法详解
Nov 30 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
MAC下通过改apache配置文件切换php多版本的方法
Apr 26 PHP
phpstorm 配置xdebug的示例代码
Mar 31 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
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
php简单读取.vcf格式文件的方法示例
2017/09/02 PHP
jquery随机展示头像代码
2011/12/21 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
2016/03/05 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
JavaScript输入分钟、秒倒计时技巧总结(附代码)
2017/08/17 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
基于vue-cli vue-router搭建底部导航栏移动前端项目
2018/02/28 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
2019/08/06 Python
python序列化与数据持久化实例详解
2019/12/20 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
德国奢侈品网上商城:Mytheresa
2016/08/24 全球购物
一个大学生十年的职业规划
2014/01/17 职场文书
计算机专业优秀大学生自我总结
2014/01/21 职场文书
婚庆司仪主持词
2014/03/15 职场文书
销售人员求职的自我评价分享
2014/03/15 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
2014年大学班级工作总结
2014/11/14 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
党性分析材料格式
2014/12/19 职场文书
汉语拼音教学反思
2016/02/22 职场文书
2019个人工作总结
2019/06/21 职场文书