Twig语法错误排查:计算同事总工龄时遇冒号异常
问题解决:Twig语法错误与工龄计算修正
语法错误原因
你遇到的Unexpected token ":"错误,根源是错误使用createAttribute()生成formatDiff的参数——formatDiff方法需要的是关联数组类型的配置,而非Attribute对象,这种类型不匹配导致Twig解析失败。
另外,代码还存在逻辑错误:formatDiff返回的是人类可读的字符串(比如"3 years"),不是秒数,直接累加会导致数值计算完全错误。
修正后的完整代码
{% if title %} <h3>{{ title }}</h3> {% endif %} {% set total_seconds = 0 %} {# 初始化总秒数变量 #} {% for row in rows %} {% set row_classes = [ default_row_class ? 'views-row', ] %} {# 获取入职日期字段值 #} {% set date_str = row.content['#view'].style_plugin.getField(row_index, 'field_start_date') %} {% if date_str %} {% set today = date('now') %} {% set date_object = date(date_str) %} {# 直接计算时间戳差值得到秒数,无需调用formatDiff #} {% set diff_seconds = today.getTimestamp() - date_object.getTimestamp() %} {% set total_seconds = total_seconds + diff_seconds %} {# 累加到总秒数 #} <div{{ row.attributes.addClass(row_classes) }}> {{- row.content -}} </div> {% else %} <div{{ row.attributes.addClass(row_classes) }}> {{- row.content -}} </div> {% endif %} {% endfor %} {% if total_seconds > 0 %} {% set total_years = (total_seconds / (365 * 24 * 60 * 60))|round(2) %} {# 秒数转年并保留两位小数 #} <p>全体员工累计总工龄:{{ total_years }} 年</p> {% endif %}
关键修正点
- 移除
createAttribute()与formatDiff调用:直接通过时间戳相减得到秒数,这是计算时间差数值的正确方式,既避免了类型不匹配的语法错误,又保证计算逻辑准确。 - 修正数值累加逻辑:现在累加的是真实的秒数差值,后续转成年份的计算才会有效。
- 保留原有视图渲染逻辑:仅修改工龄计算部分,不影响原有员工列表的展示效果。
内容的提问来源于stack exchange,提问作者David Salerno
相关产品推荐
相关产品推荐

