コード例 #1
0
        protected virtual void ConvertVariant(ProductVariantQuery query, string key, string value)
        {
            if (key.EndsWith("-day") || key.EndsWith("-month"))
            {
                return;
            }

            var ids = key.Replace("pvari", "").SplitSafe("-");

            if (ids.Length > 3)
            {
                var variant = new ProductVariantQueryItem(value);
                variant.ProductId          = ids[0].ToInt();
                variant.BundleItemId       = ids[1].ToInt();
                variant.AttributeId        = ids[2].ToInt();
                variant.VariantAttributeId = ids[3].ToInt();

                if (key.EndsWith("-date") || key.EndsWith("-year"))
                {
                    variant.Date = ConvertToDate(key, value);
                }

                query.AddVariant(variant);
            }
        }
コード例 #2
0
        protected virtual void ConvertGiftCard(ProductVariantQuery query, string key, string value)
        {
            var elements = key.Replace("giftcard", "").SplitSafe("-");

            if (elements.Length > 2)
            {
                var giftCard = new GiftCardQueryItem(elements[2], value);
                giftCard.ProductId    = elements[0].ToInt();
                giftCard.BundleItemId = elements[1].ToInt();

                query.AddGiftCard(giftCard);
            }
        }
コード例 #3
0
        public ProductVariantQuery CreateFromQuery()
        {
            var query = new ProductVariantQuery();

            Current = query;

            if (_httpContext.Request == null)
            {
                return(query);
            }

            var languageId = _services.WorkContext.WorkingLanguage.Id;

            foreach (var item in QueryItems)
            {
                if (!item.Value.Any() || item.Key.EndsWith("-day") || item.Key.EndsWith("-month"))
                {
                    continue;
                }

                if (IsVariantKey.IsMatch(item.Key))
                {
                    ConvertVariant(query, item.Key, item.Value);
                }
                else if (IsGiftCardKey.IsMatch(item.Key))
                {
                    item.Value.Each(value => ConvertGiftCard(query, item.Key, value));
                }
                else if (IsCheckoutAttributeKey.IsMatch(item.Key))
                {
                    ConvertCheckoutAttribute(query, item.Key, item.Value);
                }
                else if (IsVariantAliasKey.IsMatch(item.Key))
                {
                    ConvertVariantAlias(query, item.Key, item.Value, languageId);
                }
                else if (item.Key.IsCaseInsensitiveEqual("pvari") &&
                         int.TryParse(item.Value.FirstOrDefault()?.NullEmpty() ?? "0", out var variantCombinationId) &&
                         variantCombinationId != 0)
                {
                    query.VariantCombinationId = variantCombinationId;
                }
                else
                {
                    ConvertItems(_httpContext.Request, query, item.Key, item.Value);
                }
            }

            return(query);
        }
コード例 #4
0
        protected virtual void ConvertVariant(ProductVariantQuery query, string key, ICollection <string> values)
        {
            var ids = key.Replace("pvari", "").SplitSafe("-");

            if (ids.Length < 4)
            {
                return;
            }

            var isDate = key.EndsWith("-date") || key.EndsWith("-year");
            var isFile = key.EndsWith("-file");
            var isText = key.EndsWith("-text");

            if (isDate || isFile || isText)
            {
                var value   = isText ? string.Join(",", values) : values.First();
                var variant = new ProductVariantQueryItem(value)
                {
                    ProductId          = ids[0].ToInt(),
                    BundleItemId       = ids[1].ToInt(),
                    AttributeId        = ids[2].ToInt(),
                    VariantAttributeId = ids[3].ToInt(),
                    IsFile             = isFile,
                    IsText             = isText
                };

                if (isDate)
                {
                    variant.Date = ConvertToDate(key, value);
                }

                query.AddVariant(variant);
            }
            else
            {
                foreach (var value in values)
                {
                    var variant = new ProductVariantQueryItem(value)
                    {
                        ProductId          = ids[0].ToInt(),
                        BundleItemId       = ids[1].ToInt(),
                        AttributeId        = ids[2].ToInt(),
                        VariantAttributeId = ids[3].ToInt()
                    };

                    query.AddVariant(variant);
                }
            }
        }
