/// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the provider is unable to provide a url, it should return <c>null</c>.</para>
        /// </remarks>
        public virtual string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            if (!current.IsAbsoluteUri)
                throw new ArgumentException("Current url must be absolute.", "current");

            // will not use cache if previewing
            var route = umbracoContext.ContentCache.GetRouteById(id);

            if (string.IsNullOrWhiteSpace(route))
            {
                LogHelper.Warn<DefaultUrlProvider>(
                    "Couldn't find any page with nodeId={0}. This is most likely caused by the page not being published.",
                    () => id);
                return null;
            }

            // extract domainUri and path
            // route is /<path> or <domainRootId>/<path>
            var pos = route.IndexOf('/');
            var path = pos == 0 ? route : route.Substring(pos);
            var domainUri = pos == 0 ? null : DomainHelper.DomainForNode(int.Parse(route.Substring(0, pos)), current);

            // assemble the url from domainUri (maybe null) and path
            return AssembleUrl(domainUri, path, current, mode).ToString();
        }
Exemple #2
0
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="content">The published content.</param>
        /// <param name="mode">The url mode.</param>
        /// <param name="culture">A culture.</param>
        /// <param name="current">The current absolute url.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the published content is multi-lingual, gets the url for the specified culture or,
        /// when no culture is specified, the current culture.</para>
        /// <para>If the provider is unable to provide a url, it returns "#".</para>
        /// </remarks>
        public string GetUrl(IPublishedContent content, UrlProviderMode mode, string culture = null, Uri current = null)
        {
            if (content == null)
            {
                return("#");
            }

            // this the ONLY place where we deal with default culture - IUrlProvider always receive a culture
            // be nice with tests, assume things can be null, ultimately fall back to invariant
            // (but only for variant content of course)
            if (content.ContentType.VariesByCulture())
            {
                if (culture == null)
                {
                    culture = _variationContextAccessor?.VariationContext?.Culture ?? "";
                }
            }

            if (current == null)
            {
                current = _umbracoContext.CleanedUmbracoUrl;
            }

            var url = _urlProviders.Select(provider => provider.GetUrl(_umbracoContext, content, mode, culture, current))
                      .FirstOrDefault(u => u != null);

            return(url?.Text ?? "#"); // legacy wants this
        }
Exemple #3
0
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content.DocumentTypeAlias == "blogPost")
            {
                var model = new BlogPostViewModel(content);
                if (model != null)
                {
                    var date = model.PostCreation;
                    if (date != null)
                    {
                        //This will add the selected date before the node name.
                        //For example /blog/item1/ becomes /blog/28-07-2014/item1/.
                        var url = model.Content.Parent.Url;
                        if (!(url.EndsWith("/")))
                        {
                            url += "/";
                        }
                        var publishUrl = url + date.ToString("dd-MM-yyyy") + "/" + content.UrlName + "/";
                        return(publishUrl);
                    }
                }
            }

            return(null);
        }
Exemple #4
0
        private Uri AssembleUrl(string path, Uri current, UrlProviderMode mode)
        {
            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }

            Uri uri;

            if (current == null)
            {
                mode = UrlProviderMode.Relative; // best we can do
            }
            switch (mode)
            {
            case UrlProviderMode.Absolute:
                uri = new Uri(current?.GetLeftPart(UriPartial.Authority) + path);
                break;

            case UrlProviderMode.Relative:
            case UrlProviderMode.Auto:
                uri = new Uri(path, UriKind.Relative);
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(mode));
            }

            return(UriUtility.MediaUriFromUmbraco(uri));
        }
Exemple #5
0
        /// <inheritdoc />
        public virtual UrlInfo GetMediaUrl(UmbracoContext umbracoContext, IPublishedContent content,
                                           string propertyAlias,
                                           UrlProviderMode mode, string culture, Uri current)
        {
            var prop  = content.GetProperty(propertyAlias);
            var value = prop?.GetValue(culture);

            if (value == null)
            {
                return(null);
            }

            var    propType = prop.PropertyType;
            string path     = null;

            switch (propType.EditorAlias)
            {
            case Constants.PropertyEditors.Aliases.UploadField:
                path = value.ToString();
                break;

            case Constants.PropertyEditors.Aliases.ImageCropper:
                //get the url from the json format
                path = value is ImageCropperValue stronglyTyped ? stronglyTyped.Src : value.ToString();
                break;
            }

            var url = AssembleUrl(path, current, mode);

            return(url == null ? null : UrlInfo.Url(url.ToString(), culture));
        }
Exemple #6
0
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the provider is unable to provide a url, it returns "#".</para>
        /// </remarks>
        public string GetUrl(int id, Uri current, UrlProviderMode mode)
        {
            var url = _urlProviders.Select(provider => provider.GetUrl(_umbracoContext, id, current, mode))
                      .FirstOrDefault(u => u != null);

            return(url ?? "#"); // legacy wants this
        }
