You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prestashop1.7中Smarty赋值变量到JS时单引号被转义为实体字符问题

你遇到的转义问题是两个原因导致的:

  1. 你在输出变量时使用了escape:'html'修饰符,该修饰符的作用就是将单引号、双引号、尖括号等HTML特殊字符转换为对应实体编码,完全不符合JS变量输出的使用场景。
  2. Prestashop 1.7内置的Smarty默认开启了全局自动HTML转义,即使你不主动加escape修饰符,变量输出时也会自动做HTML转义处理。

方案1:使用json_encode输出(最稳妥,推荐)

手动拼接JSON字符串极易出现语法错误、特殊字符未处理等问题,建议直接在PHP侧构造好对应结构的数组,通过Smarty的json_encode修饰符输出,自动处理所有转义逻辑,不会出现实体编码问题:

  1. 首先在对应控制器的PHP代码中构造数组并赋值给Smarty:
// 构造和你预期结构完全一致的数组
$newOrderData = [
    [
        'transactionId' => $orderID,
        'transactionAffiliation' => 'site.com',
        'transactionTotal' => $totalPrice,
        'transactionProducts' => $orderProducts
    ]
];
// 赋值给Smarty模板
$this->context->smarty->assign('newOrderData', $newOrderData);
  1. 模板中直接输出即可,nofilter修饰符用于禁用Prestashop的自动转义:
<script>dataLayer = {$newOrderData|json_encode|nofilter};</script>

方案2:修改原有拼接字符串的写法

如果你需要保留当前手动拼接字符串的逻辑,直接删除错误的HTML转义修饰符,加上nofilter禁用自动转义即可:
把原来的输出代码:

<script>dataLayer = {$newOrder|escape:'html':'UTF-8'};</script>

替换为:

<script>dataLayer = {$newOrder|nofilter};</script>

注意:该方案风险较高,若拼接的内容中包含未处理的单引号、换行符、特殊字符,会直接导致JS语法报错,同时存在XSS安全风险,仅建议确认内容完全可控的场景下使用。

内容的提问来源于stack exchange,提问作者WB3000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 09:24:02