+ -
当前位置:首页 → 问答吧 → 教大家写个smarty插件

教大家写个smarty插件

时间:2008-11-24

来源:互联网

Smarty很强大,今天我教大家写个smarty的插件吧!

写这个插件是因为我觉得Smarty的截取字符函数太菜了,不能截取UTF8的字符!所以我今天就是为了实现截取UTF8字符功能而写这个教程的!!开始了:

1.首先,下载Smarty。
http://www.smarty.net/ 下载一个稳定的版本。

2.安装Smarty。
其实Smarty是不用安装的,只要解压到你需要的地方就可以了!

3.了解插件目录。
解压之后,我会会发现有个plugins的文件夹,这个文件夹就是放置插件的目录。
好了,我们在这个文件夹中新建一个文件function.utf8cut.php,其中utf8cut这个就是函数名,用文本编辑器打开它,写入以下代码:
注意函数名的写法:要以“smarty_function_ ” 或者“smarty_modifier_”为前缀,前一种情况是PHP本身没有的函数,后一种是修改PHP本身有的函数!!
[php]
<?php
function smarty_function_utf8cut($string, $leng=100, $dot='...') {
if(!isset($string) || $string == '') {
  return '';
}
preg_match_all("/.{1}/", $string, $chars);
$c = '';
$all = array();
$timer = 0;
foreach($chars[0] as $char) {
  $timer++;
  if(ord($char) > 127) {
   $c .= $char;
   if($timer == 3) {
    $all[] = $c;
    $c = '';
    $timer = 0;
   }
  } else {
   $c = $char;
   $timer = 0;
   $all[] = $c;
   $c = '';
  }
}
if(sizeof($all) <= $leng) {
  return implode('', $all);
}
return implode('',array_slice($all, 0, $leng)).$dot;
}
?>
[/php]
至于这个函数是怎么样截取utf8字符的,自己可以研究一下。Smarty插件函数都要返回一个值的。

好了,现在我们可以使用这个插件了:
index.tpl

<html>
<head></head>
<body>
<h2>插件实现</h2>
<p>{$content|utf8cut:20}</p>
</body>
</html>

可以看见utf8cut就是我们刚才写的函数,冒号后面的是我们的第二个参数(为什么不是第一个,因为第一个是Smarty帮我们自动写入的,就是$content)。如此类推,第三个参数可以这样utf8cut:10:'......';

index.php

<?php
require_once 'smarty/smarty.class.php';
$smarty = new Smarty();
$smarty->assign('content','随意混用PHP 与其他Web 页面标记将导致程序逻辑、HTML、层叠样式表(Cascading Style Sheets,CSS)和JavaScript 处于混乱状态');
$smarty->display('index.tpl');
?>


输出:
  1. 插件实现
  2. 随意混用PHP 与其他Web 页面标记将...
复制代码
好了,就写到这里了,其实关于Smarty的讨论,我就不说什么了,看过Smarty的代码,发现Smarty对每种情况的分析都很到位,比那些什么自称最好的模板引擎好不知道多少倍!!不过用不用就是你自己的事了!

[ 本帖最后由 liexusong 于 2008-11-24 13:57 编辑 ]

作者: liexusong   发布时间: 2008-11-24

原创?

作者: 生命如蓝   发布时间: 2008-11-24

Yes!!可是用了我半个钟的时间写的!

作者: liexusong   发布时间: 2008-11-24

不错,支持下。。。

作者: qingqiang   发布时间: 2008-11-24

本人漂过....

作者: 冯.于安   发布时间: 2008-11-24

严重的感谢楼主分享!tukiz43

作者: hoday   发布时间: 2008-11-24

之前乔总 讲课时 讲过改写 truncate 函数  支持utf-8 的截取~
哈哈

作者: love__xijun   发布时间: 2008-11-25

很好啊   一直没学  收藏了!

作者: sheak   发布时间: 2008-11-25