Exemple #7
0
        /// <summary>
        /// Initializes a new instance of the <see cref="UrlProvider"/> class with an Umbraco context and a list of url providers.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="urlProviders">The list of url providers.</param>
        /// <param name="variationContextAccessor">The current variation accessor.</param>
        /// <param name="mode">An optional provider mode.</param>
        public UrlProvider(UmbracoContext umbracoContext, IEnumerable <IUrlProvider> urlProviders, IVariationContextAccessor variationContextAccessor, UrlProviderMode mode = UrlProviderMode.Auto)
        {
            _umbracoContext           = umbracoContext ?? throw new ArgumentNullException(nameof(umbracoContext));
            _urlProviders             = urlProviders;
            _variationContextAccessor = variationContextAccessor;

            Mode = mode;
        }
        /// <summary>
        /// Gets the localized URL.
        /// </summary>
        /// <param name="umbracoContext">The umbraco context.</param>
        /// <param name="id">The identifier.</param>
        /// <param name="current">The current.</param>
        /// <param name="mode">The mode.</param>
        /// <param name="culture">The culture.</param>
        /// <returns></returns>
        /// <exception cref="System.ArgumentException">Current url must be absolute.;current</exception>
        public string GetUrl(
            UmbracoContext umbracoContext,
            int id,
            Uri current,
            UrlProviderMode mode,
            CultureInfo culture)
        {
            if (FindByUrlAliasEnabled /* && umbracoContext.IsFrontEndUmbracoRequest*/)
            {
                if (current.IsAbsoluteUri == false)
                {
                    throw new ArgumentException("Current url must be absolute.", "current");
                }

                if (OnUrlGenerating != null)
                {
                    OnUrlGeneratingEventArgs e = new OnUrlGeneratingEventArgs(umbracoContext, id, current, mode, culture);
                    OnUrlGenerating(this, e);
                    if (e.Cancel)
                    {
                        return(null);
                    }
                }

                string isoCode = culture.Name;

                // will not use cache if previewing
                bool   anyLocalizedUrl;
                string route = _routingHelper.GetRouteById(
                    umbracoContext,
                    umbracoContext.InPreviewMode,
                    id,
                    isoCode,
                    out anyLocalizedUrl);

                // NO! We want to localize it because of Surface/Api Controller!
                //if (anyLocalizedUrl == false) return null; // other provider should take care of it

                if (string.IsNullOrWhiteSpace(route))
                {
                    LogHelper.Debug <AliasUrlProvider>(
                        "Couldn't find any page with contentId={0}. This is most likely caused by the page not being published.",
                        () => id);
                    return(null);
                }

                // assemble the url from domainUri (maybe null) and path
                return(_routingHelper.AssembleUrl(
                           route: route,
                           current: current,
                           mode: mode,
                           isoCode: isoCode));
            }
            else
            {
                return(null);                // Other provider should take care of it.
            }
        }
 /// <summary>
 /// Gets the nice url of a custom routed published content item
 /// </summary>        
 public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
 {
     if (umbracoContext.PublishedContentRequest == null) return null;
     if (umbracoContext.PublishedContentRequest.PublishedContent == null) return null;
     var virtualPage = umbracoContext.PublishedContentRequest.PublishedContent as DialogueVirtualPage;
     if (virtualPage == null) return null;
     //if the ids match, then return the assigned url
     return id == virtualPage.Id ? virtualPage.Url : null;
 }
Exemple #10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="UrlProvider"/> class with an Umbraco context and a list of url providers.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="urlProviders">The list of url providers.</param>
        /// <param name="provider"></param>
        public UrlProvider(UmbracoContext umbracoContext, IEnumerable<IUrlProvider> urlProviders, UrlProviderMode provider = UrlProviderMode.Auto)
        {
            if (umbracoContext == null) throw new ArgumentNullException("umbracoContext");

            _umbracoContext = umbracoContext;
            _urlProviders = urlProviders;

            Mode = provider;
        }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);
            if (content != null && content.DocumentTypeAlias == "Home" && content.Parent != null)
            {
                //The home node will have / instead of /home/.
                return content.Parent.Url;
            }

            return null;
        }
        public async Task<string> GetUrlAsync(Guid id, Uri current, UrlProviderMode mode)
        {
            if (!current.IsAbsoluteUri)
                throw new ArgumentException("Current url must be absolute.", "current");

            // will not use cache if previewing
            var route = await _contentCache.GetRouteByIdAsync(false, id);            
            if (route == null) return null;

            return route;
        }
