protected override bool Execute(T ruleContext) { SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext"); SC.Diagnostics.Assert.ArgumentNotNull( ruleContext.Item, "ruleContext.Item"); SC.Diagnostics.Assert.ArgumentNotNullOrEmpty( this.PlaceholderKey, "PlaceholderKey"); SC.Diagnostics.Assert.IsTrue( this.MaxRenderings > 0, "MaxRenderings"); // note: retrieving the field value without using LayoutField // would not support layout deltas. SC.Data.Fields.LayoutField field = ruleContext.Item.Fields[SC.FieldIDs.LayoutField]; string xml = field.Value; if (String.IsNullOrEmpty(xml)) { // number 5 is alive return(false); } ArrayList devices = SC.Layouts.LayoutDefinition.Parse(xml).Devices; if (devices == null) { return(false); } return(this.CheckRenderingCounts(devices, ruleContext)); }
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"; } }
[Route("SaveRenderings")] ///{itemid}/{database} do these still need to be here? public DynamicResponse SaveRenderings(DynamicSaveRequest request) { var ret = GetRenderings(request); // TODO: compare (or keep a log of changes to send on the front end?) // this first iteration assumes the same structure with only updates. // TODO: SAVE it! // wait - we don't care about hierarchy! we only care about updating the placeholder! // start with the placeholer path and the datasource field... // which needs to be reverse mapped, maybe var language = LanguageManager.GetLanguage(request.Language); var db = Database.GetDatabase(request.Database); var item = db.GetItem(request.ItemId, language); foreach (var layoutType in request.LayoutTypes) { ID layoutFieldId = null; switch (layoutType.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; } Sitecore.Data.Fields.LayoutField layoutField = item.Fields[layoutFieldId]; var layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(item[layoutFieldId]); string layoutXml = layoutField.Value; var xmlLayoutDoc = new XmlDocument(); xmlLayoutDoc.LoadXml(layoutXml); foreach (var device in layoutType.Devices) { UpdateRendering(device.Placeholders, xmlLayoutDoc, db, device); } item.Editing.BeginEdit(); layoutField.Value = xmlLayoutDoc.OuterXml; //var test = xmlLayoutDoc.OuterXml; item.Editing.EndEdit(); } return(GetRenderings(request)); }
public override void Execute(Sitecore.Shell.Framework.Commands.CommandContext context) { if (context.Parameters != null && context.Parameters.Count > 0) { try { string itemID = context.Parameters["itemID"] ?? ""; itemID = Util.FormatID(itemID); string dsID = context.Parameters["dataSourceID"] ?? ""; dsID = Util.FormatID(dsID); string renderingID = context.Parameters["renderingID"] ?? ""; renderingID = Util.FormatID(renderingID); string deviceID = context.Parameters["deviceID"] ?? ""; deviceID = Util.FormatID(deviceID); string dbName = context.Parameters["dbName"] ?? ""; Sitecore.Data.Database db = Sitecore.Data.Database.GetDatabase(dbName); if (db != null) { Item i = db.GetItem(itemID); try { string name = i.Name; } catch { } if (i != null && Sitecore.Data.ID.IsID(renderingID) && Sitecore.Data.ID.IsID(dsID)) { using (new EditContext(i)) { Sitecore.Data.Fields.LayoutField layoutField = new Sitecore.Data.Fields.LayoutField(i.Fields[Sitecore.FieldIDs.LayoutField]); Sitecore.Layouts.LayoutDefinition layoutDefinition = Sitecore.Layouts.LayoutDefinition.Parse(layoutField.Value); Sitecore.Layouts.DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(deviceID); foreach (Sitecore.Layouts.RenderingDefinition rd in deviceDefinition.Renderings) { if (HealthIS.Apps.Util.FormatID(rd.UniqueId) == renderingID) { rd.Datasource = HealthIS.Apps.Util.FormatID(dsID); layoutField.Value = layoutDefinition.ToXml(); } } } } else { Exception ex = new Exception("Update Datasource Issue with id: " + itemID + " or dsID: " + dsID + " or i: " + i); Util.LogError(ex.Message, ex, this); } } } catch (Exception ex) { Util.LogError(ex.Message, ex, this); } } }
// GET: Rules public ActionResult Index(string id) { var db = Sitecore.Context.Database; var testUathentication = Sitecore.Context.User.IsAuthenticated; if (db == null) { Sitecore.Configuration.Factory.GetDatabase("master"); } var item = db.GetItem(ID.Parse(id)); Sitecore.Data.Fields.LayoutField layoutField = item.Fields["__Final renderings"]; //Sitecore.Layouts.RenderingReference[] renderings = layoutField.GetReferences(Sitecore.Context.Device); var renderings = item.Visualization.GetRenderings(Sitecore.Context.Device, false); var renderingsWithPersonalization = renderings.Where(r => r.Settings.Rules.Count > 0).ToList(); var rulesName = new List <string>(); foreach (var rendering in renderingsWithPersonalization) { foreach (var rule in rendering.Settings.Rules.Rules) { var ruleContext = new Sitecore.Rules.ConditionalRenderings.ConditionalRenderingsRuleContext( renderings.ToList(), rendering); if (rule.Evaluate(ruleContext)) { rulesName.Add(rule.Name); } } } return(View(rulesName)); //Item item = db.GetItem(ID.Parse(id)); //item. //Item ruleItem = db.GetItem(new Sitecore.Data.ID(SitecoreConstants.ItemGUID), item.Language); //String rule = ruleItem.Fields["Rule"].Value; //var rules = RuleFactory.ParseRules<RuleContext>(item.Database, XElement.Parse(rule)); //var ruleContext = new RuleContext() //{ // Item = item //}; //rules.Rules.First(). //if (rules.Rules.Any()) // return rules.Rules.First().Evaluate(ruleContext); }
/// <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() }); } } } }
public override void Apply(T ruleContext) { SC.Diagnostics.Assert.ArgumentNotNull(ruleContext, "ruleContext"); SC.Diagnostics.Assert.ArgumentNotNull( ruleContext.Item, "ruleContext.Item"); SC.Data.Fields.LayoutField layoutDetails = ruleContext.Item.Fields[SC.FieldIDs.LayoutField]; SC.Diagnostics.Assert.IsNotNull(layoutDetails, "layoutDetails"); if (String.IsNullOrEmpty(layoutDetails.Value) || layoutDetails.InnerField.ContainsStandardValue) { return; } SC.Layouts.LayoutDefinition layout = SC.Layouts.LayoutDefinition.Parse(layoutDetails.Value); bool modified = false; for (int i = 0; i < layout.Devices.Count; i++) { SC.Layouts.DeviceDefinition device = layout.Devices[i] as SC.Layouts.DeviceDefinition; SC.Diagnostics.Assert.IsNotNull(device, "device"); for (int j = 0; j < device.Renderings.Count; j++) { SC.Layouts.RenderingDefinition rendering = device.Renderings[j] as SC.Layouts.RenderingDefinition; SC.Diagnostics.Assert.IsNotNull(rendering, "rendering"); if (String.IsNullOrEmpty(rendering.Datasource) || !rendering.Datasource.StartsWith("/")) { continue; } SC.Data.Items.Item dataSource = ruleContext.Item.Database.GetItem(rendering.Datasource); if (dataSource == null) { string msg = this + " : unable to retrieve data source item " + rendering.Datasource + " in " + ruleContext.Item.Paths.FullPath; SC.Diagnostics.Log.Warn(msg, this); continue; } rendering.Datasource = dataSource.ID.ToString(); modified = true; } } if (modified) { using (new SC.Data.Items.EditContext(ruleContext.Item, false, false)) { layoutDetails.Value = layout.ToXml(); } } }
// 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; }