protected void AddPlaceholder(ClientPipelineArgs args) { if (args.IsPostBack) { if (string.IsNullOrEmpty(args.Result) || !(args.Result != "undefined")) { return; } LayoutDefinition layoutDefinition = CustomDeviceEditor.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); string placeholderKey; Item dialogResult = SelectPlaceholderSettingsOptions.ParseDialogResult(args.Result, Client.ContentDatabase, out placeholderKey); if (dialogResult == null || string.IsNullOrEmpty(placeholderKey)) { return; } PlaceholderDefinition placeholderDefinition = new PlaceholderDefinition() { UniqueId = ID.NewID.ToString(), MetaDataItemId = dialogResult.Paths.FullPath, Key = placeholderKey }; device.AddPlaceholder(placeholderDefinition); CustomDeviceEditor.SetDefinition(layoutDefinition); this.Refresh(); } else { SheerResponse.ShowModalDialog(new SelectPlaceholderSettingsOptions() { IsPlaceholderKeyEditable = true }.ToUrlString().ToString(), "460px", "460px", string.Empty, true); args.WaitForPostBack(); } }
internal ResponseDevice AddDevice(Item contextItem, LayoutDefinition layoutDefinition, DeviceItem item, ID layoutID) { var layoutDevice = new ResponseDevice(contextItem, layoutDefinition, item, layoutID); _Devices.Add(layoutDevice); return(layoutDevice); }
void AddLocalContentParts(Package package, PackageDefinition manifest, LayoutDefinition layout, string baseDirectory, string relativeDirectory) { var currentDirectory = Path.Combine(baseDirectory, relativeDirectory); foreach (var file in fileSystem.EnumerateFiles(currentDirectory)) { var uniqueFileName = Guid.NewGuid().ToString("N"); var partUri = new Uri("LocalContent/" + uniqueFileName, UriKind.Relative); AddContent(package, manifest, partUri, file); //add file definition var fileDate = DateTime.UtcNow; //todo: use original timestamps if un-modified layout.FileDefinitions.Add( new FileDefinition { FilePath = "\\" + Path.Combine(relativeDirectory, Path.GetFileName(file)), Description = new FileDescription { DataContentReference = partUri.ToString(), ReadOnly = false, Created = fileDate, Modified = fileDate } }); } foreach (var subDirectory in Directory.GetDirectories(currentDirectory).Select(x => new DirectoryInfo(x))) { AddLocalContentParts(package, manifest, layout, baseDirectory, Path.Combine(relativeDirectory, subDirectory.Name)); } }
protected override bool Execute(T ruleContext) { if (string.IsNullOrWhiteSpace(RenderingItemId) || !ID.IsID(RenderingItemId)) { return(false); } var enhancedContext = ruleContext as PlaceholderSettingsRuleContext; if (enhancedContext == null) { return(false); } var layoutDefinition = LayoutDefinition.Parse(enhancedContext.Args.LayoutDefinition); var renderings = layoutDefinition.Devices.Cast <DeviceDefinition>() .Where(x => x != null) .SelectMany(x => x.Renderings.Cast <RenderingDefinition>()) .ToArray(); if (!renderings.Any()) { return(false); } var isNested = renderings.Any(x => x.ItemID.Equals(RenderingItemId, StringComparison.InvariantCultureIgnoreCase) && enhancedContext.PlaceholderKeyPath.TrimStart('/').StartsWith(x.Placeholder.TrimStart('/'))); return(isNested); }
public ResponseDevice(Item contextItem, LayoutDefinition layoutDefinition, DeviceItem deviceItem, ID layoutID) { Id = deviceItem.ID.ToString().Replace("{", "").Replace("}", "").ToLower(); Name = deviceItem.Name; DisplayName = deviceItem.DisplayName; LayoutItem layoutItem = deviceItem.Database.GetItem(layoutID); if (layoutItem != null) { LayoutName = layoutItem.Name; LayoutDisplayName = layoutItem.DisplayName; LayoutId = layoutItem.ID.ToString().Replace("{", "").Replace("}", "").ToLower(); _Placeholders = Utility.FindPlaceholders(contextItem, layoutDefinition, layoutItem); } Icon = ThemeManager.GetIconImage(deviceItem.InnerItem, 32, 32, "", ""); // TODO: until we figure this out - it will show as invalid... kind of - unless we don't worry about this level? // var placeHolderControlList = layoutItem.Control.Controls.Cast<Control>() //.Where(x => x is global::Sitecore.Web.UI.WebControls.Placeholder) //.Cast<global::Sitecore.Web.UI.WebControls.Placeholder>().ToList(); // placeHolderControlList.ForEach(ph => AddPlaceholder(ph.RenderingName)); }
protected override void ProcessPlaceholderSettings(Item item, LayoutDefinition layout, DeviceDefinition device, List <PlaceholderDefinition> placeholders) { if (placeholders.Any()) { if (!ShouldProcess(item.GetProviderPath(), $"Remove placeholder setting(s) '{placeholders.Select(r => r.MetaDataItemId.ToString()).Aggregate((seed, curr) => seed + ", " + curr)}' from device {Device.Name}") ) { return; } foreach ( var placeholderSetting in placeholders.Select(rendering => device.Placeholders.Cast <PlaceholderDefinition>() .FirstOrDefault(r => r.UniqueId == rendering.UniqueId)) .Where(placeholder => placeholder != null) .Reverse()) { device.Placeholders.Remove(placeholderSetting); } item.Edit(p => { var outputXml = layout.ToXml(); LayoutField.SetFieldValue(Item.Fields[LayoutFieldId], outputXml); }); } else { WriteError(typeof(ObjectNotFoundException), "Cannot find a placeholder setting to remove", ErrorIds.PlaceholderSettingNotFound, ErrorCategory.ObjectNotFound, null); } }
/// <summary> /// Identify the items with a presentation detail /// </summary> /// <param name="item">Item to check</param> /// <returns></returns> private bool IsPage(Item item) { var result = false; var layoutField = new LayoutField(item.Fields[FieldIDs.LayoutField]); if (!layoutField.InnerField.HasValue || string.IsNullOrEmpty(layoutField.Value)) { return(false); } var layout = LayoutDefinition.Parse(layoutField.Value); foreach (var deviceObj in layout.Devices) { var device = deviceObj as DeviceDefinition; if (device == null) { return(false); } if (device.Renderings.Count > 0) { result = true; } } return(result); }
/// <summary> /// Gets the layout definition. /// </summary> /// <returns> /// The layout definition. /// </returns> /// <contract><ensures condition="not null" /></contract> private static LayoutDefinition GetLayoutDefinition() { string sessionString = WebUtil.GetSessionString(DeviceEditorForm.GetSessionHandle()); Assert.IsNotNull(sessionString, "layout definition"); return(LayoutDefinition.Parse(sessionString)); }
/// <summary> /// Sets the definition. /// </summary> /// <param name="layout"> /// The layout. /// </param> private static void SetDefinition(LayoutDefinition layout) { Assert.ArgumentNotNull(layout, "layout"); string value = layout.ToXml(); WebUtil.SetSessionValue(DeviceEditorForm.GetSessionHandle(), value); }
protected void Remove(Message message) { Assert.ArgumentNotNull(message, "message"); int selectedIndex = this.SelectedIndex; if (selectedIndex < 0) { return; } LayoutDefinition layoutDefinition = DeviceEditorForm.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); System.Collections.ArrayList renderings = device.Renderings; if (renderings == null) { return; } if (selectedIndex < 0 || selectedIndex >= renderings.Count) { return; } renderings.RemoveAt(selectedIndex); if (selectedIndex >= 0) { this.SelectedIndex--; } DeviceEditorForm.SetDefinition(layoutDefinition); this.Refresh(); }
protected void SortUp(Message message) { Assert.ArgumentNotNull(message, "message"); if (this.SelectedIndex <= 0) { return; } LayoutDefinition layoutDefinition = DeviceEditorForm.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); System.Collections.ArrayList renderings = device.Renderings; if (renderings == null) { return; } RenderingDefinition renderingDefinition = renderings[this.SelectedIndex] as RenderingDefinition; if (renderingDefinition == null) { return; } renderings.Remove(renderingDefinition); renderings.Insert(this.SelectedIndex - 1, renderingDefinition); this.SelectedIndex--; DeviceEditorForm.SetDefinition(layoutDefinition); this.Refresh(); }
/// <summary> /// Handles a click on the OK button. /// </summary> /// <param name="sender"> /// The sender. /// </param> /// <param name="args"> /// The arguments. /// </param> /// <remarks> /// When the user clicks OK, the dialog is closed by calling /// the <see cref="M:Sitecore.Web.UI.Sheer.ClientResponse.CloseWindow">CloseWindow</see> method. /// </remarks> protected override void OnOK(object sender, System.EventArgs args) { Assert.ArgumentNotNull(sender, "sender"); Assert.ArgumentNotNull(args, "args"); if (this.Layout.Value.Length > 0) { Item item = Client.ContentDatabase.GetItem(this.Layout.Value); if (item == null) { Context.ClientPage.ClientResponse.Alert("Layout not found."); return; } if (item.TemplateID == TemplateIDs.Folder || item.TemplateID == TemplateIDs.Node) { Context.ClientPage.ClientResponse.Alert(Translate.Text("\"{0}\" is not a layout.", new object[] { item.DisplayName })); return; } } LayoutDefinition layoutDefinition = DeviceEditorForm.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); System.Collections.ArrayList renderings = device.Renderings; if (renderings != null && renderings.Count > 0 && this.Layout.Value.Length == 0) { Context.ClientPage.ClientResponse.Alert("You must specify a layout when you specify renderings."); return; } device.Layout = this.Layout.Value; DeviceEditorForm.SetDefinition(layoutDefinition); Context.ClientPage.ClientResponse.SetDialogValue("yes"); base.OnOK(sender, args); }
/// <summary> /// Updates the state of the commands. /// </summary> private void UpdateRenderingsCommandsState() { if (this.SelectedIndex < 0) { this.ChangeButtonsState(true); return; } LayoutDefinition layoutDefinition = DeviceEditorForm.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); System.Collections.ArrayList renderings = device.Renderings; if (renderings == null) { this.ChangeButtonsState(true); return; } RenderingDefinition renderingDefinition = renderings[this.SelectedIndex] as RenderingDefinition; if (renderingDefinition == null) { this.ChangeButtonsState(true); return; } this.ChangeButtonsState(false); this.Personalize.Disabled = !string.IsNullOrEmpty(renderingDefinition.MultiVariateTest); this.Test.Disabled = DeviceEditorForm.HasRenderingRules(renderingDefinition); }
protected void SortUp(Message message) { Assert.ArgumentNotNull((object)message, "message"); if (this.SelectedIndex <= 0) { return; } LayoutDefinition layoutDefinition = CustomDeviceEditor.GetLayoutDefinition(); ArrayList renderings = layoutDefinition.GetDevice(this.DeviceID).Renderings; if (renderings == null) { return; } RenderingDefinition renderingDefinition = renderings[this.SelectedIndex] as RenderingDefinition; if (renderingDefinition == null) { return; } renderings.Remove((object)renderingDefinition); renderings.Insert(this.SelectedIndex - 1, (object)renderingDefinition); --this.SelectedIndex; CustomDeviceEditor.SetDefinition(layoutDefinition); this.Refresh(); }
protected override void ProcessRenderings(Item item, LayoutDefinition layout, DeviceDefinition device, IEnumerable <RenderingDefinition> renderings) { if (renderings.Any()) { if (!ShouldProcess(item.GetProviderPath(), $"Remove rendering(s) '{renderings.Select(r => r.ItemID.ToString()).Aggregate((seed, curr) => seed + ", " + curr)}' from device {Device.Name}")) { return; } foreach ( var instanceRendering in renderings.Select(rendering => device.Renderings.Cast <RenderingDefinition>() .FirstOrDefault(r => r.UniqueId == rendering.UniqueId)) .Where(instanceRendering => instanceRendering != null) .Reverse()) { device.Renderings.Remove(instanceRendering); } item.Edit(p => { var outputXml = layout.ToXml(); Item[LayoutFieldId] = outputXml; }); } else { WriteError(typeof(ObjectNotFoundException), "Cannot find a rendering to remove", ErrorIds.RenderingNotFound, ErrorCategory.ObjectNotFound, null); } }
/// <summary> /// Refreshes this instance. /// </summary> private void Refresh() { this.Renderings.Controls.Clear(); this.Placeholders.Controls.Clear(); this.Controls = new System.Collections.ArrayList(); LayoutDefinition layoutDefinition = DeviceEditorForm.GetLayoutDefinition(); DeviceDefinition device = layoutDefinition.GetDevice(this.DeviceID); if (device.Renderings == null) { SheerResponse.SetOuterHtml("Renderings", this.Renderings); SheerResponse.SetOuterHtml("Placeholders", this.Placeholders); SheerResponse.Eval("if (!scForm.browser.isIE) { scForm.browser.initializeFixsizeElements(); }"); return; } int selectedIndex = this.SelectedIndex; this.RenderRenderings(device, selectedIndex, 0); this.RenderPlaceholders(device); this.UpdateRenderingsCommandsState(); this.UpdatePlaceholdersCommandsState(); SheerResponse.SetOuterHtml("Renderings", this.Renderings); SheerResponse.SetOuterHtml("Placeholders", this.Placeholders); SheerResponse.Eval("if (!scForm.browser.isIE) { scForm.browser.initializeFixsizeElements(); }"); }
private LayoutDefinition GetLayout(string name) { if (layoutDefinitions.Count == 0) { string message = string.Format("Loading Layout: {0}", name); ConsoleLog(message); var layoutsDefinitionsText = File.ReadAllText(Path.Combine(appDataFolder, @".\Layouts\Layouts.json")); var layouts = (JObject)JsonConvert.DeserializeObject(layoutsDefinitionsText); foreach (var layoutJson in layouts["Layouts"]) { var layout = layoutJson.ToObject <LayoutDefinition>(); if (!layoutDefinitions.Contains(layout)) { layoutDefinitions.Add(layout); } } } LayoutDefinition result = layoutDefinitions.SingleOrDefault(x => x.Name == name); if (result == null) { result = layoutDefinitions.First(); string message = string.Format("Layout Not Defined: {0}\rUsing First Layout: {1}", name, result.Name); ConsoleLog(message); } return(result); }
public void CleanRenderings(Item item, string renderingID, string placeholder) { LayoutField layoutField = new LayoutField(item.Fields[FieldIDs.FinalLayoutField]); LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value); DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(GetDefaultDeviceItem(item.Database).ID.ToString()); List <string> placeholders = new List <string>(); foreach (RenderingDefinition rendering in deviceDefinition.Renderings) { if (rendering.ItemID.ToLower() == "{C1624533-ED68-41AC-B03C-BFDE4D9B1F2A}".ToLower()) { placeholders.Add(StringUtil.EnsurePrefix('/', rendering.Placeholder + "/" + placeholder + "_" + new Guid(rendering.UniqueId).ToString("D").ToLower())); } } List <RenderingDefinition> renderingsToRemove = new List <RenderingDefinition>(); foreach (RenderingDefinition rendering in deviceDefinition.Renderings) { if (rendering.ItemID.ToLower() == renderingID.ToLower() && placeholders.Contains(rendering.Placeholder)) { renderingsToRemove.Add(rendering); } } foreach (var rendering in renderingsToRemove) { deviceDefinition.Renderings.Remove(rendering); } using (new SecurityDisabler()) { item.Editing.BeginEdit(); layoutField.Value = layoutDefinition.ToXml(); item.Editing.EndEdit(); } }
public static void MergeLayouts([NotNull] this Item item) { //Grab the field that contains the layout var layoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.LayoutField]); //Grab the field that contains the final layout var finalLayoutField = new LayoutField(item.Fields[Sitecore.FieldIDs.FinalLayoutField]); if (layoutField == null) { throw new Exception("Couldn't find layout on: {0}".FormatWith(item.Name)); } if (finalLayoutField == null) { throw new Exception("Couldn't find final layout on: {0}".FormatWith(item.Name)); } //If we don't have a final layout delta, we're good! if (string.IsNullOrWhiteSpace(finalLayoutField.Value)) { return; } var finalLayoutDefinition = LayoutDefinition.Parse(finalLayoutField.Value); using (new EditContext(item)) { layoutField.Value = finalLayoutDefinition.ToXml(); item.Fields["__Final Renderings"].Reset(); item.Editing.AcceptChanges(); } }
public void AddRendering(Item item, string renderingID, string placeholder, Item datasource) { LayoutField layoutField = new LayoutField(item.Fields[FieldIDs.FinalLayoutField]); LayoutDefinition layoutDefinition = LayoutDefinition.Parse(layoutField.Value); DeviceDefinition deviceDefinition = layoutDefinition.GetDevice(GetDefaultDeviceItem(item.Database).ID.ToString()); foreach (RenderingDefinition rendering in deviceDefinition.Renderings) { if (rendering.ItemID.ToLower() == "{C1624533-ED68-41AC-B03C-BFDE4D9B1F2A}".ToLower()) { placeholder = StringUtil.EnsurePrefix('/', rendering.Placeholder + "/" + placeholder + "_" + new Guid(rendering.UniqueId).ToString("D").ToLower()); break; } } var newRendering = new RenderingDefinition { Placeholder = placeholder, ItemID = renderingID, Datasource = datasource.ID.ToString() }; deviceDefinition.AddRendering(newRendering); using (new SecurityDisabler()) { item.Editing.BeginEdit(); layoutField.Value = layoutDefinition.ToXml(); item.Editing.EndEdit(); } }
protected override void ProcessItem(Item item) { LayoutField layoutField = item.Fields[LayoutFieldId]; if (string.IsNullOrEmpty(layoutField?.Value)) { return; } var layout = LayoutDefinition.Parse(layoutField.Value); if (Device == null) { Device = CurrentDatabase.Resources.Devices.GetAll().FirstOrDefault(d => d.IsDefault); } if (Device == null) { WriteError( new ErrorRecord( new ObjectNotFoundException( "Device not provided and no default device in the system is defined."), "sitecore_device_not_found", ErrorCategory.InvalidData, null)); return; } var device = layout.GetDevice(Device.ID.ToString()); if (device != null) { ProcessLayout(item, layout, device); } }
private static string ApplyActionToLayoutXml(Item item, string xml, string branchBasePath) { var layout = LayoutDefinition.Parse(xml); xml = layout.ToXml(); for (var deviceIndex = layout.Devices.Count - 1; deviceIndex >= 0; deviceIndex--) { var device = layout.Devices[deviceIndex] as DeviceDefinition; if (device == null) { continue; } for (var renderingIndex = device.Renderings.Count - 1; renderingIndex >= 0; renderingIndex--) { var rendering = device.Renderings[renderingIndex]; if (rendering is RenderingDefinition) { var renderingdefn = rendering as RenderingDefinition; RelinkRenderingDatasource(item, renderingdefn, branchBasePath); } } } var layoutXml = layout.ToXml(); return(layoutXml != xml ? layoutXml : null); }
public ResponsePlaceholder(Item contextItem, LayoutDefinition layoutDefinition, string name, string parentUniqueId, bool exists = true, bool dynamic = true) { Name = name; ParentUniqueId = parentUniqueId; Exists = exists; Icon = "<img src=\"/temp/IconCache/Business/16x16/table_selection_block.png\" alt=\"\" />"; Dynamic = dynamic; //DynamicPlaceholderName = name + "-" + ParentUniqueId + ""; ValidRenderings = new List <ResponsePlaceholderRendering>(); // TODO: find all the valid renderings! GetPlaceholderRenderingsArgs args = new GetPlaceholderRenderingsArgs(Name, layoutDefinition.ToXml(), contextItem.Database); //args.ContextItemPath = contextItem.Paths.FullPath; //args.ShowDialogIfDatasourceSetOnRenderingItem = true; CorePipeline.Run("getPlaceholderRenderings", args); if (args.PlaceholderRenderings != null) { foreach (var placeholderRendering in args.PlaceholderRenderings) { ValidRenderings.Add(new ResponsePlaceholderRendering(placeholderRendering, layoutDefinition, contextItem)); } } }
public void ShouldProduceValidManifestXml() { var manifest = new PackageDefinition { MetaData = { AzureVersion = "2.6" } }; manifest.Contents.Add( new ContentDefinition { Name = "ServiceDefinition/ServiceDefinition.csdef", Description = new ContentDescription { LengthInBytes = 688, HashAlgorithm = IntegrityCheckHashAlgorithm.Sha256, Hash = "NMkHuVQbi+g+ny+kvjiunBgt8rLQT8Jd9FGJvWsRtZE=", DataStorePath = new Uri("ServiceDefinition/ServiceDefinition.csdef", UriKind.Relative) } }); manifest.Contents.Add( new ContentDefinition { Name = "LocalContent/ab3574e8f52d4c939aa6ff065e8b7cfd", Description = new ContentDescription { LengthInBytes = 19469, HashAlgorithm = IntegrityCheckHashAlgorithm.Sha256, Hash = "UK4lyWPyRI6I8WNzlVP2dtiFZj+kjMIjyGieq5b4TiE=", DataStorePath = new Uri("LocalContent/ab3574e8f52d4c939aa6ff065e8b7cfd", UriKind.Relative) } }); var workerRoleLayout = new LayoutDefinition { Name = "Roles/WorkerRole1" }; workerRoleLayout.FileDefinitions.Add(new FileDefinition { FilePath = "\\Cloud.uar.csman", Description = new FileDescription { DataContentReference = "LocalContent/ab3574e8f52d4c939aa6ff065e8b7cfd", Created = DateTime.UtcNow, Modified = DateTime.UtcNow } }); manifest.Layouts.Add(workerRoleLayout); var manifestXml = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); manifestXml.Add(manifest.ToXml()); var schemaSet = new XmlSchemaSet(); schemaSet.Add(null, XmlReader.Create(new StringReader(GetPackageManifestSchema()), XmlUtils.DtdSafeReaderSettings)); manifestXml.Validate(schemaSet, (o, e) => { Assert.Fail("Xml failed to validate: " + e.Message); }); }
internal ResponseRendering AddRendering(Item contextItem, LayoutDefinition layoutDefinition, ResponseRendering responseRendering) { var placeholder = _Placeholders.SingleOrDefault(p => p.Name == responseRendering.PlaceholderName && (!p.Dynamic || p.ParentUniqueId == responseRendering.ParentUniqueId)); if (placeholder == null) { // TODO: but this would be a NOT FOUND situation? // - basically this means that that placeholder wasn't really on that rendering // - or it is dynamic and not referenced dynamically! //var possiblePlaceholders = _Placeholders.Where(p => p.Dynamic && p.Name == responseRendering.PlaceholderName).ToList(); //if (possiblePlaceholders.Count > 0) { // this means that we are dynamic, but we haven't built out our placeholder name with the guid, etc // // TODO: what about seed? // responseRendering.PossiblePlaceholderPaths.AddRange(possiblePlaceholders.Select(p => p.Name + "-" + p.ParentUniqueId)); // TODO: check if this causes any recursion problems? // placeholder = new ResponsePlaceholder(contextItem, layoutDefinition, responseRendering.PlaceholderName, "", false, true); //} else { //} placeholder = new ResponsePlaceholder(contextItem, layoutDefinition, responseRendering.PlaceholderName, "", false, false); _Placeholders.Add(placeholder); } var rendering = placeholder.AddRendering(responseRendering); return(rendering); }
private LayoutDefinition GetLayoutDefinition() { var xml = WebEditUtil.ConvertJSONLayoutToXML(WebUtil.GetFormValue("scLayout")); var layoutDefinition = LayoutDefinition.Parse(xml); return(layoutDefinition); }
///<summary> /// When working with the Presentation Layer for Sitecore, you can specify a Datasource as a property /// for a control. However, accessing the item that is set brings a bit of a challenge. Hopefully this fixes that. ///</summary> ///<param name = "database">Sitecore Database to Use. Usually From Context.</param> ///<param name = "device">Sitecore Device to Use. Usually from Context.</param> ///<param name = "item">Item to get the Layout Renderings from.</param> ///<param name = "sublayoutItem"> /// Item reference to the Sublayout or Webcontrol that you would like to use for getting the datasource from. ///</param> ///<returns>Datasource Item. If no Datasource Item is listed in the layout properties, returns Null.</returns> ///<exception cref = "ItemNotFoundException">Thrown when Sitecore can't find a specified datasource item entry.</exception> public static Item GetDatasourceFromControl(Database database, DeviceItem device, Item item, Item sublayoutItem) { Item datasourceItem = null; // Get the Layout definition from the current item string rend = item.Fields["__renderings"].Value; LayoutDefinition layout = LayoutDefinition.Parse(rend); // Get the current device definition DeviceDefinition deviceDef = layout.GetDevice(device.ID.ToString()); // Get the sublayout to find Item mySublayout = database.GetItem(sublayoutItem.ID); // Get the definition for the sublayout RenderingDefinition rendering = deviceDef.GetRendering(mySublayout.ID.ToString()); if (!String.IsNullOrEmpty(rendering.Datasource)) { datasourceItem = database.GetItem(rendering.Datasource); if (datasourceItem == null) { throw new ItemNotFoundException("Could not find datasource item at " + rendering.Datasource); } } return(datasourceItem); }
private static string ApplyActionToLayoutXml(string xml, Action <RenderingDefinition> action) { var layout = LayoutDefinition.Parse(xml); // normalize the output in case of any minor XML differences (spaces, etc) xml = layout.ToXml(); // loop over devices in the rendering for (var deviceIndex = layout.Devices.Count - 1; deviceIndex >= 0; deviceIndex--) { var device = layout.Devices[deviceIndex] as DeviceDefinition; if (device == null) { continue; } // loop over renderings within the device for (var renderingIndex = device.Renderings.Count - 1; renderingIndex >= 0; renderingIndex--) { var rendering = device.Renderings[renderingIndex] as RenderingDefinition; if (rendering == null) { continue; } // run the action on the rendering action(rendering); } } var layoutXml = layout.ToXml(); // save a modified layout value if necessary return(layoutXml != xml ? layoutXml : null); }
protected override void ProcessItem(Item item) { if (ShouldProcess(item.GetProviderPath(), string.Format("Set layout '{0}'", Layout.GetProviderPath()))) { LayoutField layoutField = item.Fields[LayoutFieldId]; if (layoutField == null) { return; } var layout = LayoutDefinition.Parse(layoutField.Value); var device = layout.GetDevice(Device.ID.ToString()); if (string.Equals(device.Layout, Layout.ID.ToString(), StringComparison.OrdinalIgnoreCase)) { //same layout as already set - no point in setting it again return; } device.Layout = Layout.ID.ToString(); item.Edit(p => { var outputXml = layout.ToXml(); LayoutField.SetFieldValue(item.Fields[LayoutFieldId], outputXml); }); } }
private static void UpdateFinalRenderings(Item sourcePageItem, Item targetPageItem, Field sourceFinalRenderingsField, Field targetFinalRenderingsField) { // get source renderings var sourceDefaultDevice = sourcePageItem.Database.Resources.Devices.GetAll().First(d => d.IsDefault); var sourceLayoutField = new LayoutField(sourceFinalRenderingsField); var sourceLayoutDefinition = LayoutDefinition.Parse(sourceLayoutField.Value); var sourceDeviceDefinition = sourceLayoutDefinition.GetDevice(sourceDefaultDevice.ID.ToString()); // get target renderings var targetDefaultDevice = targetPageItem.Database.Resources.Devices.GetAll().First(d => d.IsDefault); var targetLayoutField = new LayoutField(targetFinalRenderingsField); var targetLayoutDefinition = LayoutDefinition.Parse(targetLayoutField.Value); var targetDeviceDefinition = targetLayoutDefinition.GetDevice(targetDefaultDevice.ID.ToString()); foreach (RenderingDefinition sourceRendering in sourceDeviceDefinition.Renderings) { var duplicateRendering = targetDeviceDefinition.Renderings.Cast <RenderingDefinition>() .FirstOrDefault(r => r.UniqueId.Equals(sourceRendering.UniqueId)); // Rendering isn't already on target renderings if (duplicateRendering == null) { targetDeviceDefinition.Renderings.Add(sourceRendering); } } // save changes using (new EditContext(targetPageItem)) { targetFinalRenderingsField.Value = targetLayoutDefinition.ToXml(); } }