mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-10-15 19:54:57 +08:00
Shifting TagsPart
This commit is contained in:
@@ -95,9 +95,9 @@ namespace Orchard.Tests.Modules.Tags.Services {
|
||||
ClearSession();
|
||||
|
||||
var thing2 = _contentManager.Get(thing.Id);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.True);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tag => tag == "tag1"), Is.True);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tag => tag == "tag2"), Is.True);
|
||||
Assert.That(thing2.As<TagsPart>().CurrentTags.Any(tag => tag == "tag3"), Is.True);
|
||||
}
|
||||
|
||||
[Test]
|
||||
@@ -263,13 +263,13 @@ namespace Orchard.Tests.Modules.Tags.Services {
|
||||
Assert.That(_tagService.GetTags().Any(tagRecord => tagRecord.TagName == "tag2"), Is.False);
|
||||
Assert.That(_tagService.GetTags().Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
|
||||
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag1"), Is.True);
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag2"), Is.False);
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag1"), Is.True);
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag2"), Is.False);
|
||||
Assert.That(_contentManager.Get(thing1.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
|
||||
|
||||
Assert.That(_contentManager.Get(thing2.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
|
||||
Assert.That(_contentManager.Get(thing2.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
|
||||
|
||||
Assert.That(_contentManager.Get(thing3.Id).As<TagsPart>().CurrentTags.Any(tagRecord => tagRecord.TagName == "tag3"), Is.True);
|
||||
Assert.That(_contentManager.Get(thing3.Id).As<TagsPart>().CurrentTags.Any(t => t == "tag3"), Is.True);
|
||||
}
|
||||
|
||||
public class ThingHandler : ContentHandler {
|
||||
|
@@ -14,7 +14,7 @@ using Orchard.UI.Notify;
|
||||
namespace Orchard.Tags.Drivers {
|
||||
[UsedImplicitly]
|
||||
public class TagsPartDriver : ContentPartDriver<TagsPart> {
|
||||
private static readonly char[] _disalowedChars = new [] { '<', '>', '*', '%', ':', '&', '\\', '"', '|' };
|
||||
private static readonly char[] _disalowedChars = { '<', '>', '*', '%', ':', '&', '\\', '"', '|' };
|
||||
private const string TemplateName = "Parts/Tags";
|
||||
private readonly ITagService _tagService;
|
||||
private readonly INotifier _notifier;
|
||||
@@ -67,7 +67,7 @@ namespace Orchard.Tags.Drivers {
|
||||
|
||||
private static EditTagsViewModel BuildEditorViewModel(TagsPart part) {
|
||||
return new EditTagsViewModel {
|
||||
Tags = string.Join(", ", part.CurrentTags.Select((t, i) => t.TagName).ToArray())
|
||||
Tags = string.Join(", ", part.CurrentTags)
|
||||
};
|
||||
}
|
||||
|
||||
@@ -77,14 +77,14 @@ namespace Orchard.Tags.Drivers {
|
||||
var tags = tagString.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries);
|
||||
// Merge tags.
|
||||
if (tags.Length > 0) {
|
||||
var currentTags = part.CurrentTags.Select(t => t.TagName);
|
||||
var currentTags = part.CurrentTags;
|
||||
_tagService.UpdateTagsForContentItem(context.ContentItem, tags.Concat(currentTags).Distinct());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Exporting(TagsPart part, ExportContentContext context) {
|
||||
context.Element(part.PartDefinition.Name).SetAttributeValue("Tags", String.Join(",", part.CurrentTags.Select(t => t.TagName)));
|
||||
context.Element(part.PartDefinition.Name).SetAttributeValue("Tags", String.Join(",", part.CurrentTags));
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,6 +1,4 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Orchard.Data;
|
||||
using Orchard.Data;
|
||||
using Orchard.ContentManagement.Handlers;
|
||||
using Orchard.Tags.Models;
|
||||
using Orchard.Tags.Services;
|
||||
@@ -16,7 +14,7 @@ namespace Orchard.Tags.Handlers {
|
||||
OnIndexing<TagsPart>(
|
||||
(context, tagsPart) => {
|
||||
foreach (var tag in tagsPart.CurrentTags) {
|
||||
context.DocumentIndex.Add("tags", tag.TagName).Analyze();
|
||||
context.DocumentIndex.Add("tags", tag).Analyze();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -1,9 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Orchard.ContentManagement;
|
||||
|
||||
namespace Orchard.Tags.Models {
|
||||
public class TagsPart : ContentPart<TagsPartRecord> {
|
||||
public IEnumerable<TagRecord> CurrentTags { get { return Record.Tags.Select(t => t.TagRecord); } }
|
||||
public IEnumerable<string> CurrentTags {
|
||||
get { return ParseTags(Retrieve<string>("CurrentTags")); }
|
||||
set { Store("CurrentTags", String.Join(",", value)); }
|
||||
}
|
||||
|
||||
private IEnumerable<string> ParseTags(string tags) {
|
||||
return (tags ?? "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,6 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using Orchard.ContentManagement.Records;
|
||||
using Orchard.Data.Conventions;
|
||||
|
||||
namespace Orchard.Tags.Models {
|
||||
public class TagsPartRecord : ContentPartRecord {
|
||||
@@ -8,7 +7,6 @@ namespace Orchard.Tags.Models {
|
||||
Tags = new List<ContentTagRecord>();
|
||||
}
|
||||
|
||||
[Aggregate]
|
||||
public virtual IList<ContentTagRecord> Tags { get; set; }
|
||||
}
|
||||
}
|
@@ -10,7 +10,6 @@ using Orchard.ContentManagement;
|
||||
using Orchard.Security;
|
||||
using Orchard.Tags.Models;
|
||||
using Orchard.UI.Notify;
|
||||
using Orchard.Events;
|
||||
|
||||
namespace Orchard.Tags.Services {
|
||||
[UsedImplicitly]
|
||||
@@ -149,6 +148,8 @@ namespace Orchard.Tags.Services {
|
||||
}
|
||||
|
||||
private void TagContentItem(TagsPartRecord tagsPartRecord, string tagName) {
|
||||
var tagPart = _orchardServices.ContentManager.Get<TagsPart>(tagsPartRecord.Id, VersionOptions.Latest);
|
||||
tagPart.CurrentTags = tagPart.CurrentTags.Concat(new [] {tagName});
|
||||
var tagRecord = GetTagByName(tagName);
|
||||
var tagsContentItems = new ContentTagRecord { TagsPartRecord = tagsPartRecord, TagRecord = tagRecord };
|
||||
_contentTagRepository.Create(tagsContentItems);
|
||||
@@ -165,7 +166,10 @@ namespace Orchard.Tags.Services {
|
||||
// delete orphan tags (for each tag, if there is no other contentItem than the one being deleted, it's an orphan)
|
||||
foreach (var tag in tagsPart.CurrentTags) {
|
||||
if (_contentTagRepository.Count(x => x.TagsPartRecord.Id != contentItem.Id) == 0) {
|
||||
_tagRepository.Delete(tag);
|
||||
var tagRecord = GetTagByName(tag);
|
||||
if (tagRecord != null) {
|
||||
_tagRepository.Delete(tagRecord);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -173,6 +177,8 @@ namespace Orchard.Tags.Services {
|
||||
foreach (var record in _contentTagRepository.Fetch(x => x.TagsPartRecord.Id == contentItem.Id)) {
|
||||
_contentTagRepository.Delete(record);
|
||||
}
|
||||
|
||||
tagsPart.CurrentTags = Enumerable.Empty<string>();
|
||||
}
|
||||
|
||||
public void UpdateTagsForContentItem(ContentItem contentItem, IEnumerable<string> tagNamesForContentItem) {
|
||||
@@ -191,6 +197,8 @@ namespace Orchard.Tags.Services {
|
||||
foreach (var newTagForContentItem in newTagsForContentItem) {
|
||||
_contentTagRepository.Create(new ContentTagRecord { TagsPartRecord = contentItem.As<TagsPart>().Record, TagRecord = newTagForContentItem });
|
||||
}
|
||||
|
||||
contentItem.As<TagsPart>().CurrentTags = tagNamesForContentItem;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Core.XmlRpc;
|
||||
@@ -101,7 +100,7 @@ namespace Orchard.Tags.Services {
|
||||
if (contentItem == null)
|
||||
return;
|
||||
|
||||
var tags = contentItem.As<TagsPart>().CurrentTags.Select(tag => tag.TagName);
|
||||
var tags = contentItem.As<TagsPart>().CurrentTags;
|
||||
post.Set("mt_keywords", string.Join(", ", tags));
|
||||
});
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
if (tagsHtml.Any()) {
|
||||
tagsHtml.Add(new HtmlString(", "));
|
||||
}
|
||||
tagsHtml.Add(Html.ActionLink((string)t.TagName, "Search", "Home", new { area = "Orchard.Tags", tagName = (string)t.TagName }, new { }));
|
||||
tagsHtml.Add(Html.ActionLink((string)t, "Search", "Home", new { area = "Orchard.Tags", tagName = (string)t }, new { }));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,6 @@
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Authentication;
|
||||
using System.Web.Mvc;
|
||||
using Orchard;
|
||||
@@ -135,8 +137,8 @@ namespace Upgrade.Controllers {
|
||||
throw new AuthenticationException("");
|
||||
|
||||
var lastContentItemId = id;
|
||||
// TypePadSettingsPartRecord
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPermissions_ContentPermissionsPartRecord" + " WHERE Id > " + id),
|
||||
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPermissions_ContentPermissionsPartRecord") + " WHERE Id > " + id,
|
||||
(reader, connection) => {
|
||||
lastContentItemId = (int) reader["Id"];
|
||||
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
|
||||
@@ -166,8 +168,8 @@ namespace Upgrade.Controllers {
|
||||
throw new AuthenticationException("");
|
||||
|
||||
var lastContentItemId = id;
|
||||
// TypePadSettingsPartRecord
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPicker_ContentMenuItemPartRecord" + " WHERE Id > " + id),
|
||||
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_ContentPicker_ContentMenuItemPartRecord") + " WHERE Id > " + id,
|
||||
(reader, connection) => {
|
||||
lastContentItemId = (int)reader["Id"];
|
||||
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
|
||||
@@ -177,5 +179,31 @@ namespace Upgrade.Controllers {
|
||||
|
||||
return new JsonResult { Data = lastContentItemId };
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public JsonResult MigrateTagsPart(int id) {
|
||||
if (!_orchardServices.Authorizer.Authorize(StandardPermissions.SiteOwner))
|
||||
throw new AuthenticationException("");
|
||||
|
||||
var lastContentItemId = id;
|
||||
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " * FROM " + _upgradeService.GetPrefixedTableName("Orchard_Tags_TagsPartRecord") + " WHERE Id > " + id,
|
||||
(reader, connection) => {
|
||||
lastContentItemId = (int)reader["Id"];
|
||||
var contentPermissionPart = _orchardServices.ContentManager.Get(lastContentItemId);
|
||||
|
||||
var tagNames = new List<string>();
|
||||
_upgradeService.ExecuteReader("SELECT TOP " + BATCH + " TR.TagName as TagName FROM "
|
||||
+ _upgradeService.GetPrefixedTableName("Orchard_Tags_ContentTagRecord") + " as CTR "
|
||||
+ " INNER JOIN " + _upgradeService.GetPrefixedTableName("Orchard_Tags_TagRecord") + " as TR "
|
||||
+ " ON CTR.TagRecord_Id = TR.Id"
|
||||
+ " WHERE TagsPartRecord_id = " + lastContentItemId, (r, c) => tagNames.Add((string) r["TagName"]));
|
||||
|
||||
|
||||
contentPermissionPart.As<InfosetPart>().Store("TagsPart", "CurrentTags", String.Join(",", tagNames));
|
||||
});
|
||||
|
||||
return new JsonResult { Data = lastContentItemId };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>@T("Migrating Content Item Menu Parts:")</legend>
|
||||
<legend>@T("Migrating Content Item Permissions Parts:")</legend>
|
||||
<span class="hint">@T("This migration step will copy all Content Item Permissions parts to Infosets.")</span>
|
||||
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateContentPermissionsPart", "Infoset")">@T("Migrate")</button>
|
||||
</fieldset>
|
||||
@@ -33,6 +33,12 @@
|
||||
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateContentMenuItemPart", "Infoset")">@T("Migrate")</button>
|
||||
</fieldset>
|
||||
|
||||
<fieldset>
|
||||
<legend>@T("Migrating Tags Parts:")</legend>
|
||||
<span class="hint">@T("This migration step will copy all Tags parts to Infosets.")</span>
|
||||
<button type="button" class="button button-migrate" data-url="@Url.Action("MigrateTagsPart", "Infoset")">@T("Migrate")</button>
|
||||
</fieldset>
|
||||
|
||||
@using (Script.Foot()) {
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
|
@@ -41,19 +41,19 @@ namespace Orchard.Mvc {
|
||||
return new HttpContextWrapper(HttpContext.Current);
|
||||
}
|
||||
|
||||
// this doesn't work in a background service, throws an exception in ContentManager.Handlers
|
||||
//var siteService = context.Resolve<ISiteService>();
|
||||
//var baseUrl = siteService.GetSiteSettings().BaseUrl;
|
||||
//this doesn't work in a background service, throws an exception in ContentManager.Handlers
|
||||
var siteService = context.Resolve<ISiteService>();
|
||||
var baseUrl = siteService.GetSiteSettings().BaseUrl;
|
||||
|
||||
var session = context.Resolve<ISessionLocator>().For(typeof(ContentItem));
|
||||
var shellSettings = context.Resolve<ShellSettings>();
|
||||
//var session = context.Resolve<ISessionLocator>().For(typeof(ContentItem));
|
||||
//var shellSettings = context.Resolve<ShellSettings>();
|
||||
|
||||
var tableName = "Settings_SiteSettings2PartRecord";
|
||||
if (!string.IsNullOrEmpty(shellSettings.DataTablePrefix)) {
|
||||
tableName = shellSettings.DataTablePrefix + "_" + tableName;
|
||||
}
|
||||
var query = session.CreateSQLQuery("SELECT BaseUrl FROM " + tableName);
|
||||
var baseUrl = query.UniqueResult<string>();
|
||||
//var tableName = "Settings_SiteSettings2PartRecord";
|
||||
//if (!string.IsNullOrEmpty(shellSettings.DataTablePrefix)) {
|
||||
// tableName = shellSettings.DataTablePrefix + "_" + tableName;
|
||||
//}
|
||||
//var query = session.CreateSQLQuery("SELECT BaseUrl FROM " + tableName);
|
||||
//var baseUrl = query.UniqueResult<string>();
|
||||
|
||||
return new HttpContextPlaceholder(baseUrl);
|
||||
}
|
||||
|
Reference in New Issue
Block a user