diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs index fc15c190e..03e51e410 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs +++ b/src/Orchard.Web/Packages/Orchard.Tags/Controllers/HomeController.cs @@ -48,26 +48,15 @@ namespace Orchard.Tags.Controllers { [HttpPost] public ActionResult Edit(FormCollection input, int taggedContentId, string returnUrl, string newTagName) { try { - if (!String.IsNullOrEmpty(HttpContext.Request.Form["submit.Save"])) { - if (!_authorizer.Authorize(Permissions.ApplyTag, T("Couldn't apply tag"))) - return new HttpUnauthorizedResult(); - List tagsForContentItem = new List(); - foreach (string key in input.Keys) { - if (key.StartsWith("Checkbox.") && input[key] == "true") { - int tagId = Convert.ToInt32(key.Substring("Checkbox.".Length)); - tagsForContentItem.Add(tagId); + if (!_authorizer.Authorize(Permissions.CreateTag, T("Couldn't create tag"))) + return new HttpUnauthorizedResult(); + if (!String.IsNullOrEmpty(newTagName)) { + foreach (var tagName in ParseCommaSeparatedTagNames(newTagName)) { + if (_tagService.GetTagByName(tagName) == null) { + _tagService.CreateTag(tagName); } + _tagService.TagContentItem(taggedContentId, tagName); } - _tagService.UpdateTagsForContentItem(taggedContentId, tagsForContentItem); - } - else { - if (!_authorizer.Authorize(Permissions.CreateTag, T("Couldn't create tag"))) - return new HttpUnauthorizedResult(); - if (!String.IsNullOrEmpty(newTagName)) { - _tagService.CreateTag(newTagName); - _tagService.TagContentItem(taggedContentId, newTagName); - } - } if (!String.IsNullOrEmpty(returnUrl)) { return Redirect(returnUrl); @@ -83,6 +72,38 @@ namespace Orchard.Tags.Controllers { } } + [HttpPost] + public ActionResult Update(string tags, int taggedContentId, string returnUrl) { + try { + if (!_authorizer.Authorize(Permissions.CreateTag, T("Couldn't create tag"))) + return new HttpUnauthorizedResult(); + List tagNames = ParseCommaSeparatedTagNames(tags); + _tagService.UpdateTagsForContentItem(taggedContentId, tagNames); + if (!String.IsNullOrEmpty(returnUrl)) { + return Redirect(returnUrl); + } + return RedirectToAction("Index"); + } + catch (Exception exception) { + _notifier.Error(T("Updating tags failed: " + exception.Message)); + if (!String.IsNullOrEmpty(returnUrl)) { + return Redirect(returnUrl); + } + return RedirectToAction("Index"); + } + } + + private static List ParseCommaSeparatedTagNames(string tags) { + IEnumerable tagNames = tags.Split(','); + List sanitizedTagNames = new List(); + foreach (var tagName in tagNames) { + if (!String.IsNullOrEmpty(tagName)) { + sanitizedTagNames.Add(tagName); + } + } + return sanitizedTagNames; + } + public ActionResult Search(string tagName) { try { Tag tag = _tagService.GetTagByName(tagName); diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Services/TagService.cs b/src/Orchard.Web/Packages/Orchard.Tags/Services/TagService.cs index 25cecc711..15273d1b6 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Services/TagService.cs +++ b/src/Orchard.Web/Packages/Orchard.Tags/Services/TagService.cs @@ -19,7 +19,7 @@ namespace Orchard.Tags.Services { void UpdateTag(int id, string tagName); IEnumerable GetTaggedContentItems(int id); void TagContentItem(int contentItemId, string tagName); - void UpdateTagsForContentItem(int contentItemId, IEnumerable tagsForContentItem); + void UpdateTagsForContentItem(int contentItemId, IEnumerable tagNamesForContentItem); } public class TagService : ITagService { @@ -100,7 +100,22 @@ namespace Orchard.Tags.Services { _tagsContentItemsRepository.Create(tagsContentItems); } - public void UpdateTagsForContentItem(int contentItemId, IEnumerable tagsForContentItem) { + public void UpdateTagsForContentItem(int contentItemId, IEnumerable tagNamesForContentItem) { + List tags = new List(); + foreach (var tagName in tagNamesForContentItem) { + Tag tag = GetTagByName(tagName); + if (tag == null) { + CreateTag(tagName); + tag = GetTagByName(tagName); + } + tags.Add(tag.Id); + } + ModifyTagsForContentItem(contentItemId, tags); + } + + #endregion + + private void ModifyTagsForContentItem(int contentItemId, IEnumerable tagsForContentItem) { List newTagsForContentItem = new List(tagsForContentItem); IEnumerable currentTagsForContentItem = _tagsContentItemsRepository.Fetch(x => x.ContentItemId == contentItemId); foreach (var tagContentItem in currentTagsForContentItem) { @@ -115,7 +130,5 @@ namespace Orchard.Tags.Services { _tagsContentItemsRepository.Create(new TagsContentItems { ContentItemId = contentItemId, TagId = newTagForContentItem }); } } - - #endregion } } diff --git a/src/Orchard.Web/Packages/Orchard.Tags/Views/Models/EditorTemplates/HasTags.ascx b/src/Orchard.Web/Packages/Orchard.Tags/Views/Models/EditorTemplates/HasTags.ascx index 751da2232..f7cf6f746 100644 --- a/src/Orchard.Web/Packages/Orchard.Tags/Views/Models/EditorTemplates/HasTags.ascx +++ b/src/Orchard.Web/Packages/Orchard.Tags/Views/Models/EditorTemplates/HasTags.ascx @@ -2,32 +2,21 @@ <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Tags.Models"%>

Tags

-<% Html.BeginForm("Edit", "Home", new { area = "Orchard.Tags" }); %> +<% Html.BeginForm("Update", "Home", new { area = "Orchard.Tags" }); %> <%= Html.ValidationSummary() %>

Edit Tags

<%= Html.Hidden("TaggedContentId", Model.ContentItem.Id) %> - <%= Html.Hidden("ReturnUrl", Context.Request.Url) %> -

Choose from existing tags

-
    - <% foreach (var tag in Model.AllTags) { %> -
  1. - - <% if (Model.CurrentTags.Contains(tag)) {%> - - <% } else {%> - - <% } %> -
  2. - <% } %> -
  3. - -
  4. -
-

Or add a new tag

+ <%= Html.Hidden("ReturnUrl", Context.Request.Url) %> + <% + string tags = ""; + foreach (var tag in Model.CurrentTags) { + tags += tag.TagName; + tags += ","; + } %>
  1. - +