JTL插件中Smarty变量覆盖失败,是否存在Smarty缓存?
解决JTL插件中Smarty变量修改不生效的问题
我之前做JTL插件开发时也碰到过几乎一模一样的变量覆盖问题,给你几个实际验证有效的解决思路:
确认Hook执行时机与优先级
JTL的核心流程里,Zahlarten变量可能在你修改后被其他代码重新赋值。比如你当前用的Hook是在初始assign之后,但后续可能有核心逻辑或其他插件在更晚的阶段再次将原始的$zahlarten数组传给Smarty。建议更换到更晚执行的Hook,比如FE_OUTPUT_FILTER(模板渲染前的最后过滤钩子),或者调整你的Hook优先级(如果支持的话,设置更高的优先级让你的代码最后执行)。直接操作原始数据源,跳过Smarty变量二次赋值
既然修改Smarty的模板变量不生效,不如直接修改原始的支付方式数组。在合适的Hook中,你可以尝试获取全局的$zahlarten变量,修改后无需再调用assign,因为核心流程会自动将这个数组同步到Smarty中:// 在目标Hook的回调函数中 global $zahlarten; // 遍历修改支付方式描述 foreach ($zahlarten as &$zahlart) { $zahlart['cBeschreibung'] = '你的自定义描述内容'; } unset($zahlart); // 记得释放引用,避免后续变量污染彻底清理缓存(包括Smarty编译缓存)
你之前尝试的禁用缓存可能没覆盖到所有场景:- 手动删除JTL项目中
cache/smarty目录下的所有编译文件; - 登录JTL后台,在「系统 -> 缓存管理」中清空所有系统缓存;
另外注意你之前的代码有语法错误:$smarty->assign('Zahlarten', $tmpPayments', true);多了一个单引号,修正后可以再尝试带nocache参数的赋值:
$smarty->assign('Zahlarten', $tmpPayments, true);- 手动删除JTL项目中
排查第三方插件冲突
有可能其他已安装的插件也在操作Zahlarten变量,并且执行顺序在你的插件之后,覆盖了你的修改。可以暂时禁用所有其他插件,只保留你的插件测试,如果修改生效了,再逐个启用插件排查冲突源。
内容的提问来源于stack exchange,提问作者Langer.197
相关产品推荐
相关产品推荐

