smarty中文截取,其实网上那些并不是太好。。翻了翻手册,发现个现成的代码,挺好用
<?php function smarty_modifier_truncate_cn($string, $length = 80, $etc = '...', $code = 'utf-8') { if ($length == 0) return ''; return mb_strimwidth($string, 0, $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_dir, ROOT_PATH . '/smarty_plugins/'); ....... ?>
这是我的框架中的一个应用。。这样一来,针对这个项目的plugins我就可以放在本项目的目录下了,而不需要放在核心框架的smarty的plugins目录下,以免造成混乱