protected void btnGetPersonalization_ServerClick(object sender, EventArgs e) { var data = new List <PersonalizationData>(); Sitecore.Data.Database master = Sitecore.Data.Database.GetDatabase("master"); var startItem = master.GetItem("/sitecore/content"); DeviceItem device = master.Resources.Devices["Default"]; foreach (var item in startItem.Axes.GetDescendants()) { PersonalizationData details = new PersonalizationData(); Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__renderings"]; List <Sitecore.Layouts.RenderingReference> renderings = layoutField.GetReferences(device) != null?layoutField.GetReferences(device).ToList() : null; if (renderings != null) { Sitecore.Data.Fields.LayoutField finalLayoutField = item.Fields["__final renderings"]; List <Sitecore.Layouts.RenderingReference> finalRenderings = finalLayoutField.GetReferences(device) != null?finalLayoutField.GetReferences(device).ToList() : null; if (finalRenderings != null) { renderings.AddRange(finalRenderings); var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList(); details.ItemName = item.Name; details.RederingDetails = new List <RenderingDetails>(); if (details.ItemName != null && renderingsWithPersonalization != null && renderingsWithPersonalization.Count > 0) { foreach (var rendering in renderingsWithPersonalization) { RenderingDetails renderingDetail = new RenderingDetails(); renderingDetail.RenderingID = master.GetItem(rendering.RenderingID).Paths.FullPath.ToString(); renderingDetail.RenderingName = master.GetItem(rendering.RenderingID).Name; details.RederingDetails.Add(renderingDetail); } } } data.Add(details); } data = data.Where(x => x.RederingDetails.Count() > 0).ToList(); } personalizedData.Text = ""; if (data.Count > 0) { foreach (var finalData in data) { personalizedData.Text += "Item Name : <strong>" + finalData.ItemName + "</strong></br>"; personalizedData.Text += "Renderings with Personalizations defined : </br>"; foreach (var renderingData in finalData.RederingDetails) { personalizedData.Text += "Rendering - Path -" + renderingData.RenderingID + "</br>"; } personalizedData.Text += "</br>"; } } else { personalizedData.Text += "No renderings with Personalization found"; } }
/// <summary> /// Given a rendering get the list of RenderingReferences that contain personalisation Rules. /// General a single reference is returned. /// </summary> /// <param name="currentRendering"></param> /// <returns></returns> private List <RenderingReference> GetPersonalizedRenderings(Rendering currentRendering) { var item = Sitecore.Mvc.Presentation.RenderingContext.CurrentOrNull.PageContext.Item; Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__final renderings"]; RenderingReference[] renderings = layoutField.GetReferences(Context.Device); var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList(); renderingsWithPersonalization = renderingsWithPersonalization.Where(r => currentRendering.Placeholder == r.Settings.Placeholder && currentRendering.DataSource == r.Settings.DataSource).ToList(); return(renderingsWithPersonalization); }
private string RenderPlaceholder(ElementItem item) { //Get Renderings Sitecore.Data.Fields.LayoutField layoutField = Context.Item.Fields["__renderings"]; Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(Context.Device); var output = new StringBuilder(); foreach (var renderingReference in renderings) { if (renderingReference.Placeholder == item.PlaceholderKey) { var path = renderingReference.RenderingItem.InnerItem.Fields["Path"].Value; output.AppendLine(RenderControl(path)); } } return(output.ToString()); }
protected void ProcessLayoutDefinition(List <RecommendedRenderingModel> result, Item item) { using (new SecurityStateSwitcher(SecurityState.Disabled)) { #if (SC72 || SC75) Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Renderings"]; #else Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Final Renderings"]; #endif if (layoutField == null) { return; } // Get all devices DeviceRecords devices = item.Database.Resources.Devices; foreach (var deviceRecord in devices.GetAll()) { // Get the rendering references for the default device Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(deviceRecord); if (renderings == null) { continue; } foreach (var renderingReference in renderings) { result.Add(new RecommendedRenderingModel { Placeholder = renderingReference.Placeholder, RenderingID = renderingReference.RenderingID.ToShortID().ToString() }); } } } }
// note: the dialog option is only because we're being lazy about what we pass along public DynamicResponse GetRenderings([FromUri] DynamicGetRequest request) //[FromUri]DynamicGetRequest request { var ret = new DynamicResponse(request.ItemId.Replace("{", "").Replace("}", "").ToLower(), request.Database); var language = LanguageManager.GetLanguage(request.Language); var db = Database.GetDatabase(request.Database); var item = db.GetItem(request.ItemId, language); ret.AddLayoutType("shared", "Shared"); ret.AddLayoutType("final", "Final"); foreach (var responseLayoutType in ret.LayoutTypes) { ID layoutFieldId = null; switch (responseLayoutType.Name) { case "final": layoutFieldId = Sitecore.FieldIDs.FinalLayoutField; break; case "shared": layoutFieldId = Sitecore.FieldIDs.LayoutField; break; default: layoutFieldId = Sitecore.FieldIDs.LayoutField; // shouldn't be needed, but just in case break; } // yes, there are two things holding the layout type - but that is because this one on the next line is for Response only //var responseLayoutType = ret.AddLayoutType(layoutTypeName); Sitecore.Data.Fields.LayoutField layoutField = item.Fields[layoutFieldId]; var layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[layoutFieldId]); int i = 0; foreach (var device in Devices) { i++; // this holds a flat dictionary of all renderings so we can place our parent/child relationships correctly var allRenderings = new Dictionary <string, ResponseRendering>(); var allRenderingsReversed = new Dictionary <string, List <ResponseRendering> >(); var responseDevice = responseLayoutType.AddDevice(item, layoutDefinition, device, layoutField.GetLayoutID(device)); //Sitecore.Layouts.DeviceDefinition device = layout.Devices[i] as Sitecore.Layouts.DeviceDefinition; // TODO: issue: we don't do this for the layout also! Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(device); // if (renderings == null) return; // this item doesn't have any renderings under the Default device. //string layoutXml = layoutField.Value; //responseDevice.Xml = layoutField.Value; if (renderings != null) { // add akk if them as responseRenderings first, in case my parent is after my child! foreach (var rendering in renderings) { var responseRendering = new ResponseRendering(rendering, layoutDefinition, item); // responseDevice.AddRendering(rendering); // TODO: no response needed! allRenderings.Add(responseRendering.UniqueId, responseRendering); // always add it to the flat list! } foreach (var responseRendering in allRenderings.Values) { // add to the proper rendering. Two cases here, depending on which comes first. // TODO: this line only works on Dyanmic - can we check to see if it's dynamic first? // - or rather we need to "try again" to find the used rendering if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId) && allRenderings.ContainsKey(responseRendering.ParentUniqueId)) { allRenderings[responseRendering.ParentUniqueId].AddRendering(item, layoutDefinition, responseRendering); } else if (string.IsNullOrEmpty(responseRendering.ParentUniqueId)) { var possiblePlaceholders = allRenderings.SelectMany(r => r.Value.Placeholders.ToList().Where(p => p.Name == responseRendering.PlaceholderName)).ToList(); if (possiblePlaceholders.Count > 0) { // this means we have the placeholder, but it's missing the ParentUniqueId var effectivePlaceholder = possiblePlaceholders.Last(); // this is where Sitecore will put it anyway, the last match. if (effectivePlaceholder.Dynamic) { responseRendering.InvalidDynamicPlaceholder = true; } if (!effectivePlaceholder.Dynamic && possiblePlaceholders.Count > 1) { effectivePlaceholder.DynamicRecommended = true; } effectivePlaceholder.AddRendering(responseRendering); responseRendering.PossiblePlaceholderPaths.AddRange(possiblePlaceholders.Select(p => p.Name + "-" + p.ParentUniqueId)); } else // we just add it to the device if it's really not found. Due to rendering order OR it's really invalid { responseDevice.AddRendering(item, layoutDefinition, responseRendering); } } else if (allRenderingsReversed.ContainsKey(responseRendering.UniqueId)) // I am not sure what this was even for? It will never come here now! //responseRendering.RemoveRenderingRange(allRenderingsReversed); { responseRendering.AddRenderingRange(item, layoutDefinition, allRenderingsReversed[responseRendering.UniqueId]); // could have collected a bunch by now } // TODO: but I need to remove it when this happens. So don't add the ones with parents, duh // - they DEFINITELY don't go in the maincontent then lol (at least, not right now) if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId)) { if (!allRenderingsReversed.ContainsKey(responseRendering.ParentUniqueId)) { allRenderingsReversed.Add(responseRendering.ParentUniqueId, new List <ResponseRendering>()); } allRenderingsReversed[responseRendering.ParentUniqueId].Add(responseRendering); } } // TODO: loop through and "arange" } } } return(ret); //HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK) //{ // Content = new StringContent("") //}; //result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/xml"); //application/octet-stream //return result; }
public DynamicResponse GetRenderings(string id, string language, int version, string database) //[FromUri]DynamicGetRequest request { var ret = new DynamicResponse(id.Replace("{", "").Replace("}", "").ToLower(), database); var db = Sitecore.Data.Database.GetDatabase(database); var item = db.GetItem(id); ret.AddLayoutType("shared", "Shared"); ret.AddLayoutType("final", "Final"); foreach (var responseLayoutType in ret.LayoutTypes) { ID layoutFieldId = null; switch (responseLayoutType.Name) { case "final": layoutFieldId = Sitecore.FieldIDs.FinalLayoutField; break; case "shared": layoutFieldId = Sitecore.FieldIDs.LayoutField; break; default: layoutFieldId = Sitecore.FieldIDs.LayoutField; // shouldn't be needed, but just in case break; } // yes, there are two things holding the layout type - but that is because this one on the next line is for Response only //var responseLayoutType = ret.AddLayoutType(layoutTypeName); Sitecore.Data.Fields.LayoutField layoutField = item.Fields[layoutFieldId]; var layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[layoutFieldId]); int i = 0; foreach (var device in devices) { i++; // this holds a flat dictionary of all renderings so we can place our parent/child relationships correctly var allRenderings = new Dictionary <string, ResponseRendering>(); var allRenderingsReversed = new Dictionary <string, List <ResponseRendering> >(); var responseDevice = responseLayoutType.AddDevice(item, layoutDefinition, device, layoutField.GetLayoutID(device)); //Sitecore.Layouts.DeviceDefinition device = layout.Devices[i] as Sitecore.Layouts.DeviceDefinition; Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(device); // if (renderings == null) return; // this item doesn't have any renderings under the Default device. //string layoutXml = layoutField.Value; //responseDevice.Xml = layoutField.Value; if (renderings != null) { // TODO: NEST! that's the WHOLE THING! foreach (var rendering in renderings) { var responseRendering = new ResponseRendering(rendering, layoutDefinition, item); // responseDevice.AddRendering(rendering); // TODO: no response needed! // add to the proper rendering. Two cases here, depending on which comes first. if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId) && allRenderings.ContainsKey(responseRendering.ParentUniqueId)) { allRenderings[responseRendering.ParentUniqueId].AddRendering(item, layoutDefinition, responseRendering); } else if (allRenderingsReversed.ContainsKey(responseRendering.UniqueId)) { //responseRendering.RemoveRenderingRange(allRenderingsReversed); responseRendering.AddRenderingRange(item, layoutDefinition, allRenderingsReversed[responseRendering.UniqueId]); // could have collected a bunch by now } if (string.IsNullOrEmpty(responseRendering.ParentUniqueId)) // this means the path wasn't built with a GUID, so I couldn't find it. TODO: Fix it anyway! { responseDevice.AddRendering(item, layoutDefinition, responseRendering); } // TODO: but I need to remove it when this happens. So don't add the ones with parents, duh // - they DEFINITELY don't go in the maincontent then lol (at least, not right now) allRenderings.Add(responseRendering.UniqueId, responseRendering); // always add it to the flat list! if (!string.IsNullOrEmpty(responseRendering.ParentUniqueId)) { if (!allRenderingsReversed.ContainsKey(responseRendering.ParentUniqueId)) { allRenderingsReversed.Add(responseRendering.ParentUniqueId, new List <ResponseRendering>()); } allRenderingsReversed[responseRendering.ParentUniqueId].Add(responseRendering); } } // TODO: loop through and "arange" } } } return(ret); //HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK) //{ // Content = new StringContent("") //}; //result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/xml"); //application/octet-stream //return result; }