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目录下,以免造成混乱