Exemple #13
0
        /// <summary>
        /// Initializes a new instance of the <see cref="UrlProvider"/> class with an Umbraco context and a list of url providers.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="urlProviders">The list of url providers.</param>
        /// <param name="provider"></param>
        public UrlProvider(UmbracoContext umbracoContext, IEnumerable <IUrlProvider> urlProviders, UrlProviderMode provider = UrlProviderMode.Auto)
        {
            if (umbracoContext == null)
            {
                throw new ArgumentNullException("umbracoContext");
            }

            _umbracoContext = umbracoContext;
            _urlProviders   = urlProviders;

            Mode = provider;
        }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content != null && content.DocumentTypeAlias == "Home" && content.Parent != null)
            {
                //The home node will have / instead of /home/.
                return(content.Parent.Url);
            }

            return(null);
        }
Exemple #15
0
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content == null)
            {
                LogHelper.Warn(MethodBase.GetCurrentMethod().DeclaringType, $"Couldn't find any page with nodeId={id}. This is most likely caused by the page not being published.");
                return(null);
            }

            if (IsIgnored(content))
            {
                return(null);
            }

            var domain    = UrlHelper.GetUmbracoDomain(current);
            var domainUri = UrlHelper.GetUri(current, domain);

            string cultureName = null;

            if (CultureFromUrlService.Current.IsCultureFromUrlEnabled)
            {
                cultureName = CultureFromUrlService.Current.GetCultureInfo(current, VortoUrlService.Current.FallbackCultureName)?.Name;
            }
            else
            {
                cultureName = domain?.LanguageIsoCode ?? VortoUrlService.Current.FallbackCultureName;
            }

            var rootContentId = GetRootContentId(current, domain);

            var ancestorsAndContent = content.Ancestors()
                                      .Where(x => x.Parent != null)
                                      .SortByParent()
                                      .ToList();

            if (content.Id != rootContentId)
            {
                ancestorsAndContent.Add(content);
            }

            var url = GetRelativeUrl(ancestorsAndContent, cultureName);

            if (CultureFromUrlService.Current.IsCultureFromUrlEnabled)
            {
                url = $"/{cultureName}{url}";
            }

            var prefix = mode == UrlProviderMode.Relative ? string.Empty : domainUri;

            return(UrlHelper.CombinePaths(prefix, url.ToLower(), VortoUrlService.Current.IsTrimUrlTrailingSlashEnabled));
        }
        /// <summary>
        /// The get url.
        /// </summary>
        /// <param name="umbracoContext">
        /// The umbraco context.
        /// </param>
        /// <param name="id">
        /// The id.
        /// </param>
        /// <param name="current">
        /// The current.
        /// </param>
        /// <param name="mode">
        /// The mode.
        /// </param>
        /// <returns>
        /// The <see cref="string"/>.
        /// </returns>
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            UmbracoContext.Current.Application.ApplicationCache.RequestCache.ClearCacheItem("MultilingualUrlProvider-GetUrl-" + id);

            return(UmbracoContext.Current.Application.ApplicationCache.RequestCache.GetCacheItem <string>(
                       "MultilingualUrlProvider-GetUrl-" + id,
                       () =>
            {
                var content = umbracoContext.ContentCache.GetById(id) as Umbraco.Web.PublishedContentModels.Master;

                if (content != null)
                {
                    var domains =
                        ApplicationContext.Current.Services.DomainService.GetAll(true)
                        .OrderBy(x => x.Id)
                        .ToList();

                    if (domains.Any())
                    {
                        // Don't use umbracoContext.PublishedContentRequest.Culture because this code is also called in the backend.
                        //var currentCulture = Thread.CurrentThread.CurrentCulture.ToString();
                        var currentCulture = new UmbracoHelper(umbracoContext).CultureDictionary.Culture.Name;
                        // On the frontend get the domain that matches the current culture. We could also check the domain name, but for now the culture is enough.
                        // Otherwise just get the first domain. The urls for the other domains are generated in the GetOtherUrls method.
                        //var domain = UmbracoContext.Current.IsFrontEndUmbracoRequest
                        //                 ? domains.First(x => x.LanguageIsoCode.InvariantEquals(currentCulture))
                        //                 : domains.First();

                        var domain = domains.First(x => x.LanguageIsoCode.InvariantEquals(currentCulture));

                        if (content.DocumentTypeAlias.InvariantEquals(MainPage.ModelTypeAlias))
                        {
                            // Return the domain if we're on the homepage because on that node we've added the domains.
                            return domain.DomainName.EnsureEndsWith("/");
                        }
                        // Get the parent url and add the url segment of this culture.
                        if (content.Parent != null)
                        {
                            var parentUrl = umbracoContext.UrlProvider.GetUrl(content.Parent.Id);
                            var urlSegment = content.GetUrlSegment(domain.LanguageIsoCode);
                            return parentUrl.EnsureEndsWith("/") + urlSegment;
                        }
                        else
                        {
                            return domain.DomainName.EnsureEndsWith("/") + content.GetUrlSegment(domain.LanguageIsoCode);
                        }
                    }
                }

                return null;
            }));
        }