原帖由 love__xijun 于 2008-11-25 13:35 发表
之前乔总 讲课时 讲过改写 truncate 函数  支持utf-8 的截取~
哈哈


你试试就知道!

作者: liexusong   发布时间: 2008-11-25

学习了,谢谢楼主分享

作者: xiejohnson   发布时间: 2008-11-25

:funk: :funk: 路过

作者: ieliwb   发布时间: 2008-11-25

[php]
<?php
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*/


/**
* Smarty truncate modifier plugin
*
* Type:     modifier<br>
* Name:     truncate<br>
* Purpose:  Truncate a string to a certain length if necessary,
*           optionally splitting in the middle of a word, and
*           appending the $etc string or inserting $etc into the middle.
* @link http://smarty.php.net/manual/en/language.modifier.truncate.php
*          truncate (Smarty online manual)
* @author   Monte Ohrt <monte at ohrt dot com>
* @param string
* @param integer
* @param string
* @param boolean
* @param boolean
* @return string
*/
function smarty_modifier_mtruncate($string, $length = 80, $etc = '...')
{
/*    if ($length == 0) return '';

        if($length>=strlen($string)) return $string;  

        $string = strip_tags($string);
    $s="";
        for($i=0;$i<$length;$i++)
        {
                if(ord($string{$i})>127)
                {
                        $s.=$string{$i}.$string{++$i};
                        continue;
                }else{
                        $s.=$string{$i};
                        continue;
                }
        }
        return $s.$etc; */
        $string = strip_tags($string);
        if (strlen($string) <= $length )
    {
        return $string;
    }
    else
    {
        $I = 0;
        while ($I < $length)
        {
            $StringTMP = substr($string,$I,1);
            if ( ord($StringTMP) >=224 )
            {
                $StringTMP = substr($string,$I,3);
                $I = $I + 3;
            }
            elseif( ord($StringTMP) >=192 )
            {
                $StringTMP = substr($string,$I,2);
                $I = $I + 2;
            }
            else
            {
                $I = $I + 1;
            }
            $StringLast[] = $StringTMP;
        }
        $StringLast = @implode("",$StringLast);
        if($etc)
        {
            $StringLast .= "...";
        }
        return $StringLast;
    }
}

/* vim: set expandtab: */

?>
[/php]
以前写的,经常用,截字符的

[ 本帖最后由 wukewei00o 于 2008-11-25 08:30 编辑 ]

作者: wukewei00o   发布时间: 2008-11-25

:funk: :handshake:

作者: 小郭同志   发布时间: 2008-11-26

很好很强大

作者: wangzhe   发布时间: 2008-11-26

我这里怎么非要把smarty_function_utf8cut改成smarty_modifier_utf8cut才可以用啊。

作者: phpzxh   发布时间: 2008-12-29

好牛,学习中!

作者: max_qu   发布时间: 2009-03-20

貌似很强大啊

作者: kwlong2008   发布时间: 2009-03-24

原帖由 max_qu 于 2009-3-20 17:27 发表
好牛,学习中!
偷懒中

作者: okjoyel   发布时间: 2009-03-25

学习了,呵呵!

作者: libailin   发布时间: 2009-04-11

学习了

作者: y81348016   发布时间: 2009-04-11

希望能有gb2312的插件
:shutup:

作者: aoyoo   发布时间: 2009-04-19

学习......

作者: huwuling922   发布时间: 2009-04-20

tukiz29

作者: fly_sharp   发布时间: 2009-07-31

自己改写了truncate函数- -

作者: loki   发布时间: 2009-08-02

不错。学习了!

作者: witer666   发布时间: 2009-08-03

留名学习鸟。。。。

作者: xlbc   发布时间: 2009-08-17

感谢楼主分享!

作者: dgjj   发布时间: 2009-08-24

支持原创

作者: cone   发布时间: 2009-08-26

顶了

作者: dyl213   发布时间: 2009-08-26

好像只要php中有utf8cut这个函数,都可以直接这样子用

作者: Alog_W   发布时间: 2009-10-10