在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下图片文字混合水印与缩略图实现代码
Dec 11 PHP
php UTF-8、Unicode和BOM问题
May 18 PHP
php 无限级数据JSON格式及JS解析
Jul 17 PHP
php数组函数序列之krsort()- 对数组的元素键名进行降序排序,保持索引关系
Nov 02 PHP
配置php.ini实现PHP文件上传功能
Nov 27 PHP
php使用类继承解决代码重复的问题
Feb 11 PHP
php简单实现批量上传图片的方法
May 09 PHP
利用php-cli和任务计划实现订单同步功能的方法
May 03 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
Jun 16 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
laravel框架与其他框架的详细对比
Oct 23 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 JS Ip地址及域名格式检测代码
2013/09/27 PHP
ThinkPHP模板范围判断输出In标签与Range标签用法详解
2014/06/30 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
学习YUI.Ext第七日-View&amp;JSONView Part Two-一个画室网站的案例
2007/03/10 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
Extjs在exlipse中设置自动提示的方法
2010/04/07 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
js脚本获取webform服务器控件的方法
2014/05/16 Javascript
javascript表格的渲染组件
2015/07/03 Javascript
详细解读JavaScript编程中的Promise使用
2015/07/27 Javascript
jQuery向父辈遍历的简单方法
2016/09/18 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
jquery实现点击a链接,跳转之后,该a链接处显示背景色的方法
2018/01/18 jQuery
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
Python映射拆分操作符用法实例
2015/05/19 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
Python解惑之整数比较详解
2017/04/24 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
详解HTML5 canvas绘图基本使用方法
2018/01/29 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
德国自然时尚和有机产品购物网站:Waschbär
2019/05/29 全球购物
餐饮主管岗位职责
2013/12/10 职场文书
迟到检讨书5000字
2014/01/31 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
产品售后服务承诺书
2014/05/21 职场文书
环保口号大全
2014/06/12 职场文书
口才训练演讲稿范文
2014/09/16 职场文书
2015年外联部工作总结
2015/04/03 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL