private static void BuildUrlIndexes(int portalId, SocialUrlProvider provider, FriendlyUrlOptions options, out Hashtable friendlyUrlIndex, out Hashtable queryStringIndex) { friendlyUrlIndex = new Hashtable(); queryStringIndex = new Hashtable(); //call database procedure to get list of FriendlyUrlInfoCol itemUrls = null; Data.DataProvider.Instance().GetSocialUrls(portalId, out itemUrls); List <TabInfo> childTabs = null; TabController tc = new TabController(); TabInfo groupParentTab = null; string groupParentTabPath = null; //get a list of child tabs for this request if (provider.GroupPagePathTabId > 0 && provider.HideGroupPagePath) { childTabs = DotNetNuke.Entities.Tabs.TabController.GetTabsByParent(provider.GroupPagePathTabId, portalId); groupParentTab = tc.GetTab(provider.GroupPagePathTabId, portalId, false); groupParentTabPath = provider.CleanNameForUrl(groupParentTab.TabName, options); } if (itemUrls != null) { //build up the dictionary foreach (FriendlyUrlInfo itemUrl in itemUrls) { //friendly url index - look up by entryid, find Url string furlKey = itemUrl.ItemKey; string furlValue = MakeItemFriendlyUrl(itemUrl, provider, options); if (friendlyUrlIndex.ContainsKey(furlKey) == false) { friendlyUrlIndex.Add(furlKey, furlValue); } //querystring index - look up by url, find querystring for the item string qsKey = furlValue.ToLower(); //the querystring lookup is the friendly Url value - but converted to lower case string itemQueryString = "&" + itemUrl.QueryStringKey + "=" + itemUrl.ItemId.ToString(); //the querystring that is rewritten for the url string qsValue = itemQueryString; //when not including the dnn page path into the friendly Url, then include the tabid in the querystring if (itemUrl.ItemType.ToLower() == "group" && provider.HideGroupPagePath == true && provider.GroupPagePathTabId > 0) { qsValue = "?TabId=" + provider.GroupPagePathTabId.ToString() + qsValue; } if (queryStringIndex.ContainsKey(qsKey) == false) { queryStringIndex.Add(qsKey, qsValue); } //if the options aren't standard, also add in some other versions that will identify the right entry but will get redirected if (options.PunctuationReplacement != "") { FriendlyUrlOptions altOptions = options.Clone(); altOptions.PunctuationReplacement = ""; //how the urls look with no replacement string altQsKey = MakeItemFriendlyUrl(itemUrl, provider, altOptions).ToLower(); //keys are always lowercase if (altQsKey != qsKey) { if (queryStringIndex.ContainsKey(altQsKey) == false) { queryStringIndex.Add(altQsKey, qsValue); } } } //now repeat for the child tabs if (childTabs != null && childTabs.Count > 0 && groupParentTab != null) { //derive the path of the child tabs in with the parent tab, and build up a set of urls that include the group name and the child tab name foreach (TabInfo childTab in childTabs) { string childPath = provider.CleanNameForUrl(childTab.TabName, options);//gets the cleaned tab name childPath = furlValue + "/" + provider.EnsureNotLeadingChar("/", childPath); //the child path is the user + the child tab path //add rewriting values string cpQsValue = "?TabId=" + childTab.TabID.ToString() + itemQueryString; string cpQsKey = childPath.ToLower(); if (queryStringIndex.ContainsKey(cpQsKey) == false) { queryStringIndex.Add(cpQsKey, cpQsValue); } //add friendly url paths string cpFurlKey = "t" + childTab.TabID.ToString() + furlKey; string cpFurlValue = childPath; if (friendlyUrlIndex.ContainsKey(cpFurlKey) == false) { friendlyUrlIndex.Add(cpFurlKey, cpFurlValue); } //add alternatives if (options.PunctuationReplacement != "") { FriendlyUrlOptions altOptions = options.Clone(); altOptions.PunctuationReplacement = ""; //how the urls look with no replacement string altQsKey = childPath + "/" + MakeItemFriendlyUrl(itemUrl, provider, altOptions).ToLower(); //keys are always lowercase if (altQsKey != qsKey) { if (queryStringIndex.ContainsKey(altQsKey) == false) { queryStringIndex.Add(altQsKey, cpQsValue); } } } } } } } }
private static void BuildUrlIndexes(int tabId, int portalId, NewsArticlesModuleProvider provider, FriendlyUrlOptions options, TabUrlOptions urlOptions, out Hashtable friendlyUrlIndex, out Hashtable queryStringIndex) { if (urlOptions == null) { urlOptions = new TabUrlOptions(); urlOptions.RedirectOtherStyles = true; } friendlyUrlIndex = new Hashtable(); queryStringIndex = new Hashtable(); //call database procedure to get list of FriendlyUrlInfoCol itemUrls = null; NewsArticleOptions naOptions = null; //list of module settings for the NA module if (tabId > 0 && portalId > -1) //927 : don't call db for tabid -1, it doesn't exist { Data.DataProvider.Instance().GetNewsArticlesItemsForTab(tabId, urlOptions, out itemUrls, out naOptions); options.PunctuationReplacement = naOptions.TitleReplacement;//override value with NA setting Dictionary <string, string> categoryParents = new Dictionary <string, string>(); if (itemUrls != null) { //build up the dictionary foreach (FriendlyUrlInfo itemUrl in itemUrls) { string furlKey = itemUrl.FUrlKey; //querystring index - look up by url, find querystring for the item string furlValue = MakeItemFriendlyUrl(itemUrl, provider, options, urlOptions); string qsKey = furlValue.ToLower();//the querystring lookup is the friendly Url value - but converted to lower case string qsValue = null; string itemId = itemUrl.itemId.ToString(); string parentId = itemUrl.parentId.ToString(); switch (itemUrl.itemType.ToLower()) { case "article": qsValue = "&articleType=ArticleView&articleId=" + itemId; //the querystring is just the entryId parameter break; case "page": qsValue = "&articleType=ArticleView&pageId=" + itemId + "&articleId=" + parentId; break; case "author": qsValue = "&articleType=AuthorView&authorId=" + itemId; break; case "category": qsValue = "&articleType=CategoryView&categoryId=" + itemId; if (parentId != "-1" && urlOptions.CategoryStyle == CategoryUrlStyle.CatHierarchy) { //this category has a parent categoryParents.Add(furlKey, itemUrl.FUrlPrefix + parentId); } break; case "archive": if (parentId == "-1") { //yearly qsValue = "&articleType=ArchiveView&year=" + itemId; } else { //monthly qsValue = "&articleType=ArchiveView&year=" + parentId + "&month=" + itemUrl.urlNum.ToString(); //url num holds the month } break; } //when not including the dnn page path into the friendly Url, then include the tabid in the querystring if (provider.AlwaysUsesDnnPagePath(portalId) == false) { qsValue = "?TabId=" + tabId.ToString() + qsValue; } string suffix = ""; AddUniqueUrlToIndex(furlKey, ref qsKey, qsValue, portalId, queryStringIndex, options, true, out suffix); //if the suffix for the qsKey was changed, we need to add it to the friendly url used for the friendly url index furlValue += suffix; //friendly url index - look up by entryid, find Url //check to see if friendly url matches any page paths if (friendlyUrlIndex.ContainsKey(furlKey) == false)//shouldn't return duplicate because content is controlled by module logic { friendlyUrlIndex.Add(furlKey, furlValue); } //if the options aren't standard, also add in some other versions that will identify the right entry but will get redirected if (options.PunctuationReplacement != "") { FriendlyUrlOptions altOptions = options.Clone(); altOptions.PunctuationReplacement = ""; //how the urls look with no replacement string altQsKey = MakeItemFriendlyUrl(itemUrl, provider, altOptions, urlOptions).ToLower(); //keys are always lowercase string altQsValue = qsValue + "&do301=true&&rr=Title_Space_Replacement"; AddUniqueUrlToIndex(furlKey, ref altQsKey, altQsValue, portalId, queryStringIndex, options, false, out suffix); } //now build the alternative for the redirects if (urlOptions.RedirectOtherStyles) { TabUrlOptions tempOptions = urlOptions.Clone(); if (urlOptions.ArticleStyle == ArticleUrlStyle.BlogStyle) { tempOptions.ArticleStyle = ArticleUrlStyle.TitleStyle; } else { tempOptions.ArticleStyle = ArticleUrlStyle.BlogStyle; } //get the Url for this alternate style string altArtQsKey = MakeItemFriendlyUrl(itemUrl, provider, options, tempOptions).ToLower(); string altArtQsValue = qsValue += "&do301=true&rr=Wrong_Article_Style"; AddUniqueUrlToIndex(furlKey, ref altArtQsKey, altArtQsValue, portalId, queryStringIndex, options, false, out suffix); } } //go back and recursively check for category parents to be updated if (categoryParents != null && categoryParents.Count > 0) { Dictionary <string, string> updates = new Dictionary <string, string>(); //reallocate the friendly urls recursively so that categories include their parent path foreach (string furlKey in categoryParents.Keys) { //got the key for the friendly url //now find the parent string parentKey = categoryParents[furlKey]; string childPath = (string)friendlyUrlIndex[furlKey]; string parentPath = GetParentPath(furlKey, parentKey, childPath, ref categoryParents, ref friendlyUrlIndex); if (parentPath != null) { childPath = parentPath + "/" + childPath; } updates.Add(furlKey, childPath);//don't update until all done } //now process the update list and update any values that had hierarchial categories foreach (string key in updates.Keys) { string oldVal = (string)friendlyUrlIndex[key]; string qsKey = oldVal.ToLower(); if (queryStringIndex.ContainsKey(qsKey)) { //update the querystring index string qsVal = (string)queryStringIndex[qsKey]; queryStringIndex.Remove(qsKey); queryStringIndex.Add(updates[key].ToLower(), qsVal); } //update the new friendly url index friendlyUrlIndex[key] = updates[key]; } } } } }