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

如何让Smarty条件语句在JavaScript中生效?

让Smarty条件在JavaScript中正常工作的解决方案

首先得明确:Smarty是服务器端模板引擎,会在页面发送到浏览器前先解析所有模板变量和逻辑;而JavaScript是客户端脚本,在浏览器里执行。所以要让两者配合,核心是让Smarty先把需要的变量/计算结果输出到JS代码里,再让JS执行逻辑。

针对你的代码,主要有两个问题需要修正:


1. 修复Smarty与JS的语法冲突({literal}的正确使用)

你当前的代码频繁切换{literal}和Smarty变量,不仅容易出错,还会让Smarty无法正确解析变量。其实不需要把整个JS代码包在{literal}里,只需要把Smarty不需要解析的JS语法(比如{})用{literal}包裹,或者更简单的方式:直接让Smarty把变量输出到JS中,不需要额外的引号嵌套(如果变量本身是字符串类型)。

比如原来的:

{/literal}'{$ticket.lock_date}'{literal}

可以简化成Smarty直接输出变量:

'{$ticket.lock_date}'

因为Smarty会在服务器端把{$ticket.lock_date}替换成实际的日期字符串,最终输出到浏览器的JS代码里就是一个普通的字符串。


2. 修复日期比较的逻辑错误

直接用字符串比较日期(比如'2024-05-01' > '2024-04-30')虽然对YYYY-MM-DD格式的字符串有效,但这是字典序比较,不是真正的时间戳比较,存在潜在风险。正确的做法是把Smarty输出的日期字符串转换成JS的Date对象,再比较时间戳。


修正后的完整代码

<script>
// 等待文档加载完成
$(document).ready(function() {
    // 让Smarty先输出日期变量,JS再转成Date对象
    const lockDate = '{$ticket.lock_date}' ? new Date('{$ticket.lock_date}') : null;
    const currentDate = new Date('{$currentDate}');

    // 检查状态:lockDate存在,且当前时间晚于锁定时间
    if (lockDate !== null && currentDate > lockDate) {
        // 禁用状态选择框和项目选择器
        $('#status').attr("disabled", true);
        $('.select2project').attr("disabled", true);
        // 这里可以补充强制工单关闭的逻辑,比如设置状态值
        $('#status').val('closed').trigger('change');
    }
});
</script>

关键改动说明:

  • 去掉了冗余的{literal}:因为Smarty只会解析{$变量名}格式的内容,JS的语法(比如function(){}、if(){})不会被Smarty误解析,不需要用{literal}包裹整个函数。
  • 日期转成Date对象:确保比较的是实际的时间先后,而不是字符串字典序。
  • 增加空值判断:避免{$ticket.lock_date}为null时,new Date(null)产生无效日期的问题。

额外提示:如果需要输出JS的字面量(比如布尔值/数字)

如果Smarty变量是布尔值或数字,不要加引号,直接输出:

const isLocked = {$ticket.is_locked}; // 假设$ticket.is_locked是Smarty里的布尔值

这样Smarty会直接输出true或false,而不是字符串"true"或"false",JS可以直接使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:22:42