BranchPresets.AddFromBranchPreset.RewriteBranchRenderingDataSources C# (CSharp) Метод

RewriteBranchRenderingDataSources() защищенный Метод

protected RewriteBranchRenderingDataSources ( System.Item item, BranchItem branchTemplateItem ) : void
item System.Item
branchTemplateItem BranchItem
Результат void
		protected virtual void RewriteBranchRenderingDataSources(Item item, BranchItem branchTemplateItem)
		{
			string branchBasePath = branchTemplateItem.InnerItem.Paths.FullPath;

			LayoutHelper.ApplyActionToAllRenderings(item, rendering =>
			{
				if (string.IsNullOrWhiteSpace(rendering.Datasource))
					return RenderingActionResult.None;

				// note: queries and multiple item datasources are not supported
				var renderingTargetItem = item.Database.GetItem(rendering.Datasource);

				if (renderingTargetItem == null)
					Log.Warn("Error while expanding branch template rendering datasources: data source {0} was not resolvable.".FormatWith(rendering.Datasource), this);

				// if there was no valid target item OR the target item is not a child of the branch template we skip out
				if (renderingTargetItem == null || !renderingTargetItem.Paths.FullPath.StartsWith(branchBasePath, StringComparison.OrdinalIgnoreCase))
					return RenderingActionResult.None;

				var relativeRenderingPath = renderingTargetItem.Paths.FullPath.Substring(branchBasePath.Length).TrimStart('/');
				relativeRenderingPath = relativeRenderingPath.Substring(relativeRenderingPath.IndexOf('/')); // we need to skip the "/$name" at the root of the branch children

				var newTargetPath = item.Paths.FullPath + relativeRenderingPath;

				var newTargetItem = item.Database.GetItem(newTargetPath);

				// if the target item was a valid under branch item, but the same relative path does not exist under the branch instance
				// we set the datasource to something invalid to avoid any potential unintentional edits of a shared data source item
				if (newTargetItem == null)
				{
					rendering.Datasource = "INVALID_BRANCH_SUBITEM_ID";
					return RenderingActionResult.None;
				}

				rendering.Datasource = newTargetItem.ID.ToString();
				return RenderingActionResult.None;
			});
		}
	}