如何修改ecshop中的{insert name='cart_info'}

本文介绍如何在ECShop网店系统中自定义购物车显示信息,包括修改购物车中的商品数量及总价显示方式等,涉及模板文件及核心脚本的调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多人使用ecshop开源程序开网店,但是在使用ECShop模板的时候,很多人想把购物车地方修改的更人性化点,比如说把原来“购物车中有X件商品”改为“您的购物车中有X件商品,总计¥80元”。

   所以,我们只有通过修改模版来实现,但是在修改的时候,我们会在ECShop模板的dwt文件中,找到类似 {insert_scripts files=’common.js’}或者{insert name=’cart_info’}的代码。其实,你已经找到关键所在了。

    对于{insert_scripts files=’common.js’},我们可以很理所当然猜想到它是调用JS文件的语句。

    而很多人都不清楚这个{insert name=’cart_info’}是调用的哪里的内容。

    其实,它与上面的类似,只是它掉的不是文件,而是函数返回的字符串,可以是HTML,也可以是普通字符串。

    我们打开ECSHOP的安装的根目录下的includes文件夹,查找一个名为 lib_insert.php的文件。

    软化,在文件中查找“cart_info”,你会找到一个insert_cart_info()函数,没错,{insert name=’cart_info’}调出来的所有内容就是该函数的返回值。注意它的函数名的命名规则是  “insert_” + 函数后缀名,这样在模板中调用时就可以用{insert name=’函数后缀名’}的方式调用函数的返回值了。

    $str = sprintf($GLOBALS['_LANG']['cart_info'], $number, price_format($amount, false));

    这个字符串就是此函数要输出的内容。但是输出的那些文字在哪里修改或者添加呢?

    接着我们还要找到common.php文件,那么这个文件在哪呢?

    打开languages\zh_cn\common.php,查找$_LANG['cart_info'],接着你就会看到要输出的语句了,在这里你可以添加修改,至此,实现了购物车的修改

