从ShoppingCart中的SKUInfo对象访问产品的自定义字段

时间:2016-06-13 03:35:49

标签: c# e-commerce kentico

我们在产品页面上有自定义字段和非自定义字段以及数千种产品(约250,000多种产品)。有关产品的信息包含仓库和仅属性类型信息等内容。当我查看购物车中的商品时,我无法访问任何这些自定义字段。

我尝试了显而易见的printf("1\n"); ,它返回ShoppingCart.CartItems[0].GetValue("Warehouse")。我还尝试了null,它也会返回ShoppingCart.CartItems[0].SKU.GetValue("Warehouse")

当我转到Pages应用程序然后转到产品页面,然后到表单选项卡,我可以看到所有SKU字段和我的自定义字段。

2 个答案:

答案 0 :(得分:1)

的自定义字段
  

ShoppingCartItemInfo

不可用,因为它们存储在不同的(耦合)表中。例如,您可以在购物车中使用不同类型的产品(移动设备,笔记本电脑,键盘......),默认情况下自定义字段未加载

您可以使用以下代码获取自定义字段:

        string culture = "en-US";
        var tree = new TreeProvider(MembershipContext.AuthenticatedUser);

        foreach (var shoppingCartItem in ECommerceContext.CurrentShoppingCart.CartItems)
        {
            // we need to get class name of item in shopping cart
            var productWithClassName = tree.SelectNodes()
                .Where("NodeSKUID", QueryOperator.Equals, shoppingCartItem.SKUID)
                .And()
                .Where("DocumentCulture", QueryOperator.Equals, culture)
                .Take(1)
                .FirstOrDefault();

            if (productWithClassName != null)
            {
                var product = tree.SelectSingleNode(productWithClassName.NodeID, culture);

                if (product != null)
                {                        
                    var customField = product.GetStringValue("CustomField", "-");
                }
            }
        }

正如您所看到的那样,它有点复杂,因为为了让您访问自定义字段,您需要获得与产品关联的节点,然后您需要获取此节点的耦合数据。

旁注 - 建议不要在Kentico 8中存储250k文档,因为实际上内容树的大小有一些限制。根据经验,建议在Kentico 8中使用100k文档,在单个节点下最多使用1 000个直接子文档。

很可能您会遇到如此大量产品的性能问题。如果你不能重新构造内容(=自定义类或自定义表),那么一定要非常积极地使用缓存。

答案 1 :(得分:0)

你想用它的地方?

如果在静态文本或K#中,这对我有效:

EcommerceContext.CurrentShoppingCart.ShoppingCartItems[0].SKU.CustomFieldName

CMSCheckoutWebPart中的c#与您的作品类似的功能:

ShoppingCart.CartItems.FirstOrDefault().SKU.GetValue<string>("CustomFieldName","")