无法在 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... 根本无效。您遇到的问题是一个很好的例子,说明为什么不应该将用于格式化输出的模板语言用于执行业务逻辑,就像您示例中的税收计算一样。

真的,我认为最正确的解决方案是放弃 summultiply 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供参考。