mardi 21 mai 2013

Récupérer l'url convivial d'une page depuis le magasin des termesSharePoint 2013. / Get friendly url using cache and performanceoptimization

SharePoint permets de gérer la navigation d'un site via les friendly-url ou url convivial, lors de développement de webParts il est donc important de faire le lien entre une page physique (/Pages/article-1.aspx) et son url convivial ( /mon-Article)

Voici un exemple complet d'utilisation du cache serveur ainsi que la récupération de l'url convivial d'une page.

Cache manager:

    public sealed class CacheManager
    {
        private static readonly CacheManager obj = new CacheManager();
        public CacheManager()
        {
        }
        public static CacheManager Instance
        {
            get
            {
                return obj;
            }
        }


        public void Add(string key,
            object data,
            CacheDependency dependencies,
            DateTime absoluteExpiration,
            TimeSpan slidingExpiration)
        {
            HttpContext.Current.Cache.Insert(key, data, dependencies, absoluteExpiration, slidingExpiration);
        }



        public object Get(string key)
        {
            if (HttpContext.Current.Cache[key] != null)
                return HttpContext.Current.Cache[key];

            return null;
        }

Term Manager

   public class TermManager
   {

public static Dictionary<string,string> GetPagesUrls()
        {
            //list for saving the urls
            Dictionary<string, string> retVal = new Dictionary<string, string>();

            //current web
            SPWeb web = SPContext.Current.Web;

            //check if the current web is a publishing web
            if (PublishingWeb.IsPublishingWeb(web))
            {
                //get the pages list id
                Guid listId = PublishingWeb.GetPagesListId(web);
                //retrieve the pages list
                SPList pagesList = web.Lists[listId];

                //iterate trough the pages
                foreach (SPListItem item in pagesList.Items)
                {
                    //retrieve the terms used for the navigation (this can be multiple terms)
                    IList<NavigationTerm> terms = TaxonomyNavigation.GetFriendlyUrlsForListItem(item, false);

                    //check if the pages has terms associated with it
                    if (terms.Count > 0)
                    {
                        //use the GetResolvedDisplayUrl to retrieve the page friendly urls
                        retVal.Add(item.File.Url,terms[0].GetResolvedDisplayUrl(string.Empty));
                    }
                    else
                    {
                        //if the page does not have any terms get the normal url
                        retVal.Add(item.File.Url, item.File.Url);
                    }
                }
            }
            return retVal;
        }

        /// <summary>
        /// Retourne l'url convivial pour une page donnée
        /// </summary>
        /// <param name="navTermSet_cache_key">Clé de cache ex:  Navigation_Site_1234</param>
        /// <param name="pageUrl"> Page/article2.aspx</param>
        /// <returns> /monarticle</returns>
        
public static string ResolveConvivialURL(string navTermSet_cache_key, string pageUrl)
        {
            bool cache = false;

            CacheManager cm = new CacheManager();
            Dictionary<string, string> friendlyUrl = cm.Get(navTermSet_cache_key) as Dictionary<string, string>;
            if (friendlyUrl != null)
            {
                cache = true;
            }
            else
            {
                cache = false;
                friendlyUrl = GetPagesUrls();
                cm.Add(navTermSet_cache_key, friendlyUrl, null, DateTime.UtcNow.AddMinutes(30), TimeSpan.Zero);
            }
            if (friendlyUrl != null && friendlyUrl.Count > 0)
            {
                string url = pageUrl.Substring(pageUrl.IndexOf("Pages"));
                string urlConvivial = string.Empty;
                KeyValuePair<string, string> kvp = friendlyUrl.FirstOrDefault(k => k.Key.Equals(url));
                if (!string.IsNullOrEmpty(kvp.Value))
                {
                    
                    urlConvivial = kvp.Value;
                }
                if(urlConvivial.StartsWith("/"))
                {
                    //Cas ou l'url convivial est présente (ex:  "/conseilPratiques")
                    return string.Format("{0}{1}", SPContext.Current.Site.Url, urlConvivial);
                }
                else
                {
                    //Cas ou l'url convivial n'est pas présente (ex:  "Pages/conseilPratiques")
                    return string.Format("{0}/{1}", SPContext.Current.Site.Url, urlConvivial);
                }
            }
            else
            {
                //cas bateau ne devrait pas rentrer dans ce cas. si le magasin des termes est bien configuré.
                return pageUrl;
            }            
        }

Et l'appel de la classe :

string friendlyUrl = TermManager.ResolveConvivialURL("Pages/article1.aspx");

1 commentaire :

  1. Are you trying to earn money from your websites by popup ads?
    If so, did you take a look at Propeller Ads?

    RépondreSupprimer