IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

两个smarty小插件,以及如何自定义smarty插件目录

废墟 2011-09-19 23:45:33 累计浏览 3,520 次
本机暂存
smarty中文截取,其实网上那些并不是太好。。翻了翻手册,发现个现成的代码,挺好用
<?php
function smarty_modifier_truncate_cn($string$length 80$etc '...'$code 'utf-8'
) {
    if (
$length == 0
)
        return 
''
;
    return 
mb_strimwidth($string0$length'...''utf-8'
);
}
?>

保存为modifier.truncate_cn.php放在smarty的plugins目录下即可,怎么用就不用说了吧。。

第二个是类似腾讯微博的发表时间的
<?php
function smarty_modifier_cntime($old_time
) {
    
$res    null
;
    
$old    strtotime($old_time
);
    
$now    $_SERVER['REQUEST_TIME'
];
    
$ex    $now $old
;
    switch (
$ex
) {
        case 
$ex 60 
:
            
$res    '刚才'
;
            break;
        case 
$ex 3600 
:
            
$res    intval($ex/60).'分钟前'
;
            break;
        case 
$ex 86400 
:
            
$res    intval($ex/3600).'小时前'
;
            break;
        case 
$ex 604800 
:
            
$res    intval($ex/86400).'天前'
;
            break;
        default :
            
$res    date("Y-m-d H:s",$old
);
    }
    return 
$res
;
}
?>

保存为modifier.cntime.php放在smarty的plugins目录下即可,想增加也很方便,再写几个判断就行


下面来说说怎么在不更改原有plugins目录的情况下,自定义添加一个plugins的目录。
由于有时候我们会自定义几个插件,而在作为框架使用的情况下,smarty是会被公用的,那么各自的项目需要各自的plugins,如果混在一起,都放在smarty默认的plugins里面肯定是不行的,于是我看了看smarty的源码,发现在core.assemble_plugin_filepath.php这个文件中有这么一段
<?php
    
foreach ((array)$smarty->plugins_dir as $_plugin_dir
) {

        
$_plugin_filepath $_plugin_dir DIRECTORY_SEPARATOR $_plugin_filename
;

        
// see if path is relative
        
if (!preg_match("/^([/\\]|[a-zA-Z]:[/\\])/"$_plugin_dir
)) {
            
$_relative_paths[] = $_plugin_dir
;
            
// relative path, see if it is in the SMARTY_DIR
            
if (@is_readable(SMARTY_DIR $_plugin_filepath
)) {
                
$_return SMARTY_DIR $_plugin_filepath
;
                break;
            }
        }
        
// try relative to cwd (or absolute)
        
if (@is_readable($_plugin_filepath
)) {
            
$_return $_plugin_filepath
;
            break;
        }
    }
?>

我们可以看到,在smarty的实例中,plugins_dir是以一个数组形式存在的,并且可以有多个,这样一来就简单了,直接给这个数组再塞进去一个地址就ok了。
<?php
.......
array_push($this->tpl->plugins_dirROOT_PATH '/smarty_plugins/'
);
.......
?>

这是我的框架中的一个应用。。这样一来,针对这个项目的plugins我就可以放在本项目的目录下了,而不需要放在核心框架的smarty的plugins目录下,以免造成混乱

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 使用gettext来支持PHP的多语言 (累计阅读 39,270)
  2. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  3. Paypal接口详细代码(PHP版,非API接口) (累计阅读 19,408)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,147)
  5. include(“./file.php”)和include(“file.php”)区别 (累计阅读 12,789)
  6. 15个最好的免费开源电子商务平台 (累计阅读 12,541)
  7. Redis消息队列的若干实现方式 (累计阅读 12,088)
  8. 到底什么是MVC? (累计阅读 11,867)
  9. 整理了一份招PHP高级工程师的面试题 (累计阅读 11,708)
  10. Rolling cURL: PHP并发最佳实践 (累计阅读 11,488)