无法在 sum handlebar 的助手中使用 if 条件
Not able to use if condition inside sum handlebar's helper
在我们公司,我们使用 Celigo 中间件将来自 eshop(美国分公司)的订单输入我们的会计系统(欧盟总部)。
他们在这两个系统之间使用有点棘手的字段映射过程,如果你想使用条件或他们使用把手的任何其他功能:https://docs.celigo.com/hc/en-us/articles/360039326071-Handlebars-helper-reference link 到他们的文档和基本助手等
当我想计算税率总和时,我遇到了这种情况,但只有当税额大于零时...例如,在美国你可以有四种不同的税率,但是只有两到三种运费它们中的一个已应用,但在有效负载中所有四个都可用,因此我想过滤掉金额为零的费率。
没有条件的原车把:
{{#if shipping_lines_1.price}}
{{multiply
(sum shipping_lines_1.tax_lines.[0].rate
shipping_lines_1.tax_lines.[1].rate
shipping_lines_1.tax_lines.[2].rate
shipping_lines_1.tax_lines.[3].rate)
100}}
{{/if}}
关于“shipping_lines”的部分负载:
{"shipping_lines_1":
{"id": 1111111111,"carrier_identifier": null,"code": "Standard Shipping","delivery_category": null,"discounted_price": "8.90","discounted_price_set": {"shop_money": {"amount": "8.90","currency_code": "USD"},"presentment_money": {"amount": "8.90","currency_code": "USD"}},"phone": null,"price": "8.90","price_set": {"shop_money": {"amount": "8.90","currency_code": "USD"},"presentment_money": {"amount": "8.90","currency_code": "USD"}},"requested_fulfillment_service_id": null,"source": "shopify","title": "Standard Shipping",
"tax_lines": [
{"price": 0.09,
"price_set": {"shop_money": {"amount": "0.09","currency_code": "USD"},"presentment_money": {"amount": "0.09","currency_code": "USD"}},
"rate": 0.0625,
"title": "IL STATE TAX"},
{"price": 0.00,
"price_set": {"shop_money": {"amount": "0.00","currency_code": "USD"},"presentment_money": {"amount": "0.00","currency_code": "USD"}},
"rate": 0,
"title": "IL COUNTY TAX"},
{"price": 0.00,
"price_set": {"shop_money": {"amount": "0.00","currency_code": "USD"},"presentment_money": {"amount": "0.00","currency_code": "USD"}},
"rate": 0.01,
"title": "IL CITY TAX"},
{"price": 0.07,
"price_set": {"shop_money": {"amount": 0.07,"currency_code": "USD"},"presentment_money": {"amount": "0.07","currency_code": "USD"}},
"rate": 0.0075,
"title": "IL SPECIAL TAX"}],
"discount_allocations": []
}}
如您所见,名称为“IL CITY TAX”的税码的税率为 0.01,但金额为零,当进口运费税率为 8% 而不是 7%
时,这会导致会计系统计算错误
所以我添加了条件来首先检查税收 amount/price ,然后在税额大于零时计算税率总和(在他们的系统中 0 或 0.00 也被认为是虚假的,当你使用#if):
{{#if shipping_lines_1.price}}
{{multiply
(sum
({{#if shipping_lines_1.tax_lines.[0].price}}{{shipping_lines_1.tax_lines.[0].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[1].price}}{{shipping_lines_1.tax_lines.[1].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[2].price}}{{shipping_lines_1.tax_lines.[2].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[3].price}}{{shipping_lines_1.tax_lines.[3].rate}}{{else}}0{{/if}})
)100
}}
{{else}}0{{/if}}
不幸的是,我总是得到一个错误:“无法编译句柄栏...第 4 行出现解析错误...期待 'ID'、'STRING'、'NUMBER'、'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', 得到 'OPEN_BLOCK'"
“求和”和“乘法”helpers/functions 已经按照上面附带的文档在中间件系统中实现。据我所知,我无法注册任何额外的助手,但是我在 http://tryhandlebarsjs.com/ 上测试了以下注册助手:
Handlebars.registerHelper("multiply",function(a, b) {
return Number(a) * Number(b);
});
Handlebars.registerHelper("sum", function() {
var args = [].concat.apply([], arguments);
var len = args.length;
var sum = 0;
while (len--) {
if (!isNaN(args[len])) {
sum += Number(args[len]);
}
}
return sum;
});
我的问题是:Handlebars 是否有任何限制,我是不是很笨,我没有看到缺少的括号,我应该采用其他方法求和函数还是其他任何方法?
请问您对车把有什么想法可以解决这个问题吗?
提前谢谢你。
Handlebars 不支持相互嵌套 mustache 表达式。所以 {{multiply... {{#if...
根本无效。您遇到的问题是一个很好的例子,说明为什么不应该将用于格式化输出的模板语言用于执行业务逻辑,就像您示例中的税收计算一样。
真的,我认为最正确的解决方案是放弃 sum
和 multiply
Handlebars 助手并在 JavaScript 中执行税收计算并将结果传递给 Handlebars 进行格式化.
如果出于某种原因,这不是一个选项,并且您绝对必须在模板中执行此计算,那么您将需要编写一个带有三个参数的自定义帮助程序,如果第一个为真,returns第二个,否则returns第三个。
助手会很简单:
Handlebars.registerHelper("ifThenElse", function (condition, ifTrue, ifFalse) {
return condition ? ifTrue : ifFalse;
});
然后您可以在模板中将助手用作 Handlebars Subexpression,这样您就可以嵌套助手:
{{#if shipping_lines_1.price}}
{{multiply
(sum
(ifThenElse shipping_lines_1.tax_lines.[0].price shipping_lines_1.tax_lines.[0].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[1].price shipping_lines_1.tax_lines.[1].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[2].price shipping_lines_1.tax_lines.[2].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[3].price shipping_lines_1.tax_lines.[3].rate 0)
)
100
}}
{{/if}}
我创建了一个fiddle供参考。
在我们公司,我们使用 Celigo 中间件将来自 eshop(美国分公司)的订单输入我们的会计系统(欧盟总部)。 他们在这两个系统之间使用有点棘手的字段映射过程,如果你想使用条件或他们使用把手的任何其他功能:https://docs.celigo.com/hc/en-us/articles/360039326071-Handlebars-helper-reference link 到他们的文档和基本助手等
当我想计算税率总和时,我遇到了这种情况,但只有当税额大于零时...例如,在美国你可以有四种不同的税率,但是只有两到三种运费它们中的一个已应用,但在有效负载中所有四个都可用,因此我想过滤掉金额为零的费率。
没有条件的原车把:
{{#if shipping_lines_1.price}}
{{multiply
(sum shipping_lines_1.tax_lines.[0].rate
shipping_lines_1.tax_lines.[1].rate
shipping_lines_1.tax_lines.[2].rate
shipping_lines_1.tax_lines.[3].rate)
100}}
{{/if}}
关于“shipping_lines”的部分负载:
{"shipping_lines_1":
{"id": 1111111111,"carrier_identifier": null,"code": "Standard Shipping","delivery_category": null,"discounted_price": "8.90","discounted_price_set": {"shop_money": {"amount": "8.90","currency_code": "USD"},"presentment_money": {"amount": "8.90","currency_code": "USD"}},"phone": null,"price": "8.90","price_set": {"shop_money": {"amount": "8.90","currency_code": "USD"},"presentment_money": {"amount": "8.90","currency_code": "USD"}},"requested_fulfillment_service_id": null,"source": "shopify","title": "Standard Shipping",
"tax_lines": [
{"price": 0.09,
"price_set": {"shop_money": {"amount": "0.09","currency_code": "USD"},"presentment_money": {"amount": "0.09","currency_code": "USD"}},
"rate": 0.0625,
"title": "IL STATE TAX"},
{"price": 0.00,
"price_set": {"shop_money": {"amount": "0.00","currency_code": "USD"},"presentment_money": {"amount": "0.00","currency_code": "USD"}},
"rate": 0,
"title": "IL COUNTY TAX"},
{"price": 0.00,
"price_set": {"shop_money": {"amount": "0.00","currency_code": "USD"},"presentment_money": {"amount": "0.00","currency_code": "USD"}},
"rate": 0.01,
"title": "IL CITY TAX"},
{"price": 0.07,
"price_set": {"shop_money": {"amount": 0.07,"currency_code": "USD"},"presentment_money": {"amount": "0.07","currency_code": "USD"}},
"rate": 0.0075,
"title": "IL SPECIAL TAX"}],
"discount_allocations": []
}}
所以我添加了条件来首先检查税收 amount/price ,然后在税额大于零时计算税率总和(在他们的系统中 0 或 0.00 也被认为是虚假的,当你使用#if):
{{#if shipping_lines_1.price}}
{{multiply
(sum
({{#if shipping_lines_1.tax_lines.[0].price}}{{shipping_lines_1.tax_lines.[0].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[1].price}}{{shipping_lines_1.tax_lines.[1].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[2].price}}{{shipping_lines_1.tax_lines.[2].rate}}{{else}}0{{/if}})
({{#if shipping_lines_1.tax_lines.[3].price}}{{shipping_lines_1.tax_lines.[3].rate}}{{else}}0{{/if}})
)100
}}
{{else}}0{{/if}}
不幸的是,我总是得到一个错误:“无法编译句柄栏...第 4 行出现解析错误...期待 'ID'、'STRING'、'NUMBER'、'BOOLEAN', 'UNDEFINED', 'NULL', 'DATA', 得到 'OPEN_BLOCK'"
“求和”和“乘法”helpers/functions 已经按照上面附带的文档在中间件系统中实现。据我所知,我无法注册任何额外的助手,但是我在 http://tryhandlebarsjs.com/ 上测试了以下注册助手:
Handlebars.registerHelper("multiply",function(a, b) {
return Number(a) * Number(b);
});
Handlebars.registerHelper("sum", function() {
var args = [].concat.apply([], arguments);
var len = args.length;
var sum = 0;
while (len--) {
if (!isNaN(args[len])) {
sum += Number(args[len]);
}
}
return sum;
});
我的问题是:Handlebars 是否有任何限制,我是不是很笨,我没有看到缺少的括号,我应该采用其他方法求和函数还是其他任何方法?
请问您对车把有什么想法可以解决这个问题吗? 提前谢谢你。
Handlebars 不支持相互嵌套 mustache 表达式。所以 {{multiply... {{#if...
根本无效。您遇到的问题是一个很好的例子,说明为什么不应该将用于格式化输出的模板语言用于执行业务逻辑,就像您示例中的税收计算一样。
真的,我认为最正确的解决方案是放弃 sum
和 multiply
Handlebars 助手并在 JavaScript 中执行税收计算并将结果传递给 Handlebars 进行格式化.
如果出于某种原因,这不是一个选项,并且您绝对必须在模板中执行此计算,那么您将需要编写一个带有三个参数的自定义帮助程序,如果第一个为真,returns第二个,否则returns第三个。
助手会很简单:
Handlebars.registerHelper("ifThenElse", function (condition, ifTrue, ifFalse) {
return condition ? ifTrue : ifFalse;
});
然后您可以在模板中将助手用作 Handlebars Subexpression,这样您就可以嵌套助手:
{{#if shipping_lines_1.price}}
{{multiply
(sum
(ifThenElse shipping_lines_1.tax_lines.[0].price shipping_lines_1.tax_lines.[0].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[1].price shipping_lines_1.tax_lines.[1].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[2].price shipping_lines_1.tax_lines.[2].rate 0)
(ifThenElse shipping_lines_1.tax_lines.[3].price shipping_lines_1.tax_lines.[3].rate 0)
)
100
}}
{{/if}}
我创建了一个fiddle供参考。