2
2
{
3
3
using Sitecore . Data . Fields ;
4
4
using Sitecore . Data . Items ;
5
+ using Sitecore . Diagnostics ;
6
+ using Sitecore . Layouts ;
5
7
using Sitecore . Links ;
8
+ using Sitecore . Text ;
9
+ using System ;
10
+ using System . Collections ;
11
+ using System . Xml . Linq ;
12
+
6
13
public partial class LayoutField : Sitecore . Data . Fields . LayoutField
7
14
{
8
15
public LayoutField ( Item item ) : base ( item )
@@ -26,5 +33,146 @@ public override void RemoveLink(ItemLink itemLink)
26
33
LinkRemover linkRemover = new LinkRemover ( this ) ;
27
34
linkRemover . RemoveLink ( itemLink ) ;
28
35
}
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
+
29
177
}
30
178
}
0 commit comments