diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/BlogsLocalizationExtensions/Handlers/BlogPostPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Blogs/BlogsLocalizationExtensions/Handlers/BlogPostPartHandler.cs index de5404d5c6f..67305291737 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/BlogsLocalizationExtensions/Handlers/BlogPostPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/BlogsLocalizationExtensions/Handlers/BlogPostPartHandler.cs @@ -64,7 +64,8 @@ private void MigrateBlogPost(ContentItem blogPost) { var blogids = new HashSet { blog.As().ContentItem.Id }; //seek for same culture blog - var realBlog = _localizationService.GetLocalizations(blog).SingleOrDefault(w => w.As().Culture == blogPostCulture); + var realBlog = _localizationService.GetLocalizations(blog) + .SingleOrDefault(w => w.Culture?.Culture == blogPostCulture.Culture); if (realBlog.Has() && realBlog.As().Culture.Id == blogPostCulture.Id) { blogPost.As().Container = realBlog; if (blogPost.Has()) { diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/AdminLocalizedTaxonomyController.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/AdminLocalizedTaxonomyController.cs new file mode 100644 index 00000000000..7dbc4f43db3 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/AdminLocalizedTaxonomyController.cs @@ -0,0 +1,34 @@ +using System.Web.Mvc; +using System.Web.Routing; +using Orchard.ContentManagement.MetaData; +using Orchard.Environment.Extensions; +using Orchard.Localization.Services; +using Orchard.Taxonomies.Services; +using Orchard.UI.Admin; + +namespace Orchard.Taxonomies.Controllers { + [OrchardFeature("Orchard.Taxonomies.LocalizationExtensions")] + public class AdminLocalizedTaxonomyController : LocalizedTaxonomyController { + private readonly RequestContext _requestContext; + + public AdminLocalizedTaxonomyController(IContentDefinitionManager contentDefinitionManager, + ILocalizationService localizationService, + ITaxonomyService taxonomyService, + ITaxonomyExtensionsService + taxonomyExtensionsService, + RequestContext requestContext) : base(contentDefinitionManager, + localizationService, + taxonomyService, + taxonomyExtensionsService) { + + _requestContext = requestContext; + } + + [OutputCache(NoStore = true, Duration = 0)] + public new ActionResult GetTaxonomy(string contentTypeName, string taxonomyFieldName, int contentId, string culture, string selectedValues) { + AdminFilter.Apply(_requestContext); + + return GetTaxonomyInternal(contentTypeName, taxonomyFieldName, contentId, culture, selectedValues); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/LocalizedTaxonomyController.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/LocalizedTaxonomyController.cs index d21fc7e1151..c58c07b0649 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/LocalizedTaxonomyController.cs +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Controllers/LocalizedTaxonomyController.cs @@ -1,13 +1,12 @@ using System.Collections.Generic; using System.Linq; using System.Web.Mvc; +using System.Web.UI.WebControls; using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.Environment.Extensions; using Orchard.Localization.Models; using Orchard.Localization.Services; -using Orchard.Taxonomies.Drivers; -using Orchard.Taxonomies.Fields; using Orchard.Taxonomies.Helpers; using Orchard.Taxonomies.Models; using Orchard.Taxonomies.Services; @@ -24,10 +23,11 @@ public class LocalizedTaxonomyController : Controller { private readonly ITaxonomyExtensionsService _taxonomyExtensionsService; public LocalizedTaxonomyController( - IContentDefinitionManager contentDefinitionManager, - ILocalizationService localizationService, - ITaxonomyService taxonomyService, - ITaxonomyExtensionsService taxonomyExtensionsService) { + IContentDefinitionManager contentDefinitionManager, + ILocalizationService localizationService, + ITaxonomyService taxonomyService, + ITaxonomyExtensionsService taxonomyExtensionsService) { + _taxonomyService = taxonomyService; _taxonomyExtensionsService = taxonomyExtensionsService; _contentDefinitionManager = contentDefinitionManager; @@ -35,14 +35,19 @@ public LocalizedTaxonomyController( } [OutputCache(NoStore = true, Duration = 0)] - public ActionResult GetTaxonomy(string contentTypeName, string taxonomyFieldName, int contentId, string culture) { + public ActionResult GetTaxonomy(string contentTypeName, string taxonomyFieldName, int contentId, string culture, string selectedValues) { + return GetTaxonomyInternal(contentTypeName, taxonomyFieldName, contentId, culture, selectedValues); + } + + protected ActionResult GetTaxonomyInternal (string contentTypeName, string taxonomyFieldName, int contentId, string culture, string selectedValues) { var viewModel = new TaxonomyFieldViewModel(); bool autocomplete = false; var contentDefinition = _contentDefinitionManager.GetTypeDefinition(contentTypeName); if (contentDefinition != null) { var taxonomyField = contentDefinition.Parts.SelectMany(p => p.PartDefinition.Fields).Where(x => x.FieldDefinition.Name == "TaxonomyField" && x.Name == taxonomyFieldName).FirstOrDefault(); var contentTypePartDefinition = contentDefinition.Parts.Where(x => x.PartDefinition.Fields.Any(a => a.FieldDefinition.Name == "TaxonomyField" && a.Name == taxonomyFieldName)).FirstOrDefault(); - ViewData.TemplateInfo.HtmlFieldPrefix = contentTypePartDefinition.PartDefinition.Name + "." + taxonomyField.Name; + var fieldPrefix = contentTypePartDefinition.PartDefinition.Name + "." + taxonomyField.Name; + ViewData.TemplateInfo.HtmlFieldPrefix = fieldPrefix; if (taxonomyField != null) { var taxonomySettings = taxonomyField.Settings.GetModel(); // Getting the translated taxonomy and its terms @@ -60,7 +65,33 @@ public ActionResult GetTaxonomy(string contentTypeName, string taxonomyFieldName List appliedTerms = new List(); int firstTermIdForCulture = 0; if (contentId > 0) { - appliedTerms = _taxonomyService.GetTermsForContentItem(contentId, taxonomyFieldName, VersionOptions.Published).Distinct(new TermPartComparer()).ToList(); + var selectedIds = selectedValues.Split(','); + var destinationTaxonomyCulture = taxonomy.As()?.Culture?.Culture; + foreach (var id in selectedIds) { + if (!string.IsNullOrWhiteSpace(id)) { + var intId = 0; + int.TryParse(id, out intId); + var originalTerm = _taxonomyService.GetTerm(intId); + + // The original term has to be added to applied terms in the following scenarios: + // When the original term has no LocalizationPart, which means that, when creating the taxonomy, terms have been set to be culture neutral. + // When the culture of the original term matches the culture of the taxonomy. + // In any other scenario, get the localized term and add it to the applied terms list. + // If no localization is found, nothing is added to the list for the current id. + var otCulture = originalTerm.As()?.Culture?.Culture; + if (!originalTerm.Has() || string.Equals(destinationTaxonomyCulture, otCulture)) { + appliedTerms.Add(originalTerm); + } else { + // Get the localized term. If no localized term is found, no term should be added to applied terms list. + var t = _localizationService.GetLocalizedContentItem(originalTerm, culture); + if (t != null) { + // Localized term has been found + appliedTerms.Add(t.As()); + } + } + + } + } // It takes the first term localized with the culture in order to set correctly the TaxonomyFieldViewModel.SingleTermId var firstTermForCulture = appliedTerms.FirstOrDefault(x => x.As() != null && x.As().Culture != null && x.As().Culture.Culture == culture); @@ -86,16 +117,13 @@ public ActionResult GetTaxonomy(string contentTypeName, string taxonomyFieldName TaxonomyId = taxonomy != null ? taxonomy.Id : 0, HasTerms = taxonomy != null && _taxonomyService.GetTermsCount(taxonomy.Id) > 0 }; - if (taxonomySettings.Autocomplete) + if (taxonomySettings.Autocomplete) { autocomplete = true; + } } } var templateName = autocomplete ? "../EditorTemplates/Fields/TaxonomyField.Autocomplete" : "../EditorTemplates/Fields/TaxonomyField"; - return View(templateName, viewModel); - } - private IEnumerable GetAppliedTerms(ContentPart part, TaxonomyField field = null, VersionOptions versionOptions = null) { - string fieldName = field != null ? field.Name : string.Empty; - return _taxonomyService.GetTermsForContentItem(part.ContentItem.Id, fieldName, versionOptions ?? VersionOptions.Published).Distinct(new TermPartComparer()); + return PartialView(templateName, viewModel); } } } diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/LocalizedTermPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/LocalizedTermPartDriver.cs index e65ca976a95..334797dc914 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/LocalizedTermPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Drivers/LocalizedTermPartDriver.cs @@ -90,7 +90,7 @@ protected override DriverResult Editor(TermPart termPart, IUpdateModel updater, if (localizedParentTerm != null && localizedParentTerm != parentTerm) _notifier.Add(NotifyType.Information, T("The parent term has been changed to its localized version associated to the culture {0}.", localizedParentTerm.As().Culture.Culture)); } - else if (termCulture != taxonomyCulture && taxonomyCulture != null && _localizationService.GetLocalizations(parentTaxonomy).Count() > 0) { + else if (taxonomyCulture != null && termCulture.Culture != taxonomyCulture.Culture && _localizationService.GetLocalizations(parentTaxonomy).Count() > 0) { //I can associate to a taxonomy a term of a different culture only if the taxonomy is unlocalized or has no translations updater.AddModelError("WrongTaxonomyLocalization", T("A localization of the taxonomy in the specified language does not exist. Please create it first.")); } diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Orchard.Taxonomies.csproj b/src/Orchard.Web/Modules/Orchard.Taxonomies/Orchard.Taxonomies.csproj index 7aae8071047..4ee3a6a9487 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Orchard.Taxonomies.csproj +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Orchard.Taxonomies.csproj @@ -126,6 +126,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Taxonomies/Views/EditorTemplates/Fields/TaxonomyFieldList.cshtml b/src/Orchard.Web/Modules/Orchard.Taxonomies/Views/EditorTemplates/Fields/TaxonomyFieldList.cshtml index fb97741a9db..fae2ce7acae 100644 --- a/src/Orchard.Web/Modules/Orchard.Taxonomies/Views/EditorTemplates/Fields/TaxonomyFieldList.cshtml +++ b/src/Orchard.Web/Modules/Orchard.Taxonomies/Views/EditorTemplates/Fields/TaxonomyFieldList.cshtml @@ -1,4 +1,5 @@ @using Orchard.Utility.Extensions; +@using Orchard.UI.Admin; @model Orchard.Taxonomies.ViewModels.LocalizedTaxonomiesViewModel @{ @@ -8,117 +9,159 @@ var partField = Model.PartName + "_" + Model.FieldName; var functionName = "filterTaxonomyCulture_" + partField; + var isAdmin = AdminFilter.IsApplied(Request.RequestContext); + + var controllerUrl = Url.Action("GetTaxonomy", "LocalizedTaxonomy", new { area = "Orchard.Taxonomies" }); + if (isAdmin) { + controllerUrl = Url.Action("GetTaxonomy", "AdminLocalizedTaxonomy", new { area = "Orchard.Taxonomies" }); + } + + using (Script.Foot()) {