Ecshop模板类的一个bug

Ecshop类的模板类(includes/cls_template.php),简化的着实好用。但可否注意到这个bug:

简单举例说:

在模板里面的某一个smarty标签有:{foreach from=$goods_list item=goods} , 还有 {$goods.goods_name}等

在PHP文件注册变量有:$smarty->assign(‘goods_list’, $goods_list);  $smarty->assign(‘goods’, $goods);

注意到smarty语法foreach语句中的item的名字是goods,而又有一个goods标签名被注册;其模板类有考虑防止注册相同标签的变量(即$this->_val[var_name]中的var_name防止重复),所以它在处理var_name的时候,在_compile_foreach_start(tag_args)处理,利用$this->_patchstack成员(array类型)暂存储foreach中的处理后的item名字(即对goods后面再加入随机数字,以防重复)。然后再注册变量的时候,判断下标为item的名字的$this->_patchstack变量是否存在,然后再以其值作为$this->_val数组的下标,而进行赋值。

然而,它在处理$this->_patchstack中,有一个必要的任务,存储一个变量的时候,用完它的时候,必须废了它。它在这个关节上,有bug(从make_val方法入手查起就了然)。所以导致在多个foreach在item的名字,如果和单独一个变量名相同时候(上边提到的goods),就会导致生成编译文件的时候,对单独变量名的:eg:编译后的本应该是$this->_val[‘goods’][‘goods_name’], 却是 $this->_var[‘goods_0_95615500_1302147485’][‘goods_name’],这样$smarty->assign(‘goods’, goods)注册的变量,就不可赋值到对应的变量中,从而显示不出数据。

罗嗦了那么多,就是该废它的时候,没废到。在select($tag)方法中,当tag{0} == ‘/’和substr($tag, 1) == ‘foreach’的时候,在$this->_foreachmark == ‘foreachelse’的时候,没有array_pop($this->_patchstack)。允许它,问题解决。

还有,模板类它一开始并为声明_patchstack其成员变量,这本身埋下不稳定的因素。

 

发表回复

您的电子邮箱地址不会被公开。