码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-07-17 11:03:11      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:必须   ash   处理   屏蔽   pos   内容   系统   linux   直接   

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模板中输出数组的方法

标签:必须   ash   处理   屏蔽   pos   内容   系统   linux   直接   

原文地址:https://www.cnblogs.com/lixiang1/p/11199505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!