Exemple #17
0
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the provider is unable to provide a url, it returns "#".</para>
        /// </remarks>
        public async Task <string> GetUrlAsync(Guid id, Uri current, UrlProviderMode mode)
        {
            foreach (var provider in _urlProviders)
            {
                var result = await provider.GetUrlAsync(id, current, mode);

                if (result != null)
                {
                    return(result);
                }
            }
            return(null);
        }
Exemple #18
0
 /// <summary>
 /// Gets the localized URL by the thread's current ui culture.
 /// </summary>
 /// <param name="umbracoContext">The umbraco context.</param>
 /// <param name="id">The identifier.</param>
 /// <param name="current">The current.</param>
 /// <param name="mode">The mode.</param>
 /// <returns></returns>
 /// <exception cref="System.ArgumentException">Current url must be absolute.;current</exception>
 public string GetUrl(
     UmbracoContext umbracoContext,
     int id,
     Uri current,
     UrlProviderMode mode)
 {
     return(this.GetUrl(
                umbracoContext: umbracoContext,
                id: id,
                current: current,
                mode: mode,
                culture: Thread.CurrentThread.CurrentUICulture));
 }
Exemple #19
0
 public OnUrlGeneratingEventArgs(
     UmbracoContext umbracoContext,
     int id,
     Uri current,
     UrlProviderMode mode = UrlProviderMode.Auto,
     CultureInfo culture  = null)
 {
     UmbracoContext  = umbracoContext;
     Id              = id;
     CurrentUri      = current;
     UrlProviderMode = mode;
     Culture         = culture;
     Cancel          = false;
 }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content == null)
            {
                return(null);
            }
            if (content.IsContainer())
            {
                return("#");
            }

            return(null);
        }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);
            if (content != null && content.DocumentTypeAlias == "Home" && content.Parent != null)
            {
                //The home node will have / instead of /home/.
                if (UrlProviderMode.Absolute == mode)
                {
                    return current.GetLeftPart(UriPartial.Authority) + content.Parent.Url;
                }

                return content.Parent.Url;
            }

            return null;
        }
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>
        /// The url for the published content.
        /// </returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the provider is unable to provide a url, it should return <c>null</c>.</para>
        /// </remarks>
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content == null || content.DocumentTypeAlias != "BlogPost" || content.Parent == null)
            {
                return(null);
            }

            var date = content.CreateDate;
            //This will add the selected date before the node name.
            //For example /news/item1/ becomes /news/28-07-2014/item1/.
            var url = content.Parent.Url;

            url.EnsureEndsWith('/');
            return($"{url}{date.ToString("dd-MM-yyyy").EnsureEndsWith('/')}{content.UrlName.EnsureEndsWith('/')}");
        }
Exemple #23
0
        public async Task <string> GetUrlAsync(Guid id, Uri current, UrlProviderMode mode)
        {
            if (!current.IsAbsoluteUri)
            {
                throw new ArgumentException("Current url must be absolute.", "current");
            }

            // will not use cache if previewing
            var route = await _contentCache.GetRouteByIdAsync(false, id);

            if (route == null)
            {
                return(null);
            }

            return(route);
        }
