示例#1
0
        public string GenerateProductLink(long?productId, out object matchingProductPage)
        {
            string ret;
            var    cacheKey = string.Format("{0} {1} {2} {3}",
                                            WebSession.Current.SiteId, WebSession.Current.LanguageCode, "ProductLink", productId);

            if (!_urlCache.TryGet(cacheKey, out ret))
            {
                try
                {
                    var prodPages = CmsFinder.FindDescendentsOrFallbackOfCurrentPageLanguageRoot <ProductPage>();
                    if (prodPages.All(pp => !string.IsNullOrEmpty(pp.ProductID)))
                    {
                        // find a product page from the root level that has no product ID
                        var page = CmsFinder.FindAllNonSiteDescendentsOfRoot <ProductPage>()
                                   .LastOrDefault(pp => string.IsNullOrEmpty(pp.ProductID));

                        if (page != null)
                        {
                            prodPages.Add(page);
                        }
                    }

                    var targetProductPage =
                        prodPages.FirstOrDefault(
                            pp => pp.ProductID.Split().Any(pid => pid.Equals(productId.ToString(), StringComparison.InvariantCultureIgnoreCase))) ??
                        prodPages.LastOrDefault(pp => pp.ProductID.Length == 0);

                    if (targetProductPage == null)
                    {
                        ret = null;
                    }
                    else
                    {
                        var url = new Url(GetNormalizedPageUrl(targetProductPage));

                        if ((string.IsNullOrEmpty(targetProductPage.ProductID) || targetProductPage.ProductID.Split().Length > 1) &&
                            productId != null)
                        {
                            url = url.Append(productId.ToString());
                        }

                        ret = url.ToString();
                    }

                    AddCache(cacheKey, ret, targetProductPage);
                }
                catch (Exception e)
                {
                    _logger.Error(e, "Unable to create product link for product {0}", productId);
                }
            }

            _itemCache.TryGet(cacheKey, out matchingProductPage);

            return(ret);
        }