首页 » Ecshop » Ecshop后台订单列表订单状态不显示的问题

Ecshop后台订单列表订单状态不显示的问题

10687 3

今天有个朋友反映,后台订单列表管理页面最右侧的订单状态不显示了,但是在订单详细里却能正常显示的。页面截图如下,正常情况下这里会显示“订单状态,支付状态,发货状态”,可以看到这里的两个逗号还在,只是中文没有正常显示了。

1.初步判定和数据库无关,因为其他页面正常能显示,说明数据库里的值是正确的。

2.查看后台订单列表order.php后,看到此处订单状态等是有值传到模板的,再看模板文件order_list.htm,这个字段显示的代码如下:

<td align="center" valign="top" nowrap="nowrap">{$lang.os[$order.order_status]},{$lang.ps[$order.pay_status]},{$lang.ss[$order.shipping_status]}</td>

3.第一反应是代码改过了,模板的数组调用不是应该直接用.表示元素吗?这里怎么用[]了?上面的代码改了下,发现订单状态能显示正常了。

<td align="center" valign="top" nowrap="nowrap">{$lang.os.$order.order_status},{$lang.ps.$order.pay_status},{$lang.ss.$order.shipping_status}</td>

4.找来一下ecshop273版本的order_list.htm,对比了一下,竟然发现原先代码就是用的[],虽然上面第3部能解决显示不正确的问题,但是导致的原因肯定不是这样的,具体原因是啥呢?继续!

5.本地搭了个php5.4环境,重建了273的ecshop,由于兼容问题,各种warning,先不管这些,进后台订单列表,显示正常。

6.对比朋友的代码,做了PHP5.4+版本的兼容,代码是百度找来的。当更新完cls_template后,错误重现。

7.定位到错误是由cls_template导致的,对比代码后发现错误在get_value()这里形成。

 /**
     * 处理smarty标签中的变量标签
     *
     * @access  public
     * @param   string     $val
     *
     * @return  bool
     */
    function get_val($val)
    {
        if (strrpos($val, '[') !== false)
        {
	    //5.4兼
            //$val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val); 原273代码
	      $val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($r) {return '.'.str_replace('$','\$',$r[1]);},$val); //网上找来的代码
        }

8.先打印正则匹配生效前的$val,然后再分别打印上述代码中的两个$val发现,特么的。。。两个斜杠是什么鬼,一个转义,一个斜杠么?
没有匹配生效之前的$val = ‘lang.ss[$order.shipping_status]’
第1行273代码的$val = ‘lang.ss.$order.shipping_status’
第2行网上找来的代码$val = ‘lang.ss.\\$order.shipping_status’

9.实际运用中,似乎273的代码中的str_replace没有具体的意义?preg_replace取出的已经是$order.shipping_status,前面加个.就OK,不过没试过再多层的数据。将网上的代价直接修改成下面的代码,去除掉replace的步骤,显示正常。

$val = preg_replace_callback("/\[([^\[\]]*)\]/is", function($r) {return '.'.$r[1];},$val);

10.至今没看明白第8条中str_replace之后为啥还是$order.shipping_status而不是\$order.shipping_status,模板转义太多,晕啊。

文章评分1次,平均分5.0

本文原始地址:https://www.tiandiyoyo.com/2018/02/not-display-status-in-orderlist-of-backend/
本站所有文章,除了特别注明外,均为本站原创,转载请注明出处来自www.tiandiyoyo.com

您可能还会对以下文章感兴趣:

评论前先开启评论开关:


3 Comments

  1. imbiss :

    我选择修改模板,把[]改为.

  2. 匿名 :

    感谢. 遇到同样的问题. 因为原始的模板使用的preg_replace被废弃了.所以出现了修改过的template版本.

  3. 中国博客联盟前来拜访,祝贵博越来越好!

载入分页评论...