在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下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
一个PHP验证码类代码分享(已封装成类)
Jul 17 PHP
php cc攻击代码与防范方法
Oct 18 PHP
PHP数组及条件,循环语句学习
Nov 11 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
php实现的简单日志写入函数
Mar 31 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
PHP中in_array函数使用的问题与解决办法
Sep 11 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
Yii2中datetime类的使用
Dec 17 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
Laravel框架实现利用监听器进行sql语句记录功能
Jun 06 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基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
PHP PDO操作MySQL基础教程
2017/06/05 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
JS 时间显示效果代码
2009/08/23 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
jQuery动态添加与删除tr行实例代码
2016/10/18 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
2017/08/19 Javascript
JavaScript动态绑定详解
2017/09/14 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
JavaScript实现移动端弹窗后禁止滚动
2020/05/25 Javascript
[03:17]DOTA2英雄基础教程 剧毒术士
2013/12/12 DOTA
使用Python的Zato发送AMQP消息的教程
2015/04/16 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
python实现自主查询实时天气
2018/06/22 Python
pycharm的console输入实现换行的方法
2019/01/16 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
某公司部分笔试题
2013/11/05 面试题
生产主管岗位职责
2013/11/10 职场文书
编辑硕士自荐信范文
2013/11/27 职场文书
党支部遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
深度学习详解之初试机器学习
2021/04/14 Python
Mysql如何查看是否使用到索引
2022/12/24 MySQL