コード例 #5
0
        public ProductVariantQuery CreateFromQuery()
        {
            var query = new ProductVariantQuery();

            Current = query;

            if (_httpContext.Request == null)
            {
                return(query);
            }

            var languageId = _services.WorkContext.WorkingLanguage.Id;

            foreach (var item in QueryItems)
            {
                if (!item.Value.Any() || item.Key.EndsWith("-day") || item.Key.EndsWith("-month"))
                {
                    continue;
                }

                if (IsVariantKey.IsMatch(item.Key))
                {
                    ConvertVariant(query, item.Key, item.Value);
                }
                else if (IsGiftCardKey.IsMatch(item.Key))
                {
                    item.Value.Each(value => ConvertGiftCard(query, item.Key, value));
                }
                else if (IsCheckoutAttributeKey.IsMatch(item.Key))
                {
                    ConvertCheckoutAttribute(query, item.Key, item.Value);
                }
                else if (IsVariantAliasKey.IsMatch(item.Key))
                {
                    ConvertVariantAlias(query, item.Key, item.Value, languageId);
                }
                else
                {
                    ConvertItems(_httpContext.Request, query, item.Key, item.Value);
                }
            }

            return(query);
        }
コード例 #6
0
        protected virtual void ConvertCheckoutAttribute(ProductVariantQuery query, string key, string value)
        {
            if (key.EndsWith("-day") || key.EndsWith("-month"))
            {
                return;
            }

            var ids = key.Replace("cattr", "").SplitSafe("-");

            if (ids.Length > 0)
            {
                var attribute = new CheckoutAttributeQueryItem(ids[0].ToInt(), value);

                if (key.EndsWith("-date") || key.EndsWith("-year"))
                {
                    attribute.Date = ConvertToDate(key, value);
                }

                query.AddCheckoutAttribute(attribute);
            }
        }
コード例 #7
0
        protected virtual void ConvertCheckoutAttribute(ProductVariantQuery query, string key, ICollection <string> values)
        {
            var ids = key.Replace("cattr", "").SplitSafe("-");

            if (ids.Length <= 0)
            {
                return;
            }

            var attributeId = ids[0].ToInt();
            var isDate      = key.EndsWith("-date") || key.EndsWith("-year");
            var isFile      = key.EndsWith("-file");
            var isText      = key.EndsWith("-text");

            if (isDate || isFile || isText)
            {
                var value     = isText ? string.Join(",", values) : values.First();
                var attribute = new CheckoutAttributeQueryItem(attributeId, value)
                {
                    IsFile = isFile,
                    IsText = isText
                };

                if (isDate)
                {
                    attribute.Date = ConvertToDate(key, value);
                }

                query.AddCheckoutAttribute(attribute);
            }
            else
            {
                foreach (var value in values)
                {
                    query.AddCheckoutAttribute(new CheckoutAttributeQueryItem(attributeId, value));
                }
            }
        }
コード例 #8
0
 protected virtual void ConvertItems(HttpRequestBase request, ProductVariantQuery query, string key, ICollection <string> values)
 {
 }
