Пример #1
0
        public void Evaluate(EvaluateContext context)
        {
            context.For <IShoppingCart>("Cart")
            .Token("Items", c => string.Join(T(", ").Text,
                                             (c ?? _shoppingCart).GetProducts().Select(p => p.ToString())))
            .Chain("Items", "CartItems", c => (c ?? _shoppingCart).GetProducts())
            .Token("Country", c => (c ?? _shoppingCart).Country)
            .Token("ZipCode", c => (c ?? _shoppingCart).ZipCode)
            .Token("Shipping", c => (c ?? _shoppingCart).ShippingOption.ToString())
            .Chain("Shipping", "ShippingOption", c => (c ?? _shoppingCart).ShippingOption)
            .Token("Subtotal", c => _currencyProvider.GetPriceString((c ?? _shoppingCart).Subtotal()))
            .Token("Taxes", c => {
                var taxes = (c ?? _shoppingCart).Taxes();
                return(taxes == null ? _currencyProvider.GetPriceString(0.0) : _currencyProvider.GetPriceString(taxes.Amount));
            })
            .Chain("Taxes", "TaxAmount", c => (c ?? _shoppingCart).Taxes() ?? new TaxAmount {
                Amount = 0, Name = ""
            })
            .Token("Total", c => _currencyProvider.GetPriceString((c ?? _shoppingCart).Total()))
            .Token("Count", c => (c ?? _shoppingCart).ItemCount());

            context.For <IEnumerable <ShoppingCartQuantityProduct> >("CartItems")
            .Token(s => s.StartsWith("Format:", StringComparison.OrdinalIgnoreCase) ? s.Substring("Format:".Length) : null,
                   (s, q) => {
                var separator  = "";
                var colonIndex = s.IndexOf(':');
                if (colonIndex != -1 && s.Length > colonIndex + 1)
                {
                    separator = s.Substring(0, colonIndex);
                    s         = s.Substring(colonIndex + 1);
                }
                var format = s
                             .Replace("$quantity", "{0}")
                             .Replace("$sku", "{1}")
                             .Replace("$product", "{2}")
                             .Replace("$price", "{3}");
                return(String.Join(separator, q.Select(qp =>
                                                       String.Format(format,
                                                                     qp.Quantity,
                                                                     qp.Product.Sku,
                                                                     qp.Product.As <TitlePart>().Title + " " +
                                                                     string.Join(", ",
                                                                                 qp.AttributeIdsToValues.Select(kvp =>
                                                                                                                "[{{" + kvp.Key + "}} " +
                                                                                                                _contentManager.GetItemMetadata(_contentManager.Get(kvp.Key)).DisplayText
                                                                                                                + ": " + kvp.Value.ToString() + "]")
                                                                                 ),
                                                                     _currencyProvider.GetPriceString(qp.Price)))));
            });

            context.For <ShippingOption>("ShippingOption")
            .Token("Price", option => _currencyProvider.GetPriceString(option.Price))
            .Token("Description", option => option.Description)
            .Chain("Description", "Text", option => option.Description)
            .Token("Company", option => option.ShippingCompany)
            .Chain("Company", "Text", option => option.ShippingCompany);

            context.For <TaxAmount>("TaxAmount")
            .Token("Name", amount => amount.Name)
            .Chain("Name", "Text", amount => amount.Name)
            .Token("Amount", amount => _currencyProvider.GetPriceString(amount.Amount));

            context.For <ShoppingCartItem>("Item")
            .Token(s => s.StartsWith("Format:", StringComparison.OrdinalIgnoreCase) ? s.Substring("Format:".Length) : null,
                   (s, sci) => {
                var colonIndex = s.IndexOf(':');
                if (colonIndex != -1 && s.Length > colonIndex + 1)
                {
                    s = s.Substring(colonIndex + 1);
                }
                var format = s
                             .Replace("$quantity", "{0}")
                             .Replace("$sku", "{1}")
                             .Replace("$product", "{2}")
                             .Replace("$price", "{3}");
                var product = _contentManager.Get <ProductPart>(sci.ProductId);
                return(string.Format(format,
                                     sci.Quantity,
                                     product.Sku,
                                     product.As <TitlePart>().Title + " " +
                                     string.Join(", ",
                                                 sci.AttributeIdsToValues.Select(kvp =>
                                                                                 "[{{" + kvp.Key + "}} " +
                                                                                 _contentManager.GetItemMetadata(_contentManager.Get(kvp.Key)).DisplayText
                                                                                 + ": " + kvp.Value.ToString() + "]")
                                                 ),
                                     _currencyProvider.GetPriceString(product.Price)));
            });
        }