Skip to content

Commit ea9c37d

Browse files
committed
Implements U4-5868 Packager should include compositions
1 parent a1c223b commit ea9c37d

File tree

7 files changed

+1064
-22
lines changed

7 files changed

+1064
-22
lines changed

src/Umbraco.Core/Services/EntityXmlSerializer.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,16 +311,25 @@ public XElement Serialize(IDataTypeService dataTypeService, IContentType content
311311
new XElement("AllowAtRoot", contentType.AllowedAsRoot.ToString()),
312312
new XElement("IsListView", contentType.IsContainer.ToString()));
313313

314-
var masterContentType = contentType.CompositionAliases().FirstOrDefault();
315-
if (masterContentType != null)
316-
info.Add(new XElement("Master", masterContentType));
314+
var masterContentType = contentType.ContentTypeComposition.FirstOrDefault(x => x.Id == contentType.ParentId);
315+
if(masterContentType != null)
316+
info.Add(new XElement("Master", masterContentType.Alias));
317+
318+
var compositionsElement = new XElement("Compositions");
319+
var compositions = contentType.ContentTypeComposition;
320+
foreach (var composition in compositions)
321+
{
322+
compositionsElement.Add(new XElement("Composition", composition.Alias));
323+
}
324+
info.Add(compositionsElement);
317325

318326
var allowedTemplates = new XElement("AllowedTemplates");
319327
foreach (var template in contentType.AllowedTemplates)
320328
{
321329
allowedTemplates.Add(new XElement("Template", template.Alias));
322330
}
323331
info.Add(allowedTemplates);
332+
324333
if (contentType.DefaultTemplate != null && contentType.DefaultTemplate.Id != 0)
325334
info.Add(new XElement("DefaultTemplate", contentType.DefaultTemplate.Alias));
326335
else

src/Umbraco.Core/Services/PackagingService.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,23 @@ private IContentType CreateContentTypeFromXml(XElement documentType)
405405
if (parent != null)
406406
contentType.AddContentType(parent);
407407

408+
var compositionsElement = infoElement.Element("Compositions");
409+
if (compositionsElement != null && compositionsElement.HasElements)
410+
{
411+
var compositions = compositionsElement.Elements("Composition");
412+
if (compositions.Any())
413+
{
414+
foreach (var composition in compositions)
415+
{
416+
var compositionAlias = composition.Value;
417+
var compositionContentType = _importedContentTypes.ContainsKey(compositionAlias)
418+
? _importedContentTypes[compositionAlias]
419+
: _contentTypeService.GetContentType(compositionAlias);
420+
var added = contentType.AddContentType(compositionContentType);
421+
}
422+
}
423+
}
424+
408425
return UpdateContentTypeFromXml(documentType, contentType);
409426
}
410427

@@ -417,15 +434,47 @@ private IContentType UpdateContentTypeFromXml(XElement documentType, IContentTyp
417434
contentType.Icon = infoElement.Element("Icon").Value;
418435
contentType.Thumbnail = infoElement.Element("Thumbnail").Value;
419436
contentType.Description = infoElement.Element("Description").Value;
437+
420438
//NOTE AllowAtRoot is a new property in the package xml so we need to verify it exists before using it.
421439
var allowAtRoot = infoElement.Element("AllowAtRoot");
422440
if (allowAtRoot != null)
423441
contentType.AllowedAsRoot = allowAtRoot.Value.InvariantEquals("true");
442+
424443
//NOTE IsListView is a new property in the package xml so we need to verify it exists before using it.
425444
var isListView = infoElement.Element("IsListView");
426445
if (isListView != null)
427446
contentType.IsContainer = isListView.Value.InvariantEquals("true");
428447

448+
//Name of the master corresponds to the parent and we need to ensure that the Parent Id is set
449+
var masterElement = infoElement.Element("Master");
450+
if (masterElement != null)
451+
{
452+
var masterAlias = masterElement.Value;
453+
IContentType parent = _importedContentTypes.ContainsKey(masterAlias)
454+
? _importedContentTypes[masterAlias]
455+
: _contentTypeService.GetContentType(masterAlias);
456+
457+
contentType.SetLazyParentId(new Lazy<int>(() => parent.Id));
458+
}
459+
460+
//Update Compositions on the ContentType to ensure that they are as is defined in the package xml
461+
var compositionsElement = infoElement.Element("Compositions");
462+
if (compositionsElement != null && compositionsElement.HasElements)
463+
{
464+
var compositions = compositionsElement.Elements("Composition");
465+
if (compositions.Any())
466+
{
467+
foreach (var composition in compositions)
468+
{
469+
var compositionAlias = composition.Value;
470+
var compositionContentType = _importedContentTypes.ContainsKey(compositionAlias)
471+
? _importedContentTypes[compositionAlias]
472+
: _contentTypeService.GetContentType(compositionAlias);
473+
var added = contentType.AddContentType(compositionContentType);
474+
}
475+
}
476+
}
477+
429478
UpdateContentTypesAllowedTemplates(contentType, infoElement.Element("AllowedTemplates"), defaultTemplateElement);
430479
UpdateContentTypesTabs(contentType, documentType.Element("Tabs"));
431480
UpdateContentTypesProperties(contentType, documentType.Element("GenericProperties"));

0 commit comments

Comments
 (0)