Exemple #24
0
        /// <summary>
        /// Gets the nice url of a custom routed published content item
        /// </summary>
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            if (umbracoContext.PublishedContentRequest == null)
            {
                return(null);
            }
            if (umbracoContext.PublishedContentRequest.PublishedContent == null)
            {
                return(null);
            }
            var virtualPage = umbracoContext.PublishedContentRequest.PublishedContent as ArticulateVirtualPage;

            if (virtualPage == null)
            {
                return(null);
            }
            //if the ids match, then return the assigned url
            return(id == virtualPage.Id ? virtualPage.Url : null);
        }
 /// <summary>
 /// This will simply return the URL that is returned by the assigned IPublishedContent if this is a custom route
 /// </summary>
 /// <param name="umbracoContext"></param>
 /// <param name="id"></param>
 /// <param name="current"></param>
 /// <param name="mode"></param>
 /// <returns></returns>
 public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
 {
     if (umbracoContext == null)
     {
         return(null);
     }
     if (umbracoContext.PublishedContentRequest == null)
     {
         return(null);
     }
     if (umbracoContext.PublishedContentRequest.PublishedContent == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext.Request == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext.Request.RequestContext == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext.Request.RequestContext.RouteData == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext.Request.RequestContext.RouteData.DataTokens == null)
     {
         return(null);
     }
     if (umbracoContext.HttpContext.Request.RequestContext.RouteData.DataTokens.ContainsKey(Umbraco.Core.Constants.Web.CustomRouteDataToken) == false)
     {
         return(null);
     }
     //ok so it's a custom route with published content assigned, check if the id being requested for is the same id as the assigned published content
     return(id == umbracoContext.PublishedContentRequest.PublishedContent.Id
         ? umbracoContext.PublishedContentRequest.PublishedContent.Url
         : null);
 }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);
            if (content != null && content.DocumentTypeAlias == "Newsitem" && content.Parent != null)
            {
                var date = content.GetPropertyValue<DateTime>("currentDate");
                if(date != null)
                {
                    //This will add the selected date before the node name.
                    //For example /news/item1/ becomes /news/28-07-2014/item1/.
                    var url = content.Parent.Url;
                    if (!(url.EndsWith("/")))
                    {
                        url += "/";
                    }
                    return url + date.ToString("dd-MM-yyyy") + "/" + content.UrlName + "/";
                }
            }

            return null;
        }
        public override string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var node = umbracoContext.ContentCache.GetById(id);

            if (node != null && node.ContentType.Alias.Equals("Fruit"))
            {
                if (node.HasVortoValue("fruitName"))
                {
                    var v = new VortoApiController();
                    var lang = (List<Our.Umbraco.Vorto.Models.Language>)v.GetInstalledLanguages();

                    var primaryLang = string.Empty;

                    if (lang.Select(x => x.IsoCode).Contains("en-US"))
                    {
                        primaryLang = "en-US";
                    }
                    else
                    {
                        var firstOrDefault = lang.FirstOrDefault();
                        if (firstOrDefault != null)
                        {
                            primaryLang = firstOrDefault.IsoCode;
                        }
                    }

                    var vortoValue = node.GetVortoValue<string>("fruitName", primaryLang);
                    var culture = CultureInfo.GetCultureInfo(primaryLang);
                    var primaryBox = umbracoContext.ContentCache.GetAtRoot().DescendantsOrSelf("Box").FirstOrDefault(x => Equals(x.GetCulture(), culture));

                    if (primaryBox != null)
                    {
                        return string.Format("{0}{1}/", primaryBox.Url, vortoValue.ToUrlSegment());
                    }
                }
            }

            return base.GetUrl(umbracoContext, id, current, mode);
        }
        /// <summary>
        /// Assembles the URL with the found hostname.
        /// </summary>
        /// <param name="route">The route.</param>
        /// <param name="current">The current.</param>
        /// <param name="mode">The mode.</param>
        /// <param name="isoCode">The iso code.</param>
        /// <returns></returns>
        internal string AssembleUrl(
            string route,
            Uri current,
            UrlProviderMode mode,
            string isoCode)
        {
            // extract domainUri and path
            // route is /<path> or <domainRootId>/<path>
            int    pos  = route.IndexOf('/');
            string path = pos == 0 ? route : route.Substring(pos);

            DomainAndUri domainUri = pos == 0 ? null : this.DomainForNode(
                contentId: int.Parse(route.Substring(0, pos)),
                current: current,
                isoCode: isoCode);

            return(UmbracoAssembleUrl(
                       domainUri: domainUri,
                       path: path,
                       current: current,
                       mode: mode).ToString());
        }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content != null && content.DocumentTypeAlias == "Newsitem" && content.Parent != null)
            {
                var date = content.GetPropertyValue <DateTime>("currentDate");
                if (date != null)
                {
                    //This will add the selected date before the node name.
                    //For example /news/item1/ becomes /news/28-07-2014/item1/.
                    var url = content.Parent.Url;
                    if (!(url.EndsWith("/")))
                    {
                        url += "/";
                    }
                    return(url + date.ToString("dd-MM-yyyy") + "/" + content.UrlName + "/");
                }
            }

            return(null);
        }
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content != null && content.DocumentTypeAlias == Blog.Presets.DocTypes.BlogPost)
            {
                var format = content.GetPropertyValue <string>
                                 (Blog.Presets.Properties.Permalinks, true, "%year%/%monthnum%/%day%/%postname%/")
                             .Trim(new char[] { '-' });

                var date = content.GetPropertyValue <DateTime>(Blog.Presets.Properties.PublishDate, content.CreateDate);
                if (date != null && date > DateTime.MinValue)
                {
                    var baseUrl  = "";
                    var blogRoot = content.AncestorOrSelf(Blog.Presets.DocTypes.Blog);
                    if (blogRoot != null)
                    {
                        baseUrl = blogRoot.Url;
                    }
                    else
                    {
                        baseUrl = content.Parent.Url;
                    }

                    if (!baseUrl.EndsWith("/"))
                    {
                        baseUrl += "/";
                    }

                    var replacements = new Dictionary <string, string>();
                    replacements.Add("%postname%", content.UrlName);
                    replacements.Add("%post_id", content.Id.ToString());

                    return(baseUrl + FormatBlogUrl(format, date, replacements));
                }
            }
            return(null);
        }
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="id">The published content identifier.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on the current url.</para>
        /// <para>If the provider is unable to provide a url, it returns "#".</para>
        /// </remarks>
        public string GetUrl(Guid id, UrlProviderMode mode)
        {
            var intId = _umbracoContext.Application.Services.EntityService.GetIdForKey(id, UmbracoObjectTypes.Document);

            return(GetUrl(intId.Success ? intId.Result : -1, mode));
        }
        // note - at the moment we seem to accept pretty much anything as an alias
        // without any form of validation ... could even prob. kill the XPath ...
        // ok, this is somewhat experimental and is NOT enabled by default

        #region GetUrl

        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on url indicated by <c>current</c> and settings, unless
        /// <c>absolute</c> is true, in which case the url is always absolute.</para>
        /// <para>If the provider is unable to provide a url, it should return <c>null</c>.</para>
        /// </remarks>
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            return null; // we have nothing to say
        }
