5 |
5 |
using Orchard.ContentManagement.Drivers; |
6 |
6 |
using Orchard.ContentManagement.MetaData; |
7 |
7 |
using Orchard.ContentManagement.MetaData.Models; |
8 |
8 |
using Orchard.ContentTypes.ViewModels; |
9 |
9 |
using Orchard.Core.Contents.Extensions; |
10 |
10 |
using Orchard.Localization; |
|
11 |
using Orchard.Logging; |
11 |
12 |
using Orchard.Utility.Extensions; |
12 |
13 |
|
13 |
14 |
namespace Orchard.ContentTypes.Services { |
14 |
15 |
public class ContentDefinitionService : IContentDefinitionService { |
15 |
16 |
private readonly IContentDefinitionManager _contentDefinitionManager; |
16 |
17 |
private readonly IEnumerable<IContentPartDriver> _contentPartDrivers; |
17 |
18 |
private readonly IEnumerable<IContentFieldDriver> _contentFieldDrivers; |
18 |
19 |
private readonly IContentDefinitionEditorEvents _contentDefinitionEditorEvents; |
|
20 |
private readonly IEnumerable<IContentDefinitionEventHandler> _contentDefinitionEventHandlers; |
19 |
21 |
|
20 |
22 |
public ContentDefinitionService( |
21 |
23 |
IOrchardServices services, |
22 |
24 |
IContentDefinitionManager contentDefinitionManager, |
23 |
25 |
IEnumerable<IContentPartDriver> contentPartDrivers, |
24 |
26 |
IEnumerable<IContentFieldDriver> contentFieldDrivers, |
25 |
|
IContentDefinitionEditorEvents contentDefinitionEditorEvents) |
|
27 |
IContentDefinitionEditorEvents contentDefinitionEditorEvents, |
|
28 |
IEnumerable<IContentDefinitionEventHandler> contentDefinitionEventHandlers) |
26 |
29 |
{ |
27 |
30 |
Services = services; |
28 |
31 |
_contentDefinitionManager = contentDefinitionManager; |
29 |
32 |
_contentPartDrivers = contentPartDrivers; |
30 |
33 |
_contentFieldDrivers = contentFieldDrivers; |
31 |
34 |
_contentDefinitionEditorEvents = contentDefinitionEditorEvents; |
|
35 |
_contentDefinitionEventHandlers = contentDefinitionEventHandlers; |
|
36 |
Logger = NullLogger.Instance; |
32 |
37 |
T = NullLocalizer.Instance; |
33 |
38 |
} |
34 |
39 |
|
35 |
40 |
public IOrchardServices Services { get; set; } |
36 |
41 |
public Localizer T { get; set; } |
|
42 |
public ILogger Logger { get; set; } |
37 |
43 |
|
38 |
44 |
public IEnumerable<EditTypeViewModel> GetTypes() { |
39 |
45 |
return _contentDefinitionManager.ListTypeDefinitions().Select(ctd => new EditTypeViewModel(ctd)).OrderBy(m => m.DisplayName); |
40 |
46 |
} |
41 |
47 |
|
42 |
48 |
public EditTypeViewModel GetType(string name) { |
|
77 |
83 |
} |
78 |
84 |
} |
79 |
85 |
|
80 |
86 |
while ( _contentDefinitionManager.GetTypeDefinition(name) != null ) |
81 |
87 |
name = VersionName(name); |
82 |
88 |
|
|
89 |
_contentDefinitionEventHandlers.Invoke(x => x.AddingType(name, displayName), Logger); |
|
90 |
|
83 |
91 |
var contentTypeDefinition = new ContentTypeDefinition(name, displayName); |
84 |
92 |
_contentDefinitionManager.StoreTypeDefinition(contentTypeDefinition); |
85 |
93 |
_contentDefinitionManager.AlterTypeDefinition(name, |
86 |
94 |
cfg => cfg.Creatable().Draftable()); |
|
95 |
|
|
96 |
_contentDefinitionEventHandlers.Invoke(x => x.AddedType(name, displayName), Logger); |
87 |
97 |
|
88 |
98 |
return contentTypeDefinition; |
89 |
99 |
} |
90 |
100 |
|
91 |
101 |
public void AlterType(EditTypeViewModel typeViewModel, IUpdateModel updateModel) { |
92 |
102 |
var updater = new Updater(updateModel); |
|
143 |
153 |
}); |
144 |
154 |
} |
145 |
155 |
}); |
146 |
156 |
} |
147 |
157 |
|
148 |
158 |
public void RemoveType(string name, bool deleteContent) { |
|
159 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovingType(name, deleteContent), Logger); |
149 |
160 |
|
150 |
161 |
|
151 |
162 |
var typeDefinition = _contentDefinitionManager.GetTypeDefinition(name); |
152 |
163 |
var partDefinitions = typeDefinition.Parts.ToArray(); |
153 |
164 |
foreach (var partDefinition in partDefinitions) { |
154 |
165 |
RemovePartFromType(partDefinition.PartDefinition.Name, name); |
|
166 |
177 |
var contentItems = Services.ContentManager.Query(name).List(); |
167 |
178 |
foreach (var contentItem in contentItems) { |
168 |
179 |
Services.ContentManager.Remove(contentItem); |
169 |
180 |
} |
170 |
181 |
} |
171 |
182 |
|
|
183 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovedType(name, deleteContent), Logger); |
172 |
184 |
} |
173 |
185 |
|
174 |
186 |
public void AddPartToType(string partName, string typeName) { |
|
187 |
_contentDefinitionEventHandlers.Invoke(x => x.AddingPartToType(partName, typeName), Logger); |
|
188 |
|
175 |
189 |
_contentDefinitionManager.AlterTypeDefinition(typeName, typeBuilder => typeBuilder.WithPart(partName)); |
|
190 |
|
|
191 |
_contentDefinitionEventHandlers.Invoke(x => x.AddedPartToType(partName, typeName), Logger); |
176 |
192 |
} |
177 |
193 |
|
178 |
194 |
public void RemovePartFromType(string partName, string typeName) { |
|
195 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovingPartFromType(partName, typeName), Logger); |
|
196 |
|
179 |
197 |
_contentDefinitionManager.AlterTypeDefinition(typeName, typeBuilder => typeBuilder.RemovePart(partName)); |
|
198 |
|
|
199 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovedPartFromType(partName, typeName), Logger); |
180 |
200 |
} |
181 |
201 |
|
182 |
202 |
public IEnumerable<EditPartViewModel> GetParts(bool metadataPartsOnly) { |
183 |
203 |
var typeNames = GetTypes().Select(ctd => ctd.Name); |
184 |
204 |
|
185 |
205 |
|
|
215 |
235 |
var name = partViewModel.Name; |
216 |
236 |
|
217 |
237 |
if (_contentDefinitionManager.GetPartDefinition(name) != null) |
218 |
238 |
throw new OrchardException(T("Cannot add part named '{0}'. It already exists.", name)); |
219 |
239 |
|
220 |
240 |
if (!String.IsNullOrEmpty(name)) { |
|
241 |
_contentDefinitionEventHandlers.Invoke(x => x.AddingPart(name), Logger); |
|
242 |
|
221 |
243 |
_contentDefinitionManager.AlterPartDefinition(name, builder => builder.Attachable()); |
|
244 |
|
|
245 |
_contentDefinitionEventHandlers.Invoke(x => x.AddedPart(name), Logger); |
|
246 |
|
222 |
247 |
return new EditPartViewModel(_contentDefinitionManager.GetPartDefinition(name)); |
223 |
248 |
} |
224 |
249 |
|
225 |
250 |
return null; |
226 |
251 |
} |
227 |
252 |
|
|
231 |
256 |
partViewModel.Templates = _contentDefinitionEditorEvents.PartEditorUpdate(partBuilder, updater); |
232 |
257 |
}); |
233 |
258 |
} |
234 |
259 |
|
235 |
260 |
public void RemovePart(string name) { |
236 |
261 |
var partDefinition = _contentDefinitionManager.GetPartDefinition(name); |
|
262 |
|
|
263 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovingPart(name), Logger); |
|
264 |
|
237 |
265 |
var fieldDefinitions = partDefinition.Fields.ToArray(); |
238 |
266 |
foreach(var fieldDefinition in fieldDefinitions) { |
239 |
267 |
RemoveFieldFromPart(fieldDefinition.Name, name); |
240 |
268 |
} |
241 |
269 |
|
242 |
270 |
_contentDefinitionManager.DeletePartDefinition(name); |
|
271 |
|
|
272 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovedPart(name), Logger); |
243 |
273 |
} |
244 |
274 |
|
245 |
275 |
public IEnumerable<ContentFieldInfo> GetFields() { |
246 |
276 |
return _contentFieldDrivers.SelectMany(d => d.GetFieldInfo()); |
247 |
277 |
} |
248 |
278 |
|
|
252 |
282 |
|
253 |
283 |
public void AddFieldToPart(string fieldName, string displayName, string fieldTypeName, string partName) { |
254 |
284 |
fieldName = fieldName.ToSafeName(); |
255 |
285 |
if (string.IsNullOrEmpty(fieldName)) { |
256 |
286 |
throw new OrchardException(T("Fields must have a name containing no spaces or symbols.")); |
257 |
287 |
} |
|
288 |
|
|
289 |
_contentDefinitionEventHandlers.Invoke(x => x.AddingFieldToPart(fieldName, displayName, fieldTypeName, partName), Logger); |
|
290 |
|
258 |
291 |
_contentDefinitionManager.AlterPartDefinition(partName, |
259 |
292 |
partBuilder => partBuilder.WithField(fieldName, fieldBuilder => fieldBuilder.OfType(fieldTypeName).WithDisplayName(displayName))); |
|
293 |
|
|
294 |
_contentDefinitionEventHandlers.Invoke(x => x.AddedFieldToPart(fieldName, displayName, fieldTypeName, partName), Logger); |
260 |
295 |
} |
261 |
296 |
|
262 |
297 |
public void RemoveFieldFromPart(string fieldName, string partName) { |
|
298 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovingFieldFromPart(fieldName, partName), Logger); |
|
299 |
|
263 |
300 |
_contentDefinitionManager.AlterPartDefinition(partName, typeBuilder => typeBuilder.RemoveField(fieldName)); |
|
301 |
|
|
302 |
_contentDefinitionEventHandlers.Invoke(x => x.RemovedFieldFromPart(fieldName, partName), Logger); |
264 |
303 |
} |
265 |
304 |
|
266 |
305 |
public string GenerateContentTypeNameFromDisplayName(string displayName) { |
267 |
306 |
displayName = displayName.ToSafeName(); |
268 |
307 |
|
269 |
308 |
while (_contentDefinitionManager.GetTypeDefinition(displayName) != null) |