在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(5) 类和对象
Feb 16 PHP
浅析PKI加密解密 OpenSSL
Jul 01 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
CI框架中cookie的操作方法分析
Dec 12 PHP
Laravel实现用户注册和登录
Jan 23 PHP
PHP实现多图上传(结合uploadify插件)思路分析
Nov 30 PHP
php微信公众号开发(4)php实现自定义关键字回复
Dec 15 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
Jul 26 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
解决Laravel自定义类引入和命名空间的问题
Oct 15 PHP
php pdo连接数据库操作示例
Nov 18 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
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
PHP生成静态HTML页面最简单方法示例
2015/04/09 PHP
讲解WordPress中用于获取评论模板和搜索表单的PHP函数
2015/12/28 PHP
PHP数组中头部和尾部添加元素的方法(array_unshift,array_push)
2017/04/10 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
使用基于jquery的gamequery插件做JS乒乓球游戏
2011/07/31 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
bootstrap模态框跳转到当前模板页面 框消失了而背景存在问题的解决方法
2020/11/30 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
JavaScrip如果基于url实现图片下载
2020/07/03 Javascript
js实现圆形菜单选择器
2020/12/03 Javascript
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
浅析Python装饰器以及装饰器模式
2018/05/28 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
Python socket实现的文件下载器功能示例
2019/11/15 Python
python调用接口的4种方式代码实例
2019/11/19 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
2020/02/28 Python
Python正则re模块使用步骤及原理解析
2020/08/18 Python
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
《穷人》教学反思
2014/04/08 职场文书
2014年学校总务处工作总结
2014/12/08 职场文书
2016大学军训心得体会
2016/01/11 职场文书
MySQL表字段时间设置默认值
2021/05/13 MySQL
用Python实现屏幕截图详解
2022/01/22 Python