Prestashop1.7中Smarty赋值变量到JS时单引号被转义为实体字符问题
你遇到的转义问题是两个原因导致的:
- 你在输出变量时使用了
escape:'html'修饰符,该修饰符的作用就是将单引号、双引号、尖括号等HTML特殊字符转换为对应实体编码,完全不符合JS变量输出的使用场景。 - Prestashop 1.7内置的Smarty默认开启了全局自动HTML转义,即使你不主动加
escape修饰符,变量输出时也会自动做HTML转义处理。
方案1:使用json_encode输出(最稳妥,推荐)
手动拼接JSON字符串极易出现语法错误、特殊字符未处理等问题,建议直接在PHP侧构造好对应结构的数组,通过Smarty的json_encode修饰符输出,自动处理所有转义逻辑,不会出现实体编码问题:
- 首先在对应控制器的PHP代码中构造数组并赋值给Smarty:
// 构造和你预期结构完全一致的数组 $newOrderData = [ [ 'transactionId' => $orderID, 'transactionAffiliation' => 'site.com', 'transactionTotal' => $totalPrice, 'transactionProducts' => $orderProducts ] ]; // 赋值给Smarty模板 $this->context->smarty->assign('newOrderData', $newOrderData);
- 模板中直接输出即可,
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
相关产品推荐
相关产品推荐

