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

如何在Twig中计算多张未付发票的总金额?

解决Twig中未付发票总额计算问题

有两种简单的方法可以实现未付发票总额的累加,适合新手快速上手:

方法1:循环内累加变量

先初始化一个总和变量,在遍历发票的过程中逐步累加每笔发票的金额,最后统一展示:

修改你的代码如下:

<td align="right" class="text-danger fw-bold"><b>{{ 'Students Unpaid Invoice Number'|trans }}</b></td>
<th>{{ 'Amount'|trans }}</th>
<th>{{ 'Issued on'|trans }}</th>
<th>{{ 'Status'|trans }}</th>
</tr>
{% set invoices = admin.invoice_get_list({ "status":"unpaid", 'per_page': '100', 'client_id': client.id }) %}
{# 初始化总额变量为0 #}
{% set total_unpaid = 0 %}
{% for invoice in invoices.list %}
{# 每次循环累加当前发票金额 #}
{% set total_unpaid = total_unpaid + invoice.total %}
<tr>
    <td align="right">
        <a href="{{ '/invoice/manage'|alink }}/{{ invoice.id }}">{{ invoice.serie_nr }}</a>
    </td>
    <td>{{ mf.currency_format( invoice.total, invoice.currency) }}</td>
    <td>{{ invoice.created_at|format_date }}</td>                            
    <td>{% if invoice.status == 'unpaid' %}
        <span class="badge bg-danger me-1"></span>
        {% endif %}
        {{ mf.status_name(invoice.status) }} </td>
</tr>
{% else %}
<tr>
 <td colspan="6">{{ 'The list is empty'|trans }}</td>
</tr>
{% endfor %}
{# 展示总欠款金额 #}
{% if invoices.list is not empty %}
<tr>
    <td align="right" class="text-danger fw-bold"><b>{{ 'Total Unpaid'|trans }}</b></td>
    <td>{{ mf.currency_format(total_unpaid, invoices.list[0].currency) }}</td>
    <td colspan="2"></td>
</tr>
{% endif %}
</td>
</tr>

方法2:使用Twig的reduce过滤器(更简洁)

利用Twig内置的reduce过滤器直接对发票数组求和,不需要循环内手动累加:

修改后的代码片段:

<td align="right" class="text-danger fw-bold"><b>{{ 'Students Unpaid Invoice Number'|trans }}</b></td>
<th>{{ 'Amount'|trans }}</th>
<th>{{ 'Issued on'|trans }}</th>
<th>{{ 'Status'|trans }}</th>
</tr>
{% set invoices = admin.invoice_get_list({ "status":"unpaid", 'per_page': '100', 'client_id': client.id }) %}
{% for invoice in invoices.list %}
<tr>
    <td align="right">
        <a href="{{ '/invoice/manage'|alink }}/{{ invoice.id }}">{{ invoice.serie_nr }}</a>
    </td>
    <td>{{ mf.currency_format( invoice.total, invoice.currency) }}</td>
    <td>{{ invoice.created_at|format_date }}</td>                            
    <td>{% if invoice.status == 'unpaid' %}
        <span class="badge bg-danger me-1"></span>
        {% endif %}
        {{ mf.status_name(invoice.status) }} </td>
</tr>
{% else %}
<tr>
 <td colspan="6">{{ 'The list is empty'|trans }}</td>
</tr>
{% endfor %}
{# 用reduce计算总额 #}
{% if invoices.list is not empty %}
{% set total_unpaid = invoices.list|reduce((sum, invoice) => sum + invoice.total, 0) %}
<tr>
    <td align="right" class="text-danger fw-bold"><b>{{ 'Total Unpaid'|trans }}</b></td>
    <td>{{ mf.currency_format(total_unpaid, invoices.list[0].currency) }}</td>
    <td colspan="2"></td>
</tr>
{% endif %}
</td>
</tr>

注意事项

  • 假设所有未付发票使用同一种货币,如果存在多货币场景,需要额外按货币分组求和(你提到未付发票仅2-5张,大概率是同一货币)
  • 两种方法都判断了发票列表不为空时才展示总额,避免空数组报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:13:18