Exemple #33
0
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content identifier.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on the current url.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public string GetUrl(int id, UrlProviderMode mode)
 {
     return(GetUrl(id, _umbracoContext.CleanedUmbracoUrl, mode));
 }
Exemple #34
0
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content id.</param>
 /// <param name="current">The current absolute url.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public async Task<string> GetUrlAsync(Guid id, Uri current, UrlProviderMode mode)
 {
     foreach (var provider in _urlProviders)
     {
         var result = await provider.GetUrlAsync(id, current, mode);
         if (result != null)
         {
             return result;
         }
     }
     return null;
 }
Exemple #35
0
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content identifier.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on the current url.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public string GetUrl(Guid id, UrlProviderMode mode)
 {
     return GetUrl(id, new Uri(_umbracoContext.RequestPath), mode);
 }
Exemple #36
0
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content identifier.</param>
 /// <param name="mode">The url mode.</param>
 /// <param name="culture">A culture.</param>
 /// <param name="current">The current absolute url.</param>
 /// <returns>The url for the published content.</returns>
 public string GetUrl(int id, UrlProviderMode mode, string culture = null, Uri current = null)
 => GetUrl(GetDocument(id), mode, culture, current);
Exemple #37
0
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content identifier.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on the current url.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public async Task<string> GetUrlAsync(Guid id, UrlProviderMode mode)
 {
     return await GetUrlAsync(id, _umbracoContext.OriginalRequestUri, mode);
 }
		/// <summary>
		/// Gets the URL of the content.
		/// </summary>
		public override string GetUrl(Umbraco.Web.UmbracoContext umbracoContext, int id,
			Uri current, UrlProviderMode mode) {

			// Variables.
			var url = base.GetUrl(umbracoContext, id, current, mode);
			var alias = null as string;

			// Avoid unnecessary work when possible by returning early.
			if (string.IsNullOrWhiteSpace(url)) {
				return url;
			}

			// Log errors.
			try {

				// Get the doctype alias from the cache or from the content service.
				if (umbracoContext.PublishedContentRequest == null) {

					// Get alias from content service.
					var service = umbracoContext.Application.Services.ContentService;
					var node = service.GetById(id);
					if (node != null) {
						alias = node.ContentType.Alias;
					}

				} else {

					// Get alias from cache.
					var node = umbracoContext.ContentCache.GetById(id);
					if (node != null) {
						alias = node.DocumentTypeAlias;
					}

				}

				// For document fragments, convert the last part to a fragment identifier.
				// Removes trailing slashes and the ".aspx" extension.
				if (alias != null && "DocumentFragment".InvariantEquals(alias)) {
					var originalUrl = url;
					var hashReplace = "#";
					if (url.EndsWith("/")) {
						url = url.TrimEnd("/".ToCharArray());
						hashReplace = "/#";
					}
					if (url.EndsWith(".aspx", StringComparison.InvariantCultureIgnoreCase)) {
						url = url.Substring(0, url.Length - 5);
					}
					var pos = url.LastIndexOf('/');
					if (pos >= 0) {
						url = url.Substring(0, pos) + hashReplace + url.Substring(pos + 1);
						if (url.StartsWith("#")) {
							url = "/" + url;
						}
					} else {
						url = originalUrl;
					}
				}

			}
			catch (Exception ex) {
				LogHelper.Error<FragmentUrlProvider>(ErrorFragmentUrl, ex);
			}

			// Return URL.
			return url;

		}
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content id.</param>
 /// <param name="current">The current absolute url.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public string GetUrl(int id, Uri current, UrlProviderMode mode)
 {
     var url = _urlProviders.Select(provider => provider.GetUrl(_umbracoContext, id, current, mode))
         .FirstOrDefault(u => u != null);
     return url ?? "#"; // legacy wants this
 }
 /// <summary>
 /// Gets the nice url of a published content.
 /// </summary>
 /// <param name="id">The published content identifier.</param>
 /// <param name="mode">The url mode.</param>
 /// <returns>The url for the published content.</returns>
 /// <remarks>
 /// <para>The url is absolute or relative depending on <c>mode</c> and on the current url.</para>
 /// <para>If the provider is unable to provide a url, it returns "#".</para>
 /// </remarks>
 public string GetUrl(int id, UrlProviderMode mode)
 {
     return GetUrl(id, _umbracoContext.CleanedUmbracoUrl, mode);
 }
        Uri AssembleUrl(DomainAndUri domainUri, string path, Uri current, UrlProviderMode mode)
        {
            Uri uri;

            // ignore vdir at that point, UriFromUmbraco will do it

            if (mode == UrlProviderMode.AutoLegacy)
            {
                mode = UmbracoConfig.For.UmbracoSettings().RequestHandler.UseDomainPrefixes
                    ? UrlProviderMode.Absolute
                    : UrlProviderMode.Auto;
            }

            if (domainUri == null) // no domain was found
            {
                if (current == null)
                    mode = UrlProviderMode.Relative; // best we can do

                switch (mode)
                {
                    case UrlProviderMode.Absolute:
                        uri = new Uri(current.GetLeftPart(UriPartial.Authority) + path);
                        break;
                    case UrlProviderMode.Relative:
                    case UrlProviderMode.Auto:
                        uri = new Uri(path, UriKind.Relative);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("mode");
                }
            }
            else // a domain was found
            {
                if (mode == UrlProviderMode.Auto)
                {
                    if (current != null && domainUri.Uri.GetLeftPart(UriPartial.Authority) == current.GetLeftPart(UriPartial.Authority))    
                        mode = UrlProviderMode.Relative;
                    else
                        mode = UrlProviderMode.Absolute;
                }

                switch (mode)
                {
                    case UrlProviderMode.Absolute:
                        uri = new Uri(CombinePaths(domainUri.Uri.GetLeftPart(UriPartial.Path), path));
                        break;
                    case UrlProviderMode.Relative:
                        uri = new Uri(CombinePaths(domainUri.Uri.AbsolutePath, path), UriKind.Relative);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("mode");
                }
            }

            // UriFromUmbraco will handle vdir
            // meaning it will add vdir into domain urls too!
            return UriUtility.UriFromUmbraco(uri);
        }
        Uri AssembleUrl(DomainAndUri domainUri, string path, Uri current, UrlProviderMode mode)
        {
            Uri uri;

            // ignore vdir at that point, UriFromUmbraco will do it

            if (mode == UrlProviderMode.AutoLegacy)
            {
                mode = _requestSettings.UseDomainPrefixes
                    ? UrlProviderMode.Absolute
                    : UrlProviderMode.Auto;
            }

            if (domainUri == null) // no domain was found
            {
                if (current == null)
                {
                    mode = UrlProviderMode.Relative; // best we can do
                }
                switch (mode)
                {
                case UrlProviderMode.Absolute:
                    uri = new Uri(current.GetLeftPart(UriPartial.Authority) + path);
                    break;

                case UrlProviderMode.Relative:
                case UrlProviderMode.Auto:
                    uri = new Uri(path, UriKind.Relative);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("mode");
                }
            }
            else // a domain was found
            {
                if (mode == UrlProviderMode.Auto)
                {
                    if (current != null && domainUri.Uri.GetLeftPart(UriPartial.Authority) == current.GetLeftPart(UriPartial.Authority))
                    {
                        mode = UrlProviderMode.Relative;
                    }
                    else
                    {
                        mode = UrlProviderMode.Absolute;
                    }
                }

                switch (mode)
                {
                case UrlProviderMode.Absolute:
                    uri = new Uri(CombinePaths(domainUri.Uri.GetLeftPart(UriPartial.Path), path));
                    break;

                case UrlProviderMode.Relative:
                    uri = new Uri(CombinePaths(domainUri.Uri.AbsolutePath, path), UriKind.Relative);
                    break;

                default:
                    throw new ArgumentOutOfRangeException("mode");
                }
            }

            // UriFromUmbraco will handle vdir
            // meaning it will add vdir into domain urls too!
            return(UriUtility.UriFromUmbraco(uri));
        }
        private Uri UmbracoAssembleUrl(DomainAndUri domainUri, string path, Uri current, UrlProviderMode mode)
        {
            // This method is private in umbraco, but we want to use their!
            DefaultUrlProvider provider = ActivatorHelper.CreateInstance <DefaultUrlProvider>();

            return(ActivatorHelper.GetPrivateMethodReturnValueOfInstance <Uri>(
                       instance: provider,
                       methodName: "AssembleUrl",
                       methodArguments: new object[] { domainUri, path, current, mode }));
        }
        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on <c>mode</c> and on <c>current</c>.</para>
        /// <para>If the provider is unable to provide a url, it should return <c>null</c>.</para>
        /// </remarks>
        public virtual string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            if (!current.IsAbsoluteUri)
            {
                throw new ArgumentException("Current url must be absolute.", "current");
            }

            // will not use cache if previewing
            var route = umbracoContext.ContentCache.GetRouteById(id);

            if (string.IsNullOrWhiteSpace(route))
            {
                LogHelper.Debug <DefaultUrlProvider>(
                    "Couldn't find any page with nodeId={0}. This is most likely caused by the page not being published.",
                    () => id);
                return(null);
            }

            var domainHelper = new DomainHelper(umbracoContext.Application.Services.DomainService);

            // extract domainUri and path
            // route is /<path> or <domainRootId>/<path>
            var pos       = route.IndexOf('/');
            var path      = pos == 0 ? route : route.Substring(pos);
            var domainUri = pos == 0
                ? null
                : domainHelper.DomainForNode(int.Parse(route.Substring(0, pos)), current);

            // assemble the url from domainUri (maybe null) and path
            return(AssembleUrl(domainUri, path, current, mode).ToString());
        }