<think>我们面对的问题:在PHP 5.6环境下运行ECShop 2.7.3时,由于使用了被弃用的`preg_replace`函数(特别是使用`/e`修饰符)而报错。 根据引用[1]:在PHP5.5.x中,`preg_replace`函数使用的`/e`修饰符已被弃用,并在PHP5.5以上版本中被`preg_replace_callback`函数替代。 引用[2]和[5]提供了解决方案:将`preg_replace`函数替换为`preg_replace_callback`函数,并编写回调函数。 具体步骤: 1. 定位代码中使用`preg_replace`并带有`/e`修饰符的地方。 2. 将每个这样的调用替换为`preg_replace_callback`,并提供一个回调函数来执行原本在`/e`修饰符后执行的代码。 例如,引用[5]中给出了一个修改示例: 原代码可能是:$replacement = preg_replace("/(\'\\$[^,]+)/e", "stripslashes(trim('\\1','\''))", var_export($t,true)); 修改后:$replacement = preg_replace_callback("/(\'\\$[^,]+)/", function($matcher) { return stripslashes(trim($matcher[1],'\'')); }, var_export($t,true)); 注意:在原始的正则表达式中,我们使用了`\\1`来引用匹配的部分,而在回调函数中,我们使用`$matcher[1]`(如果只有一个捕获组)来获取匹配的字符串。 在ECShop 2.7.3中,主要需要修改的文件可能包括: - includes/cls_template.php - 其他使用了`preg_replace`且带有`/e`修饰符的文件 具体操作: 1. 打开文件,查找类似这样的代码:`preg_replace('...e', ...)` 或 `preg_replace("...e", ...)` 2. 将每个这样的调用替换为`preg_replace_callback`,并编写一个匿名函数(或使用已有的函数名)作为回调。 例如,在cls_template.php中,我们可能会找到以下代码: $out = preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $out); 修改为: $out = preg_replace_callback("/{([^\}\{\n]*)}/", function($matches) { return $this->select($matches[1]); }, $out); 注意:在匿名函数中,我们使用`$matches`参数来获取匹配的数组,其中`$matches[0]`是整个匹配的字符串,`$matches[1]`是第一个捕获组。 但是,请注意:在类的方法中使用匿名函数时,匿名函数的作用域是独立的,不能直接使用`$this`。在PHP 5.4以上,我们可以使用`use`关键字来传递`$this`。但是,在PHP5.3以上,匿名函数中不能直接使用`$this`,除非将其作为变量传递进去。 因此,对于上面的例子,在PHP5.3以上,我们需要这样写: $self = $this; $out = preg_replace_callback("/{([^\}\{\n]*)}/", function($matches) use ($self) { return $self->select($matches[1]); }, $out); 或者,如果方法中不需要使用`$this`,则可以直接使用。但在这个例子中,`$this->select`是类的方法,所以必须传递`$this`。 另外,引用[4]和[5]也提到了一些升级到PHP7的修改,但我们的问题是在PHP5.6,所以主要关注`/e`修饰符的替换。 注意:ECShop 2.7.3是一个较老的系统,可能有多处使用了`preg_replace`的`/e`修饰符,需要逐一修改。 修复步骤总结: 1. 备份原始文件。 2. 在代码中搜索`preg_replace`,并检查是否有使用`/e`修饰符。 3. 对每一处,按照上述方法进行替换。 4. 测试修改后的代码,确保功能正常。 由于ECShop 2.7.3的代码可能在不同地方有多个这样的调用,以下是一些常见的需要修改的地方(根据历史经验): - includes/cls_template.php - includes/lib_base.php - includes/lib_insert.php - admin/includes/lib_main.php 具体修改示例: 在cls_template.php中,我们可能会找到多处,例如: - 函数`fetch_str`中的:`$out = preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $out);` - 函数`select`中可能也有。 修改方法(以fetch_str中的为例): 原代码: $out = preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $out); 修改为: $out = preg_replace_callback("/{([^\}\{\n]*)}/", array($this, 'select_callback'), $out); 然后在该类中定义一个回调函数: function select_callback($matches) { return $this->select($matches[1]); } 或者使用匿名函数(注意作用域): $self = $this; $out = preg_replace_callback("/{([^\}\{\n]*)}/", function($m) use ($self) { return $self->select($m[1]); }, $out); 两种方法都可以,但考虑到兼容性(特别是PHP版本),使用匿名函数的方式需要PHP5.3以上,而ECShop2.7.3原本是PHP5.2,但我们现在是PHP5.6,所以可以使用匿名函数。 但是,由于ECShop的代码结构,可能有些地方无法直接使用匿名函数(比如在类的方法中,但该类方法可能被继承等),所以也可以选择创建一个新的回调方法。 另外,引用[5]中给出了另一个修改示例,是针对`stripslashes`的,方法类似。 最后,请务必在修改后进行全面的功能测试,特别是模板解析和标签替换等功能。 注意:如果修改后出现其他错误,可能是由于替换不正确导致的,请检查正则表达式和回调函数的实现。 由于ECShop 2.7.3已经非常古老,升级到PHP5.6可能还会遇到其他兼容性问题,比如其他被弃用的函数(如`ereg`系列函数,`mysql_*`函数等)。但本问题只针对`preg_replace`的`/e`修饰符问题。 如果遇到其他问题,可能需要根据具体错误信息逐一解决。 参考文献: [^1]: 指出`preg_replace`的`/e`修饰符在PHP5.5被弃用,并建议用`preg_replace_callback`替代。 [^2]: 总结替换方法,并强调测试的重要性。 [^5]: 给出了一个具体的替换示例。 因此,针对用户的问题,我们提供以下修复步骤: 1. 在代码中搜索所有`preg_replace`函数,查找是否有使用`/e`修饰符。 2. 对每一处,按照上述方法进行替换(使用`preg_replace_callback`和回调函数)。 3. 测试网站功能,特别是模板解析、标签替换、动态内容生成等。 如果用户不熟悉代码修改,建议寻求专业开发人员的帮助。 注意:由于ECShop版本可能存在差异,以上文件路径和代码位置仅供参考,请以实际代码为准。</think>### ECShop 2.7.3 在 PHP 5.6 环境下修复 `preg_replace()` 函数报错的解决方案 #### 问题原因 在 PHP 5.5+ 版本中,`preg_replace()` 函数使用的 `/e` 修饰符(执行替换内容作为代码)已被弃用[^1]。ECShop 2.7.3 作为较老系统,其部分代码仍依赖此修饰符,导致在 PHP 5.6 环境下报错: ``` Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead ``` #### 修复步骤 1. **定位问题文件** 主要涉及模板解析文件: `includes/cls_template.php` 2. **修改代码(两种方法)** **方法一:使用匿名函数(推荐)** 找到类似以下代码: ```php $out = preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $out); ``` 替换为: ```php $out = preg_replace_callback( "/{([^\}\{\n]*)}/", function($matches) { return $this->select($matches[1]); }, $out ); ``` [^5] **方法二:创建独立回调函数** 在类中添加新方法: ```php private function replace_callback($matches) { return $this->select($matches[1]); } ``` 原代码替换为: ```php $out = preg_replace_callback("/{([^\}\{\n]*)}/", array($this, 'replace_callback'), $out); ``` 3. **其他可能需修改的文件** - `includes/lib_insert.php` - `includes/lib_main.php` 搜索所有含 `/e` 修饰符的 `preg_replace()` 调用,按相同模式替换。 4. **关键修改示例** ```diff - $str = preg_replace("/\:([a-zA-Z0-9_\-\.]+)([^}]*)\}/e", "\$this->select('\\1');", $str); + $str = preg_replace_callback("/\:([a-zA-Z0-9_\-\.]+)([^}]*)\}/", function($m){ + return $this->select($m[1]); + }, $str); ``` #### 注意事项 1. **备份优先** 修改前务必备份原始文件,避免操作失误导致系统崩溃。 2. **作用域问题** 在匿名函数中使用 `$this` 需确保: - PHP 版本 ≥ 5.4 - 若低于 5.4,需通过 `use` 传递对象: ```php $self = $this; preg_replace_callback(..., function($m) use ($self) { return $self->select($m[1]); }); ``` 3. **全面测试** 修改后重点检查: - 商品页/分类页模板渲染 - 促销规则解析 - 后台配置项保存功能 - 支付回调处理 #### 其他兼容性建议 若后续升级到 PHP 7.x,还需: 1. 替换 `mysql_*` 为 `mysqli_*` 函数 2. 修复 `each()` 函数弃用问题 3. 处理 `create_function()` 的兼容性[^4] > **提示**:ECShop 2.7.3 官方已停止维护,建议考虑升级到兼容高版本 PHP 的电商系统(如 ShopXO、OpenCart)以获得长期支持[^3][^4]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值