У меня есть сайт электронной коммерции Kentico 9. На одной из страниц процесса проверки у меня есть статическая веб-часть HTML. Содержание его поле содержит:Kentico 9 корзина ECommerceContext суммы несовместимы между макросом и макетом/.NET
<ul class="cart-total-list text-center mb0">
<li style="text-align: left;"><span>Products</span><span>{% FormatPrice(ECommerceContext.CurrentShoppingCart.TotalItemsPrice - ECommerceContext.CurrentShoppingCart.TotalItemsTax) #%}</span></li>
<li style="text-align: left;"><span>Tax</span><span>{% FormatPrice(ECommerceContext.CurrentShoppingCart.TotalTax) #%}</span></li>
<li style="text-align: left;"><span>Shipping</span><span>{% FormatPrice(ECommerceContext.CurrentShoppingCart.Shipping) #%}%}</span></li>
<li style="text-align: left;"><span>Shipping Tax</span><span>{% FormatPrice(ECommerceContext.CurrentShoppingCart.TotalShipping - ECommerceContext.CurrentShoppingCart.Shipping) #%}</span></li>
<li style="text-align: left;"><span>Total</span><span>{% FormatPrice(ECommerceContext.CurrentShoppingCart.TotalPrice) #%}</span></li>
</ul>
, который, например, производит следующий вывод:
Products $58.30
Tax $4.30
Shipping $0
Shipping Tax $16.19
Total $74.49
Это неверно. Сумма продуктов должна составлять 54 доллара США (как-то налог в размере 4,30 долларов включен.) Доставка должна составлять 15 долларов США. налог с оборота должен составлять 1,19 доллара США. (Поскольку доставка равна нулю, отображается полная сумма.) Кроме того, иногда налог отображается ноль, но входит в сумму в моей строке «Продукты».
Теперь, если я вместо того, чтобы сделать эти значения, используя C# в макете веб-части, как показано ниже:
<%@ Control Language="C#" AutoEventWireup="true" Inherits="CMSWebParts_Text_staticHTML" Codebehind="~/CMSWebParts/Text/staticHTML.ascx.cs" %>
<%
var cart = CMS.Ecommerce.ECommerceContext.CurrentShoppingCart;
%>
<asp:Literal ID="ltlText" runat="server" EnableViewState="false" />
<ul class="cart-total-list text-center mb0">
<li style="text-align: left;"><span>Products</span><span><% Response.Write(cart.GetFormattedPrice(cart.TotalItemsPrice - cart.TotalItemsTax,false)); %></span></li>
<li style="text-align: left;"><span>Tax</span><span><% Response.Write(cart.GetFormattedPrice(cart.TotalTax,false)); %></span></li>
<li style="text-align: left;"><span>Shipping</span><span><% Response.Write(cart.GetFormattedPrice(cart.Shipping,false)); %></span></li>
<li style="text-align: left;"><span>Shipping Tax</span><span><% Response.Write(cart.GetFormattedPrice(cart-TotalShipping - cart.Shipping,false)); %></span></li>
<li style="text-align: left;"><span>Total</span><span><% Response.Write(cart.GetFormattedPrice(cart.TotalPrice,false)); %></span></li>
</ul>
я получаю следующие значения:
Products $54.00
Tax $4.30
Shipping $15.00
Shipping Tax $1.19
Total $74.49
Это именно то, что я ожидал.
Почему разница? Я могу, конечно, придерживаться последнего подхода, но я обеспокоен тем, что что-то нарушено и может иметь будущие побочные эффекты.
UPDATE: я пошел с custom macro field вместо метода пользовательских макросов. Я просто добавил следующий класс в свою папку old_app_code. (потому что у меня есть предварительно скомпилированное веб-приложение). Кажется, он работает по своему желанию.
using System;
using CMS.Base;
using CMS.MacroEngine;
using CMS.EventLog;
[MacroLoader]
public partial class CMSModuleLoader
{
/// <summary>
/// Attribute class for registering custom macro extensions.
/// </summary>
private class MacroLoaderAttribute : CMSLoaderAttribute
{
private const string EVENT_SOURCE = "MacroLoaderAttribute";
private const string EVENT_CODE = "EXCEPTION";
/// <summary>
/// Called automatically when the application starts.
/// </summary>
public override void Init()
{
MacroContext.GlobalResolver.SetNamedSourceDataCallback("CartShipping", CartShipping);
MacroContext.GlobalResolver.SetNamedSourceDataCallback("CartTotalItemsTax", CartTotalItemsTax);
}
private object CartShipping(EvaluationContext context)
{
double retVal = 0d;
try
{
retVal = CMS.Ecommerce.ECommerceContext.CurrentShoppingCart.Shipping;
}
catch (Exception ex)
{
EventLogProvider.LogException(EVENT_SOURCE, EVENT_CODE, ex);
}
return retVal;
}
public static object CartTotalItemsTax(EvaluationContext context)
{
double retVal = 0d;
try
{
retVal = CMS.Ecommerce.ECommerceContext.CurrentShoppingCart.TotalItemsTax;
}
catch (Exception ex)
{
EventLogProvider.LogException(EVENT_SOURCE, EVENT_CODE, ex);
}
return retVal;
}
}
}
В настоящее время CartShipping и CartTotalItemsTax доступны для использования в макро-выражениях.
Я пошел с [настраиваемым полем макроса] (https://docs.kentico.com/k9/macro-expressions/extending-the-macro-engine/adding-custom-macro-fields) вместо настраиваемого метода макросов. Кажется, он работает по своему желанию. –