Skip to content

Commit 2df33e8

Browse files
committed
the same logic added during Relink opearition
1 parent 43ad870 commit 2df33e8

File tree

1 file changed

+148
-0
lines changed

1 file changed

+148
-0
lines changed

src/Sitecore.Support.159068/Data/Fields/LayoutField.cs

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@
22
{
33
using Sitecore.Data.Fields;
44
using Sitecore.Data.Items;
5+
using Sitecore.Diagnostics;
6+
using Sitecore.Layouts;
57
using Sitecore.Links;
8+
using Sitecore.Text;
9+
using System;
10+
using System.Collections;
11+
using System.Xml.Linq;
12+
613
public partial class LayoutField: Sitecore.Data.Fields.LayoutField
714
{
815
public LayoutField(Item item) : base(item)
@@ -26,5 +33,146 @@ public override void RemoveLink(ItemLink itemLink)
2633
LinkRemover linkRemover = new LinkRemover(this);
2734
linkRemover.RemoveLink(itemLink);
2835
}
36+
public override void Relink(ItemLink itemLink, Item newLink)
37+
{
38+
Assert.ArgumentNotNull(itemLink, "itemLink");
39+
Assert.ArgumentNotNull(newLink, "newLink");
40+
41+
string value = this.Value;
42+
if (string.IsNullOrEmpty(value))
43+
{
44+
return;
45+
}
46+
47+
LayoutDefinition layoutDefinition = LayoutDefinition.Parse(value);
48+
49+
ArrayList devices = layoutDefinition.Devices;
50+
if (devices == null)
51+
{
52+
return;
53+
}
54+
55+
string targetItemID = itemLink.TargetItemID.ToString();
56+
string newLinkID = newLink.ID.ToString();
57+
58+
for (int n = devices.Count - 1; n >= 0; n--)
59+
{
60+
var device = devices[n] as DeviceDefinition;
61+
if (device == null)
62+
{
63+
continue;
64+
}
65+
66+
if (device.ID == targetItemID)
67+
{
68+
device.ID = newLinkID;
69+
continue;
70+
}
71+
72+
if (device.Layout == targetItemID)
73+
{
74+
device.Layout = newLinkID;
75+
continue;
76+
}
77+
78+
if (device.Placeholders != null)
79+
{
80+
string targetPath = itemLink.TargetPath;
81+
bool isLinkFound = false;
82+
for (int j = device.Placeholders.Count - 1; j >= 0; j--)
83+
{
84+
var placeholderDefinition = device.Placeholders[j] as PlaceholderDefinition;
85+
if (placeholderDefinition == null)
86+
{
87+
continue;
88+
}
89+
90+
if (
91+
string.Equals(
92+
placeholderDefinition.MetaDataItemId, targetPath, StringComparison.InvariantCultureIgnoreCase) ||
93+
string.Equals(
94+
placeholderDefinition.MetaDataItemId, targetItemID, StringComparison.InvariantCultureIgnoreCase))
95+
{
96+
placeholderDefinition.MetaDataItemId = newLink.ID.ToString();
97+
isLinkFound = true;
98+
}
99+
}
100+
101+
if (isLinkFound)
102+
{
103+
continue;
104+
}
105+
}
106+
107+
if (device.Renderings == null)
108+
{
109+
continue;
110+
}
111+
112+
for (int r = device.Renderings.Count - 1; r >= 0; r--)
113+
{
114+
var rendering = device.Renderings[r] as RenderingDefinition;
115+
if (rendering == null)
116+
{
117+
continue;
118+
}
119+
120+
if (rendering.ItemID == targetItemID)
121+
{
122+
rendering.ItemID = newLinkID;
123+
}
124+
125+
if (rendering.Datasource == targetItemID)
126+
{
127+
rendering.Datasource = newLinkID;
128+
}
129+
130+
if (rendering.Datasource == itemLink.TargetPath)
131+
{
132+
rendering.Datasource = newLink.Paths.FullPath;
133+
}
134+
135+
if (!string.IsNullOrEmpty(rendering.Parameters))
136+
{
137+
Item layoutItem = this.InnerField.Database.GetItem(rendering.ItemID);
138+
139+
if (layoutItem == null)
140+
{
141+
continue;
142+
}
143+
144+
var renderingParametersFieldCollection = this.GetParametersFields(layoutItem, rendering.Parameters);
145+
146+
foreach (var field in renderingParametersFieldCollection.Values)
147+
{
148+
if (!string.IsNullOrEmpty(field.Value))
149+
{
150+
field.Relink(itemLink, newLink);
151+
}
152+
}
153+
154+
//rendering.Parameters = renderingParametersFieldCollection.GetParameters().ToString();
155+
}
156+
157+
if (rendering.Rules != null)
158+
{
159+
var rulesField = new RulesField(this.InnerField, rendering.Rules.ToString());
160+
rulesField.Relink(itemLink, newLink);
161+
rendering.Rules = XElement.Parse(rulesField.Value);
162+
}
163+
}
164+
}
165+
166+
this.Value = layoutDefinition.ToXml();
167+
}
168+
169+
private RenderingParametersFieldCollection GetParametersFields(Item layoutItem, string renderingParameters)
170+
{
171+
UrlString parameters = new UrlString(renderingParameters);
172+
RenderingParametersFieldCollection parametersFields;
173+
RenderingParametersFieldCollection.TryParse(layoutItem, parameters, out parametersFields);
174+
return parametersFields;
175+
}
176+
29177
}
30178
}

0 commit comments

Comments
 (0)