diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs index e1499b8f61..cb0d19cc2e 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/EntityRepository.cs @@ -150,15 +150,29 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var isMedia = objectTypeId == Constants.ObjectTypes.Media; var sql = GetFullSqlForEntityType(isContent, isMedia, objectTypeId, key); - var dto = Database.FirstOrDefault(sql); - if (dto == null) return null; - var entity = BuildEntity(isContent, isMedia, dto); + //isContent is going to return a 1:M result now with the variants so we need to do different things + if (isContent) + { + var dtos = Database.FetchOneToMany( + dto => dto.VariationInfo, + dto => dto.VersionId, + sql); + if (dtos.Count == 0) return null; + return BuildDocumentEntity(dtos[0]); + } + else + { + var dto = Database.FirstOrDefault(sql); + if (dto == null) return null; - if (isMedia) - BuildProperties(entity, dto); + var entity = BuildEntity(isContent, isMedia, dto); - return entity; + if (isMedia) + BuildProperties(entity, dto); + + return entity; + } } public virtual IEntitySlim Get(int id) @@ -174,15 +188,30 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var isMedia = objectTypeId == Constants.ObjectTypes.Media; var sql = GetFullSqlForEntityType(isContent, isMedia, objectTypeId, id); - var dto = Database.FirstOrDefault(sql); - if (dto == null) return null; - var entity = BuildEntity(isContent, isMedia, dto); + //isContent is going to return a 1:M result now with the variants so we need to do different things + if (isContent) + { + var dtos = Database.FetchOneToMany( + dto => dto.VariationInfo, + dto => dto.VersionId, + sql); + if (dtos.Count == 0) return null; + return BuildDocumentEntity(dtos[0]); + } + else + { + var dto = Database.FirstOrDefault(sql); + if (dto == null) return null; - if (isMedia) - BuildProperties(entity, dto); + var entity = BuildEntity(isContent, isMedia, dto); + + if (isMedia) + BuildProperties(entity, dto); + + return entity; + } - return entity; } public virtual IEnumerable GetAll(Guid objectType, params int[] ids) @@ -205,15 +234,30 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var isMedia = objectType == Constants.ObjectTypes.Media; var sql = GetFullSqlForEntityType(isContent, isMedia, objectType, filter); - var dtos = Database.Fetch(sql); - if (dtos.Count == 0) return Enumerable.Empty(); - var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray(); + //isContent is going to return a 1:M result now with the variants so we need to do different things + if (isContent) + { + var dtos = Database.FetchOneToMany( + dto => dto.VariationInfo, + dto => dto.VersionId, + sql); + if (dtos.Count == 0) return Enumerable.Empty(); + var entities = dtos.Select(x => BuildDocumentEntity(x)).ToArray(); + return entities; + } + else + { + var dtos = Database.Fetch(sql); + if (dtos.Count == 0) return Enumerable.Empty(); - if (isMedia) - BuildProperties(entities, dtos); + var entities = dtos.Select(x => BuildEntity(isContent, isMedia, x)).ToArray(); - return entities; + if (isMedia) + BuildProperties(entities, dtos); + + return entities; + } } public virtual IEnumerable GetAllPaths(Guid objectType, params int[] ids) diff --git a/src/Umbraco.Tests/Services/EntityServiceTests.cs b/src/Umbraco.Tests/Services/EntityServiceTests.cs index ebf4ea4cb3..124c77846d 100644 --- a/src/Umbraco.Tests/Services/EntityServiceTests.cs +++ b/src/Umbraco.Tests/Services/EntityServiceTests.cs @@ -19,7 +19,23 @@ namespace Umbraco.Tests.Services [Apartment(ApartmentState.STA)] [UmbracoTest(Database = UmbracoTestOptions.Database.NewSchemaPerFixture)] public class EntityServiceTests : TestWithSomeContentBase - { + { + private Language _langFr; + private Language _langEs; + + public override void SetUp() + { + base.SetUp(); + + if (_langFr == null && _langEs == null) + { + _langFr = new Language("fr-FR"); + _langEs = new Language("es-ES"); + ServiceContext.LocalizationService.Save(_langFr); + ServiceContext.LocalizationService.Save(_langEs); + } + } + [Test] public void EntityService_Can_Get_Paged_Content_Children() { @@ -429,30 +445,49 @@ namespace Umbraco.Tests.Services Assert.That(entities.Any(x => x.Trashed), Is.False); } + [Test] + public void EntityService_Can_Get_Content_By_UmbracoObjectType_With_Variant_Names() + { + var service = ServiceContext.EntityService; + + + var alias = "test" + Guid.NewGuid(); + var contentType = MockedContentTypes.CreateSimpleContentType(alias, alias, false); + contentType.Variations = ContentVariation.CultureNeutral; + ServiceContext.ContentTypeService.Save(contentType); + + var c1 = MockedContent.CreateSimpleContent(contentType, "Test", -1); + c1.SetName(_langFr.Id, "Test - FR"); + c1.SetName(_langEs.Id, "Test - ES"); + ServiceContext.ContentService.Save(c1); + + var result = service.Get(c1.Id, UmbracoObjectTypes.Document); + Assert.AreEqual("Test", result.Name); + Assert.IsTrue(result.AdditionalData.ContainsKey("CultureNames")); + var cultureNames = (IDictionary)result.AdditionalData["CultureNames"]; + Assert.AreEqual("Test - FR", cultureNames[_langFr.Id]); + Assert.AreEqual("Test - ES", cultureNames[_langEs.Id]); + } + [Test] public void EntityService_Can_Get_Child_Content_By_ParentId_And_UmbracoObjectType_With_Variant_Names() { - var service = ServiceContext.EntityService; + var service = ServiceContext.EntityService; - var langFr = new Language("fr-FR"); - var langEs = new Language("es-ES"); - ServiceContext.LocalizationService.Save(langFr); - ServiceContext.LocalizationService.Save(langEs); - var contentType = MockedContentTypes.CreateSimpleContentType("test1", "Test1", false); contentType.Variations = ContentVariation.CultureNeutral; ServiceContext.ContentTypeService.Save(contentType); var root = MockedContent.CreateSimpleContent(contentType); - ServiceContext.ContentService.Save(root); - + ServiceContext.ContentService.Save(root); + for (int i = 0; i < 10; i++) { var c1 = MockedContent.CreateSimpleContent(contentType, Guid.NewGuid().ToString(), root); if (i % 2 == 0) { - c1.SetName(langFr.Id, "Test " + i + " - FR"); - c1.SetName(langEs.Id, "Test " + i + " - ES"); + c1.SetName(_langFr.Id, "Test " + i + " - FR"); + c1.SetName(_langEs.Id, "Test " + i + " - ES"); } ServiceContext.ContentService.Save(c1); } @@ -471,9 +506,9 @@ namespace Umbraco.Tests.Services Assert.IsNotNull(variantInfo); var keys = variantInfo.Keys.ToList(); var vals = variantInfo.Values.ToList(); - Assert.AreEqual(langFr.Id, keys[0]); + Assert.AreEqual(_langFr.Id, keys[0]); Assert.AreEqual("Test " + i + " - FR", vals[0]); - Assert.AreEqual(langEs.Id, keys[1]); + Assert.AreEqual(_langEs.Id, keys[1]); Assert.AreEqual("Test " + i + " - ES", vals[1]); } else diff --git a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs index abab847151..96a1029f3c 100644 --- a/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs +++ b/src/Umbraco.Web/Trees/ContentTreeControllerBase.cs @@ -215,7 +215,10 @@ namespace Umbraco.Web.Trees //Try to see if there is a variant name for the current language for the item and set the name accordingly. //If any of this fails, the tree node name will remain the default invariant culture name. - //fixme - what if there is no name found at all ? This could occur if the doc type is variant and the user fills in all language values, then creates a new lang, sets it as default and deletes all other pre-existing langs + + //fixme - what if there is no name found at all ? This could occur if the doc type is variant and the user fills in all language values, then creates a new lang and sets it as the default + //fixme - what if the user changes this document type to not allow culture variants after it's already been created with culture variants, this means we'll be displaying the culture variant name when in fact we should be displaying the invariant name... but that would be null + if (currLangId.HasValue) { foreach (var e in result)