在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中的Memcache详解
Apr 05 PHP
采用memcache在web集群中实现session的同步会话
Jul 05 PHP
php中使用url传递数组的方法
Feb 11 PHP
PHP实现清除wordpress里恶意代码
Oct 21 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
PHP抓取及分析网页的方法详解
Apr 26 PHP
php 类中的常量、静态属性、非静态属性的区别
Apr 09 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
php实现的错误处理封装类实例
Jun 20 PHP
php从数据库中获取数据用ajax传送到前台的方法
Aug 20 PHP
PHP全局使用Laravel辅助函数dd
Dec 26 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
PHP 程序员应该使用的10个组件
2009/10/31 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
一键生成各种尺寸Icon的php脚本(实例)
2017/02/08 PHP
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
AngularJs Managing Service Dependencies详解
2016/09/02 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
ES6如何用一句代码实现函数的柯里化
2020/01/18 Javascript
js验证账户名是否重复
2020/05/26 Javascript
Python备份Mysql脚本
2008/08/11 Python
zbar解码二维码和条形码示例
2014/02/07 Python
在CMD命令行中运行python脚本的方法
2018/05/12 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python中字符串List按照长度排序
2019/07/01 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
Python如何使用paramiko模块连接linux
2020/03/18 Python
简单掌握CSS3将文字描边及填充文字颜色的方法
2016/03/07 HTML / CSS
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
什么叫做SQL注入,如何防止
2016/10/04 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
大学军训感言
2014/01/10 职场文书
优乐美广告词
2014/03/14 职场文书
民主评议政风行风整改方案
2014/09/17 职场文书
经营目标责任书
2015/05/08 职场文书
R9700摩机记
2022/04/05 无线电