ecshop在dwt模板中和lbi中输入数组详情的方法 ecshop模板中输出数组的方法

Posted lixiang1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ecshop在dwt模板中和lbi中输入数组详情的方法 ecshop模板中输出数组的方法相关的知识,希望对你有一定的参考价值。

ecshop系统的模板是基于smarty开发的,所以语法有很多smarty的特性,但是又不尽相同。

在ecshop的模板文件中(包含.dwt和.lbi的文件),想要用print_r打印一个数组(smarty的语法是$array|print_r)却发现不行,在模板中始终只是出现一个array,无法打印出数组中的内容。
随着ecshop的发展,现在市面上ecshop的商业模板越来越多,免费模板也是来越多,这时候买别人的模板,放在商城中就很担心被加入后门了,所以ecshop就在模板类中屏蔽了所有的函数调用,防止模板中被加入后门,只开放了少量的必须的函数(如:escape,nl2br等)。

但是作为开发者,想要在页面输出数组便于调试是很重要的,那么怎么解决这个问题呢?
第一步:打开ecshop目录下 “includes/cls_template.php”文件
第二步:在文件中搜索“function get_val($val)”,即get_val函数
经过上面两步,懂php代码的人,认证看下就会发现,原来在模板中可以使用的函数都是在这里“定义”的,剩下的就是加入你想用的函数了,函数体可以写在ecshop的函数库中,在这里调用函数就行了,由于调用的原理是使用eval函数,所以写法要注意,废话少说上代码:

/**
* 处理smarty标签中的变量标签
*
* @access public
* @param string $val
*
* @return bool
*/
function get_val($val)

if (strrpos($val, ‘[‘) !== false)

$val = preg_replace("/\[([^\[\]]*)\]/eis", "‘.‘.str_replace(‘$‘,‘\$‘,‘\\1‘)", $val);


if (strrpos($val, ‘|‘) !== false)

$moddb = explode(‘|‘, $val);
$val = array_shift($moddb);


if (empty($val))

return ‘‘;


if (strpos($val, ‘.$‘) !== false)

$all = explode(‘.$‘, $val);

foreach ($all AS $key => $val)

$all[$key] = $key == 0 ? $this->make_var($val) : ‘[‘. $this->make_var($val) . ‘]‘;

$p = implode(‘‘, $all);

else

$p = $this->make_var($val);


if (!empty($moddb))

foreach ($moddb AS $key => $mod)

$s = explode(‘:‘, $mod);
switch ($s[0])

case ‘escape‘:
$s[1] = trim($s[1], ‘"‘);
if ($s[1] == ‘html‘)

$p = ‘htmlspecialchars(‘ . $p . ‘)‘;

elseif ($s[1] == ‘url‘)

$p = ‘urlencode(‘ . $p . ‘)‘;

elseif ($s[1] == ‘decode_url‘)

$p = ‘urldecode(‘ . $p . ‘)‘;

elseif ($s[1] == ‘quotes‘)

$p = ‘addslashes(‘ . $p . ‘)‘;

elseif ($s[1] == ‘u8_url‘)

if (EC_CHARSET != ‘utf-8‘)

$p = ‘urlencode(ecs_iconv("‘ . EC_CHARSET . ‘", "utf-8",‘ . $p . ‘))‘;

else

$p = ‘urlencode(‘ . $p . ‘)‘;


else

$p = ‘htmlspecialchars(‘ . $p . ‘)‘;

break;
case ‘nl2br‘:
$p = ‘nl2br(‘ . $p . ‘)‘;
break;

case ‘default‘:
$s[1] = $s[1]0 == ‘$‘ ? $this->get_val(substr($s[1], 1)) : "‘$s[1]‘";
$p = ‘empty(‘ . $p . ‘) ? ‘ . $s[1] . ‘ : ‘ . $p;
break;

case ‘truncate‘:
$p = ‘sub_str(‘ . $p . ",$s[1])";
break;
case ‘strip_tags‘:
$p = ‘strip_tags(‘ . $p . ‘)‘;
break;
case ‘print_r‘:
$p=‘print_r(‘.$p.‘,true)‘;
break;
case ‘var_export‘:
$p=‘var_export(‘.$p.‘,true)‘;

break;
default:
# code...
break;




return $p;

在上面的代码中,我在有基础上加入了两个函数的引用,一个是print_r,一个是var_export。
不懂的直接把代码复制,替换掉原来的get_val函数即可;懂的,你就可以随心所欲的拓展了。
模板中使用的方式是:<!--$array|print_r-->
更多的我就不说了,说多了篇幅太长...嘿嘿...

以上是关于ecshop在dwt模板中和lbi中输入数组详情的方法 ecshop模板中输出数组的方法的主要内容,如果未能解决你的问题,请参考以下文章

ecshop不能在模板文件.dwt和.lbi中直接添加php代码的解决方法

ecshop中index.dwt文件分析

关于ecshop中'/library/cat_goods.lbi'的调用来源

ecshop中怎么把每个文章title设置成:文章标题+网站名称

ecshop( lib文件)

如何在ecshop首页给商品加入立即购买与收藏按钮