Exemple #45
0
        // note - at the moment we seem to accept pretty much anything as an alias
        // without any form of validation ... could even prob. kill the XPath ...
        // ok, this is somewhat experimental and is NOT enabled by default

        #region GetUrl

        /// <summary>
        /// Gets the nice url of a published content.
        /// </summary>
        /// <param name="umbracoContext">The Umbraco context.</param>
        /// <param name="id">The published content id.</param>
        /// <param name="current">The current absolute url.</param>
        /// <param name="mode">The url mode.</param>
        /// <returns>The url for the published content.</returns>
        /// <remarks>
        /// <para>The url is absolute or relative depending on url indicated by <c>current</c> and settings, unless
        /// <c>absolute</c> is true, in which case the url is always absolute.</para>
        /// <para>If the provider is unable to provide a url, it should return <c>null</c>.</para>
        /// </remarks>
        public string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            return(null); // we have nothing to say
        }
Exemple #46
0
        /// <inheritdoc/>
        public override string GetUrl(UmbracoContext umbracoContext, int id, Uri current, UrlProviderMode mode)
        {
            var content = umbracoContext.ContentCache.GetById(id);

            if (content?.Parent == null)
            {
                return(null);
            }

            if (!current.IsAbsoluteUri)
            {
                throw new ArgumentException("Current url must be absolute.", "current");
            }

            if (content.DocumentTypeAlias == nameof(ErrorPageModel))
            {
                var parts = current.GetAbsolutePathDecoded().Split(
                    new[] { '/' },
                    StringSplitOptions.RemoveEmptyEntries);
                var tmpUrl = "/";

                // Lets try to get the content by using parts of the url until we find it.
                for (var index = 0; index < parts.Length; index++)
                {
                    tmpUrl += parts[index] + "/";

                    try
                    {
                        // Try to resolve it as a route.
                        content = UmbracoContext.Current.ContentCache.GetByRoute(tmpUrl);
                        if (content != null)
                        {
                            break;
                        }
                    }
                    catch (Exception)
                    {
                        // ignored
                    }
                }

                if (content?.Parent == null)
                {
                    return(null);
                }
            }

            if (content.DocumentTypeAlias == nameof(ProfilePageModel))
            {
                using (var container = DependencyResolver.Current.GetService <IContainer>().GetNestedContainer())
                {
                    var membershipService = container.GetInstance <IMembershipService>();
                    var helper            = new UmbracoHelper(umbracoContext);

                    // This will add the selected date before the node name. For example /news/item1/
                    // becomes /news/28-07-2014/item1/.
                    var url = content.Parent.Url;
                    if (!url.EndsWith("/"))
                    {
                        url += "/";
                    }

                    var currentUrl = current.AbsolutePath;
                    currentUrl = currentUrl.TrimStart('/');
                    var segments = currentUrl.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                    if (!segments.Skip(1).Any())
                    {
                        var currentMember = helper.MembershipHelper.GetCurrentMember() as MemberPublishedContent;
                        if (currentMember != null)
                        {
                            var member = membershipService.MapMember(currentMember);
                            var u      = string.Format(
                                "{0}/{1}/",
                                url + content.UrlName,
                                member.UserName.ToLower().ToUrlSegment());

                            return(u);
                        }
                    }
                    else
                    {
                        var username         = segments.Skip(1).First();
                        var memberByUsername =
                            helper.MembershipHelper.GetByUsername(username) as MemberPublishedContent;
                        if (memberByUsername == null)
                        {
                            memberByUsername = ApplicationContext.Current.Services.MemberService
                                               .GetMembersByGroup(nameof(MemberTypes.SiteMember))
                                               .Select(x => helper.MembershipHelper.GetById(x.Id)).OfType <MemberPublishedContent>()
                                               .FirstOrDefault(
                                x => x.UserName.ToUrlSegment().Equals(
                                    username,
                                    StringComparison.OrdinalIgnoreCase));
                        }

                        if (memberByUsername != null)
                        {
                            var member = membershipService.MapMember(memberByUsername);
                            var u      = string.Format(
                                "{0}/{1}/",
                                url + content.UrlName,
                                member.UserName.ToLower().ToUrlSegment());

                            return(u);
                        }
                    }
                }
            }

            return(null);
        }