コード例 #9
0
        protected virtual bool ConvertVariantAlias(ProductVariantQuery query, string key, ICollection <string> values, int languageId)
        {
            if (values.Count == 0)
            {
                return(false);
            }

            var ids = key.SplitSafe("-");
            var len = ids.Length;

            if (len < 4)
            {
                return(false);
            }

            var alias = string.Join("-", ids.Take(len - 3));

            var attributeId = _catalogSearchQueryAliasMapper.GetVariantIdByAlias(alias, languageId);

            if (attributeId == 0)
            {
                return(false);
            }

            var productId          = ids.SafeGet(len - 3).ToInt();
            var bundleItemId       = ids.SafeGet(len - 2).ToInt();
            var variantAttributeId = ids.SafeGet(len - 1).ToInt();

            if (productId == 0 || variantAttributeId == 0)
            {
                return(false);
            }

            foreach (var value in values)
            {
                // We cannot use GetVariantOptionIdByAlias. It doesn't necessarily provide a ProductVariantAttributeValue.Id associated with this product.
                //var optionId = _catalogSearchQueryAliasMapper.GetVariantOptionIdByAlias(value, attributeId, languageId);
                var    optionId   = 0;
                string valueAlias = null;
                var    valueIds   = value.SplitSafe("-");
                if (valueIds.Length >= 2)
                {
                    optionId   = valueIds.SafeGet(valueIds.Length - 1).ToInt();
                    valueAlias = string.Join("-", valueIds.Take(valueIds.Length - 1));
                }

                var variant = new ProductVariantQueryItem(optionId == 0 ? value : optionId.ToString());
                variant.ProductId          = productId;
                variant.BundleItemId       = bundleItemId;
                variant.AttributeId        = attributeId;
                variant.VariantAttributeId = variantAttributeId;
                variant.Alias = alias;

                if (optionId != 0)
                {
                    variant.ValueAlias = valueAlias;
                }

                query.AddVariant(variant);
            }

            return(true);
        }
コード例 #10
0
        protected virtual void ConvertVariantAlias(ProductVariantQuery query, string key, ICollection <string> values, int languageId)
        {
            var ids = key.SplitSafe("-");
            var len = ids.Length;

            if (len < 4)
            {
                return;
            }

            var isDate = key.EndsWith("-date") || key.EndsWith("-year");
            var isFile = key.EndsWith("-file");
            var isText = key.EndsWith("-text");

            if (isDate || isFile || isText)
            {
                ids = ids.Take(len - 1).ToArray();
                len = ids.Length;
            }

            var alias       = string.Join("-", ids.Take(len - 3));
            var attributeId = _catalogSearchQueryAliasMapper.GetVariantIdByAlias(alias, languageId);

            if (attributeId == 0)
            {
                return;
            }

            var productId          = ids.SafeGet(len - 3).ToInt();
            var bundleItemId       = ids.SafeGet(len - 2).ToInt();
            var variantAttributeId = ids.SafeGet(len - 1).ToInt();

            if (productId == 0 || variantAttributeId == 0)
            {
                return;
            }

            if (isDate || isFile || isText)
            {
                var value   = isText ? string.Join(",", values) : values.First();
                var variant = new ProductVariantQueryItem(value)
                {
                    ProductId          = productId,
                    BundleItemId       = bundleItemId,
                    AttributeId        = attributeId,
                    VariantAttributeId = variantAttributeId,
                    Alias  = alias,
                    IsFile = isFile,
                    IsText = isText
                };

                if (isDate)
                {
                    variant.Date = ConvertToDate(key, value);
                }

                query.AddVariant(variant);
            }
            else
            {
                foreach (var value in values)
                {
                    // We cannot use GetVariantOptionIdByAlias. It doesn't necessarily provide a ProductVariantAttributeValue.Id associated with this product.
                    //var optionId = _catalogSearchQueryAliasMapper.GetVariantOptionIdByAlias(value, attributeId, languageId);
                    var    optionId   = 0;
                    string valueAlias = null;

                    var valueIds = value.SplitSafe("-");
                    if (valueIds.Length >= 2)
                    {
                        optionId   = valueIds.SafeGet(valueIds.Length - 1).ToInt();
                        valueAlias = string.Join("-", valueIds.Take(valueIds.Length - 1));
                    }

                    var variant = new ProductVariantQueryItem(optionId == 0 ? value : optionId.ToString())
                    {
                        ProductId          = productId,
                        BundleItemId       = bundleItemId,
                        AttributeId        = attributeId,
                        VariantAttributeId = variantAttributeId,
                        Alias = alias
                    };

                    if (optionId != 0)
                    {
                        variant.ValueAlias = valueAlias;
                    }

                    query.AddVariant(variant);
                }
            }
        }