如何在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
相关产品推荐
相关产品推荐

