using IntuitiveSurgical.Feature.Navigation.Content;
using IntuitiveSurgical.Feature.Navigation.Models;
using IntuitiveSurgical.Foundation.Images.Repositories;
using IntuitiveSurgical.Foundation.SitecoreExtensions.Extensions;
using Sitecore;
using Sitecore.Collections;
using Sitecore.Configuration;
using Sitecore.Data.Fields;
using Sitecore.Data.Items;
using Sitecore.Data.Managers;
using Sitecore.Layouts;
using Sitecore.Links;
using Sitecore.Sites;
using Sitecore.Web;
using Sitecore.Web.UI.WebControls;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
namespace IntuitiveSurgical.Feature.Navigation.Repositories
{
//[Service]
public class NavigationRepository : INavigationRepository
{
public Sitecore.Data.Items.Item ContextItem { get; }
//Dynamic placeholders
private const string DatabaseName = "master";
private const string DefaultDeviceId = "{FE5D7FDF-89C0-4D99-9AA3-B5FBD009C9F3}";
private const string PlaceholderRegex = "_([0-9a-f]{8}[-][0-9a-f]{4}[-][0-9a-f]{4}[-][0-9a-f]{4}[-][0-9a-f]{12})";
private const string ItemsWithPresentationDetailsQuery = "/sitecore/content//*[@__Renderings != '' or @__Final Renderings != '']";
//End of Dynamic placeholders
public NavigationRepository(Item contextItem)
{
this.ContextItem = Get(contextItem);
//Dynamic placeholders. Nalan, please uncomment the line below to turn on dynamic placeholder names reformatting
//Dictionary<Item, List<KeyValuePair<string, string>>> result = Iterate();
}
public Item Get([NotNull] Item contextItem)
{
if (contextItem == null)
{
//throw new ArgumentNullException(nameof(contextItem));
return null;
}
return contextItem.GetAncestorOrSelfOfTemplate(Templates.Home_Title.ID) ?? Context.Site.GetContextItem(Templates.Home_Title.ID);
}
private List<Language> GetLanguagesPerCountry(Item country)
{
List<Language> result = new List<Language>();
Sitecore.Data.Fields.MultilistField multilistField = country.Fields[Templates.Country.Fields.Languages];
//Get all languages for the site
LanguageCollection languages = LanguageManager.GetLanguages(Sitecore.Context.Database);
List<CultureInfo> cultureInfos = new List<CultureInfo>();
foreach (Sitecore.Globalization.Language language in languages)
{
cultureInfos.Add(language.CultureInfo);
}
//get all languages per country
if (multilistField != null)
{
foreach (var id in multilistField.TargetIDs)
{
Item targetItem = Context.Database.Items[id];
if (targetItem != null)
{
Sitecore.Globalization.Language sclan = languages.FirstOrDefault(x => x.CultureInfo.ToString() == targetItem.Name);
Language lan = new Language() { LanguageName = sclan.CultureInfo.DisplayName.Split('(')[0], Url = CountryHomeItemLanguageUrl(country, sclan.Name) };
result.Add(lan);
}
}
}
return result;
}
public string CountryHomeItemLanguageUrl(Item countryItem, string lan)
{
var db = Context.Database;
Item homeItem = countryItem.Children.FirstOrDefault(x => x.IsDerived(Templates.Home_Title.ID));
Item lanHomeItem = ItemExtensions.HasLanguageVersion(homeItem, lan);
var options = new UrlOptions
{
AlwaysIncludeServerUrl = true,
LanguageEmbedding = LanguageEmbedding.Never,
LowercaseUrls = true
};
//build sitecore context for this language
SiteInfo site = SiteContextFactory.Sites
//.Where(s => s.RootPath != "" & itemPath.StartsWith(s.RootPath, StringComparison.OrdinalIgnoreCase))
.Where(s => s.Language == lan)
.OrderByDescending(s => s.RootPath.Length)
.FirstOrDefault();
var website = new SiteContext(site);
using (new SiteContextSwitcher(website))
{
string homeItemUrl = lanHomeItem.Url(options);
if (!string.IsNullOrEmpty(homeItemUrl))
return homeItemUrl;
}
return HttpContext.Current.Request.Url.ToString();
}
public List<Region> GetRegions()
{
List<Region> regions = new List<Region>();
Item regionItem = this.ContextItem.GetAncestorOrSelfOfTemplate(Templates.Region.ID);
Item parentItem = regionItem.Parent;
var regionItems = parentItem.GetChildren().Where(x => x.TemplateID == Templates.Region.ID);
foreach (Item region in regionItems)
{
var countrieItems = region.GetChildren().Where(x => x.TemplateID == Templates.Country.ID);
var countries = (from c in countrieItems select new Country { Name = c.Fields[Templates.Country.Fields.Name].Value, FlagUrl = BuildImageUrl(c), Languages = GetLanguagesPerCountry(c) }).ToList();
regions.Add(
new Region
{
Title = region.Fields[Templates.Region.Fields.Title].Value,
Countries = countries
});
}
return regions;
}
private string BuildImageUrl(Item countryItem)
{
var ImgixModel = ImgixRepository.Get(countryItem);
return ImgixModel.Url.ToString();
}
public NavigationItems GetNavigationList()
{
var NavigationItems = new NavigationItems();
NavigationItems.HeaderSections = CreateHeaderList(this.ContextItem);
NavigationItems.ContactLinkItems = CreateContactLinkList(this.ContextItem);
var hasLogoItems = this.ContextItem.GetAncestorOrSelfOfTemplate(Templates.Logo.ID) ?? Context.Site.GetContextItem(Templates.Logo.ID);
var hasLogoItem = Context.Site.GetContextItem(Templates.Logo.ID);
NavigationItems.Logo = hasLogoItem?.TargetItem(Templates.Logo.Fields.Logo);
return NavigationItems;
}
private List<HeaderItem> CreateHeaderList(Item IHeaderItem)
{
var HeaderItemsList = new List<HeaderItem>();
var HeadersFound = IHeaderItem.Axes.GetDescendants().Where(h => h.IsDerived(Templates.Header.ID));
foreach (var curHeader in HeadersFound)
{
var curHeaderTitle = new HtmlString(FieldRenderer.Render(curHeader, Templates.Navigation_Title.Fields.Title.ToString()));
if (!curHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title))
{
if (!curHeader.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
{
HeaderItemsList.Add(
new HeaderItem
{
SubHeaderSections = this.CreateSubtHeaderList(curHeader),
Item = curHeader,
Featured = curHeader.IsChecked(Templates.Featured.Fields.Featured),
Excerpt = !curHeader.IsNullOrEmpty(Templates.Featured.Fields.Excerpt) ? curHeader.Fields[Templates.Featured.Fields.Excerpt].Value.ToString() : "",
PageLink = ((curHeader[Templates.Featured.Fields.Page_Link] != null) && (Context.Database.GetItem(curHeader[Templates.Featured.Fields.Page_Link]) != null)) ? Context.Database.GetItem(curHeader[Templates.Featured.Fields.Page_Link]).Url() : "",
Title = !curHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curHeaderTitle : new HtmlString("")
});
}
}
}
return HeaderItemsList;
}
private List<SubHeaderItem> CreateSubtHeaderList(Item ISubHeaderItem)
{
var options = new UrlOptions
{
AlwaysIncludeServerUrl = true,
LanguageEmbedding = LanguageEmbedding.Never,
LowercaseUrls = true
};
var SubHeaderItemsList = new List<SubHeaderItem>();
//var SubHeadersFound = ISubHeaderItem.Axes.GetDescendants().Where(s => s.IsDerived(Templates.Sub_Header.ID));
//l.IsDerived(Templates.Navigation_Link.ID));
var SubHeadersFound = ISubHeaderItem.Axes.GetDescendants().Where(l => l.Parent.Template.ID == Templates.Heading.ID || l.Parent.Template.ID == Templates.DaVinciHeading.ID);
foreach (var curSubHeader in SubHeadersFound)
{
var curSubHeaderTitle = new HtmlString(FieldRenderer.Render(curSubHeader, Templates.Navigation_Title.Fields.Title.ToString()));
if (!curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title))
{
SubHeaderItemsList.Add(
new SubHeaderItem
{
LinkSections = this.CreateNavigationLinkList(curSubHeader),
Item = curSubHeader,
Border = curSubHeader.CustomStyle(Templates.Border.Fields.Border),
Title = !curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curSubHeaderTitle : new HtmlString(""),
Target = (curSubHeader.TemplateID == Templates.RedirectPage.ID) ? "_blank" : "",
Visible = !curSubHeader.IsChecked(Templates.Featured.Fields.Hide_In_Footer),
PageLink = curSubHeader.Url(options),
});
}
}
return SubHeaderItemsList;
}
private List<NavigationLinkItem> CreateNavigationLinkList(Item item)
{
var options = new UrlOptions
{
AlwaysIncludeServerUrl = true,
LanguageEmbedding = LanguageEmbedding.Never,
LowercaseUrls = true
};
var NavigationLinkItemsList = new List<NavigationLinkItem>();
var NavigationLinkFound = item.Axes.GetDescendants().Where(l => l.IsDerived(Templates.Navigation_Link.ID));
foreach (var curNavigationLink in NavigationLinkFound)
{
if ((!curNavigationLink.IsChecked(Templates.Featured.Fields.Hide_In_Navigation)) && (!curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title)))
{
var curNavigationLinkTitle = new HtmlString(FieldRenderer.Render(curNavigationLink, Templates.Navigation_Title.Fields.Title.ToString()));
NavigationLinkItemsList.Add(
new NavigationLinkItem
{
Url = curNavigationLink.Url(options),
Item = curNavigationLink,
Title = !curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curNavigationLinkTitle : new HtmlString(""),
Target = (curNavigationLink.TemplateID == Templates.RedirectPage.ID) ? "_blank" : "",
Visible = !curNavigationLink.IsChecked(Templates.Featured.Fields.Hide_In_Footer)
});
}
}
return NavigationLinkItemsList;
}
private List<ContactLinkItem> CreateContactLinkList(Item item)
{
var options = new UrlOptions
{
AlwaysIncludeServerUrl = true,
LanguageEmbedding = LanguageEmbedding.Never,
LowercaseUrls = true
};
item = item.GetAncestorOrSelfOfTemplate(Templates.Navigation_Contact_Links.ID) ?? Context.Site.GetContextItem(Templates.Navigation_Contact_Links.ID);
var ContactLinkItemsList = new List<ContactLinkItem>();
var ContactLinkFound = item.GetMultiListValueItems(Templates.Navigation_Contact_Links.Fields.Contact_Links);
foreach (var curContactLink in ContactLinkFound)
{
if (!curContactLink.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
{
var curContactLinkTitle = new HtmlString(FieldRenderer.Render(curContactLink, Templates.Navigation_Title.Fields.Title.ToString()));
ContactLinkItemsList.Add(
new ContactLinkItem
{
Url = curContactLink.Url(options),
Item = curContactLink,
Title = !curContactLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curContactLinkTitle : new HtmlString(""),
Target = (curContactLink.TemplateID == Templates.RedirectPage.ID) ? "_blank" : "",
Visible = !curContactLink.IsChecked(Templates.Featured.Fields.Hide_In_Footer)
});
}
}
return ContactLinkItemsList;
}
public NavigationJson GetNavigationList(Item contextItem, SiteContext site)
{
var NavigationItems = new NavigationJson();
NavigationItems.HeaderSections = CreateHeaderListJson(contextItem, site);
var hasLogoItems = contextItem.GetAncestorOrSelfOfTemplate(Templates.Logo.ID) ?? contextItem;
var hasLogoItem = contextItem;
NavigationItems.Logo = hasLogoItem?.TargetItem(Templates.Logo.Fields.Logo);
return NavigationItems;
}
private List<HeaderJson> CreateHeaderListJson(Item IHeaderItem, SiteContext website)
{
var db = IHeaderItem.Database;
var HeaderItemsList = new List<HeaderJson>();
using (new SiteContextSwitcher(website))
{
var HeadersFound = IHeaderItem.Axes.GetDescendants().Where(h => h.IsDerived(Templates.Header.ID));
foreach (var curHeader in HeadersFound)
{
var curHeaderTitle = FieldRenderer.Render(curHeader, Templates.Navigation_Title.Fields.Title.ToString());
if (!curHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title))
{
if (!curHeader.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
{
HeaderItemsList.Add(
new HeaderJson
{
SubHeaderListJson = this.CreateSubtHeaderListJson(curHeader, website),
PageLink = ((curHeader[Templates.Featured.Fields.Page_Link] != null) && (db.GetItem(curHeader[Templates.Featured.Fields.Page_Link]) != null))
? db.GetItem(curHeader[Templates.Featured.Fields.Page_Link]).Url() : "",
Title = !curHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curHeaderTitle.ToString() : string.Empty
});
}
}
}
}
return HeaderItemsList;
}
private List<SubHeaderJson> CreateSubtHeaderListJson(Item ISubHeaderItem, SiteContext siteContext)
{
var SubHeaderItemsList = new List<SubHeaderJson>();
var SubHeadersFound = ISubHeaderItem.Axes.GetDescendants().Where(l => l.Parent.Template.ID == Templates.Heading.ID || l.Parent.Template.ID == Templates.DaVinciHeading.ID);
using (new SiteContextSwitcher(siteContext))
{
var options = LinkManager.GetDefaultUrlOptions();
options.AlwaysIncludeServerUrl = true;
options.Site = siteContext;
options.SiteResolving = true;
options.LanguageEmbedding = LanguageEmbedding.Never;
options.Language = Sitecore.Data.Managers.LanguageManager.GetLanguage(siteContext.Language);
foreach (var curSubHeader in SubHeadersFound)
{
if (!curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title))
{
string pageLink = LinkManager.GetItemUrl(curSubHeader, options);
if (!curSubHeader.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
{
var curSubHeaderTitle = FieldRenderer.Render(curSubHeader, Templates.Navigation_Title.Fields.Title.ToString());
SubHeaderItemsList.Add(
new SubHeaderJson
{
NavigationLinkListJson = this.CreateNavigationLinkListJson(curSubHeader),
Title = !curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curSubHeaderTitle : string.Empty,
PageLink = pageLink,
Target = (curSubHeader.TemplateID == Templates.RedirectPage.ID) ? "_blank" : ""
});
}
}
}
}
return SubHeaderItemsList;
}
private List<NavigationLinkJson> CreateNavigationLinkListJson(Item item)
{
var options = new UrlOptions
{
AlwaysIncludeServerUrl = true,
LanguageEmbedding = LanguageEmbedding.Never,
LowercaseUrls = true
};
var NavigationLinkItemsList = new List<NavigationLinkJson>();
var NavigationLinkFound = item.Axes.GetDescendants().Where(l => l.IsDerived(Templates.Navigation_Link.ID));
foreach (var curNavigationLink in NavigationLinkFound)
{
if ((!curNavigationLink.IsChecked(Templates.Featured.Fields.Hide_In_Navigation)) && (!curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title)))
{
var curNavigationLinkTitle = FieldRenderer.Render(curNavigationLink, Templates.Navigation_Title.Fields.Title.ToString());
NavigationLinkItemsList.Add(
new NavigationLinkJson
{
Title = !curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curNavigationLinkTitle : string.Empty,
PageLink = curNavigationLink.Url(options),
Target = (curNavigationLink.TemplateID == Templates.RedirectPage.ID) ? "_blank" : ""
});
}
}
return NavigationLinkItemsList;
}
//private List<SubHeaderJson> CreateSubtHeaderListJson(Item ISubHeaderItem)
//{
// var options = new UrlOptions
// {
// AlwaysIncludeServerUrl = true,
// LanguageEmbedding = LanguageEmbedding.Always,
// LowercaseUrls = true
// };
// var SubHeaderItemsList = new List<SubHeaderJson>();
// var SubHeadersFound = ISubHeaderItem.Axes.GetDescendants().Where(s => s.IsDerived(Templates.Sub_Header.ID));
// foreach (var curSubHeader in SubHeadersFound)
// {
// var curSubHeaderTitle = FieldRenderer.Render(curSubHeader, Templates.Navigation_Title.Fields.Title.ToString());
// if (!curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title))
// {
// string pageLink = string.Empty;
// if (!curSubHeader.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
// {
// if (curSubHeader[Templates.Featured.Fields.Page_Link] != null)
// {
// var pageLinkItem = Context.Database.GetItem(curSubHeader[Templates.Featured.Fields.Page_Link]);
// if (pageLinkItem != null && !pageLinkItem.IsChecked(Templates.Featured.Fields.Hide_In_Navigation))
// {
// SubHeaderItemsList.Add(
// new SubHeaderJson
// {
// NavigationLinkListJson = this.CreateNavigationLinkListJson(curSubHeader),
// Title = !curSubHeader.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curSubHeaderTitle : string.Empty,
// PageLink = pageLinkItem.Url()
// //PageLink = curSubHeader.Url(options),
// });
// }
// }
// }
// }
// }
// return SubHeaderItemsList;
//}
//private List<NavigationLinkJson> CreateNavigationLinkListJson(Item item)
//{
// var options = new UrlOptions
// {
// AlwaysIncludeServerUrl = true,
// LanguageEmbedding = LanguageEmbedding.Always,
// LowercaseUrls = true
// };
// var NavigationLinkItemsList = new List<NavigationLinkJson>();
// var NavigationLinkFound = item.Axes.GetDescendants().Where(l => l.IsDerived(Templates.Navigation_Link.ID));
// foreach (var curNavigationLink in NavigationLinkFound)
// {
// if ((!curNavigationLink.IsChecked(Templates.Featured.Fields.Hide_In_Navigation)) && (!curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title)))
// {
// var curNavigationLinkTitle = FieldRenderer.Render(curNavigationLink, Templates.Navigation_Title.Fields.Title.ToString());
// NavigationLinkItemsList.Add(
// new NavigationLinkJson
// {
// Title = !curNavigationLink.IsNullOrEmpty(Templates.Navigation_Title.Fields.Title) ? curNavigationLinkTitle : string.Empty,
// PageLink = curNavigationLink.Url(options)
// });
// }
// }
// return NavigationLinkItemsList;
//}
#region DynamicPlaceholders
public Dictionary<Item, List<KeyValuePair<string, string>>> Iterate()
{
Dictionary<Item, List<KeyValuePair<string, string>>> result = new Dictionary<Item, List<KeyValuePair<string, string>>>();
Sitecore.Data.Database master = Factory.GetDatabase(DatabaseName);
Item[] items = master.SelectItems(ItemsWithPresentationDetailsQuery);
List<string> paths = new List<string>();
Sitecore.Data.ID[] layoutFields = new[] { FieldIDs.LayoutField, FieldIDs.FinalLayoutField };
foreach (Item itemInDefaultLanguage in items)
{
string idAndLanguage = itemInDefaultLanguage.Paths.Path;
paths.Add(idAndLanguage);
foreach (Sitecore.Globalization.Language itemLanguage in itemInDefaultLanguage.Languages)
{
Item itemGeneral = itemInDefaultLanguage.Database.GetItem(itemInDefaultLanguage.ID, itemLanguage);
if (itemGeneral.Versions.Count > 0)
{
if (itemGeneral.Versions.Count > 1)
{
bool stopHere = true;
}
foreach (var version in itemGeneral.Versions.GetVersions()) //Iterate through each numbered version of the item
{
string pathAndLanguage = version.Paths.Path + " " + itemLanguage;
foreach (Sitecore.Data.ID layoutField in layoutFields)
{
List<KeyValuePair<string, string>> changeResult = ChangeLayoutFieldForItem(version, version.Fields[layoutField]);
if (changeResult.Any())
{
if (!result.ContainsKey(version))
{
result.Add(version, changeResult);
}
else
{
result[version].AddRange(changeResult);
}
}
}
}
}
}
}
List<string> allPaths = paths;
return result;
}
private List<KeyValuePair<string, string>> ChangeLayoutFieldForItem(Item currentItem, Field field)
{
List<KeyValuePair<string, string>> result = new List<KeyValuePair<string, string>>();
string xml = LayoutField.GetFieldValue(field);
if (!string.IsNullOrWhiteSpace(xml))
{
LayoutDefinition details = LayoutDefinition.Parse(xml);
DeviceDefinition device = details.GetDevice(DefaultDeviceId);
DeviceItem deviceItem = currentItem.Database.Resources.Devices["Default"];
RenderingReference[] renderings = currentItem.Visualization.GetRenderings(deviceItem, false);
if (device?.Renderings != null)
{
bool requiresUpdate = false;
foreach (RenderingDefinition rendering in device.Renderings)
{
if (!string.IsNullOrWhiteSpace(rendering.Placeholder))
{
string newPlaceholder = rendering.Placeholder;
foreach (Match match in Regex.Matches(newPlaceholder, PlaceholderRegex, RegexOptions.IgnoreCase))
{
int count = 0;
string renderingId = match.Value;
string newRenderingId = "-{" + renderingId.ToUpper().Substring(1) + "}-" + count;
newPlaceholder = newPlaceholder.Replace(match.Value, newRenderingId);
result.Add(new KeyValuePair<string, string>(currentItem.Paths.Path + " " + rendering.Placeholder, newPlaceholder));
count++;
requiresUpdate = true;
}
//result.Add(new KeyValuePair<string, string>(rendering.Placeholder, newPlaceholder));
rendering.Placeholder = newPlaceholder;
}
}
if (requiresUpdate)
{
string newXml = details.ToXml();
using (new EditContext(currentItem))
{
LayoutField.SetFieldValue(field, newXml);
}
}
}
}
return result;
}
#endregion
}
}
No comments:
Post a Comment