2017-01-11 10 views
2

У меня есть сайт электронной коммерции 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 доступны для использования в макро-выражениях.

ответ

2

Я могу подтвердить TotalItemsTax и Shipping свойства не зарегистрированы для макросов в ShoppingCartInfo объекта, поэтому макрос двигатель вернет 0 для них. Это приводит к неправильным вычислениям в макросах, в то время как в стандартном коде ascx это работает.
Дополнительная регистрация свойств типов объектов системы для макросов не всегда возможна, поэтому, если вы хотите перейти с макросами K #, я бы рекомендовал создать настраиваемый метод макросов (см. https://docs.kentico.com/k9/macro-expressions/extending-the-macro-engine/registering-custom-macro-methods), где вы бы назвали стандартный API в C# (например, свойства ECommerceContext.CurrentShoppingCart) со всеми доступными свойствами. Вы даже можете вернуть полученное значение (вычитание налога из суммы) напрямую, а не делать это в разметке или преобразовании.

Надеюсь, это поможет ...

+0

Я пошел с [настраиваемым полем макроса] (https://docs.kentico.com/k9/macro-expressions/extending-the-macro-engine/adding-custom-macro-fields) вместо настраиваемого метода макросов. Кажется, он работает по своему желанию. –

3

Не все свойства CurrentShoppingCart Элемент существует в макрообъекте K #. Например, TotalItemsTax не существует, поэтому для этого он возвращает 0. То же самое с доставкой. Вот почему у вас есть разница. Все доступные свойства, которые можно увидеть в приложении System -> Макросы -> Консоль

enter image description here

+0

Спасибо!Это был полезный ответ, но я выбрал ответ Зденек, потому что он направил меня к решению сделать данные доступными для макросов. –