让ecshop的smarty支持数学运算.

在ecshop的使用,smarty可以很方便的做成网页。但ecshop的smarty把一些功能去掉了,只保留了逻辑运算、变量处理

等功能,连数学计算都不支持。我们想要在smarty模板中对一个变量进行动态的计算,就没有办法。

研究了一个晚上,终于可以让ecshop的smarty模板支持简单的数学计算了。

在ecshop的smarty模板中,对变量处理如下:


{ $foo + 1}

那么生成的后台代码是这样的:


<?php echo $this ->_var[ 'foo+1' ] ; ?>

它将$号后面的全部作为变量名了。


我们要的效果,

模板中是这样:


{math equation="$foo + 1"}

在后台生成这样的代码:


<?php echo$this->_var['foo] + 1; ?>


这里需要对cls_template文件进行修改,让其支持math标签。

在select 方法中增加一个case:

1
2
3
4
case 'math' :
$t = $this ->get_math_para( substr ( $tag , 8));
return '<?php echo ' . $t . '; ?>' ;
break ;


增加一个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 处理math中的公式.
* */
function get_math_para( $val ){
$pa = $this ->str_trim( $val );
foreach ( $pa AS $value )
{
if ( strrpos ( $value , '=' ))
{
list( $a , $b ) = explode ( '=' , str_replace ( array ( ' ' , '"' , " '", ' " '), ' ', $value ));
if ( strpos ( $b , '$' ) >= 0)
{
//$b为类似的1+2,$abc*123等
$pattern = "/\\$[_a-zA-z]+[a-zA-Z0-9_]*/" ;
preg_match( $pattern , $b , $arr );
if ( $arr ) {
foreach ( $arr as $match ) {
$v = $this ->get_val( substr ( $match , 1));
$b = str_replace ( $match , $v , $b );
}
}
}
}
}
return $b ;
}

这样就可以了。



你可能感兴趣的:(smarty,数学运算,ecshop)