diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs index adab54f9e..6351f52b6 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs @@ -57,6 +57,8 @@ namespace Orchard.Comments.Drivers { if (contentItem != null) { part.Record.CommentedOn = contentItem.Id; } + + contentItem.As().Record.CommentPartRecords.Add(part.Record); } var commentedOnContainer = context.Attribute(part.PartDefinition.Name, "CommentedOnContainer"); diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs index 770b72a3a..22d0cb477 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentsPartDriver.cs @@ -1,12 +1,19 @@ using System; using JetBrains.Annotations; using Orchard.Comments.Models; +using Orchard.Comments.Services; using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; namespace Orchard.Comments.Drivers { [UsedImplicitly] public class CommentsPartDriver : ContentPartDriver { + private readonly ICommentService _commentService; + + public CommentsPartDriver(ICommentService commentService) { + _commentService = commentService; + } + protected override DriverResult Display(CommentsPart part, string displayType, dynamic shapeHelper) { if (part.CommentsShown == false) return null; @@ -15,9 +22,9 @@ namespace Orchard.Comments.Drivers { ContentShape("Parts_Comments", () => shapeHelper.Parts_Comments(ContentPart: part)), ContentShape("Parts_Comments_Count", - () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: part.Comments.Count, PendingCount: part.PendingComments.Count)), + () => shapeHelper.Parts_Comments_Count(ContentPart: part, CommentCount: _commentService.GetCommentsForCommentedContent(part.ContentItem.Id).Count(), PendingCount: part.PendingComments.Count)), ContentShape("Parts_Comments_Count_SummaryAdmin", - () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: part.Comments.Count, PendingCount: part.PendingComments.Count)) + () => shapeHelper.Parts_Comments_Count_SummaryAdmin(ContentPart: part, CommentCount: _commentService.GetCommentsForCommentedContent(part.ContentItem.Id).Count(), PendingCount: part.PendingComments.Count)) ); } diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentsPartHandler.cs index 344b3d42c..8cf120d4e 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentsPartHandler.cs @@ -1,4 +1,5 @@ -using System.Linq; +using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; using Orchard.Comments.Models; using Orchard.Comments.Services; @@ -19,17 +20,18 @@ namespace Orchard.Comments.Handlers { OnInitializing((ctx, x) => { x.CommentsActive = true; x.CommentsShown = true; + x.Comments = new List(); }); OnLoading((context, comments) => { comments._comments.Loader(list => contentManager .Query() - .Where(x => x.CommentedOn == context.ContentItem.Id && x.Status == CommentStatus.Approved) + .Where(x => x.CommentsPartRecord == context.ContentItem.As().Record && x.Status == CommentStatus.Approved) .List().ToList()); comments._pendingComments.Loader(list => contentManager .Query() - .Where(x => x.CommentedOn == context.ContentItem.Id && x.Status == CommentStatus.Pending) + .Where(x => x.CommentsPartRecord == context.ContentItem.As().Record && x.Status == CommentStatus.Pending) .List().ToList()); }); diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Comments/Migrations.cs index bc16f96cf..f76c9b7de 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Migrations.cs @@ -1,11 +1,19 @@ using System; +using Orchard.Comments.Models; +using Orchard.Comments.Services; +using Orchard.ContentManagement; using Orchard.ContentManagement.MetaData; using Orchard.Core.Contents.Extensions; using Orchard.Data.Migration; namespace Orchard.Comments { public class Migrations : DataMigrationImpl { - + private readonly ICommentService _commentService; + + public Migrations(ICommentService commentService) { + _commentService = commentService; + } + public int Create() { SchemaBuilder.CreateTable("CommentPartRecord", table => table .ContentPartRecord() @@ -18,6 +26,7 @@ namespace Orchard.Comments { .Column("CommentText", column => column.Unlimited()) .Column("CommentedOn") .Column("CommentedOnContainer") + .Column("CommentsPartRecord_id") ); SchemaBuilder.CreateTable("CommentSettingsPartRecord", table => table @@ -48,7 +57,7 @@ namespace Orchard.Comments { ContentDefinitionManager.AlterPartDefinition("CommentsPart", builder => builder.Attachable()); - return 2; + return 3; } public int UpdateFrom1() { @@ -56,5 +65,24 @@ namespace Orchard.Comments { return 2; } + + public int UpdateFrom2() { + //SchemaBuilder.AlterTable("CommentPartRecord", table => table + // .AddColumn("CommentsPartRecord_id") + // ); + + // populate the CommentsPartRecord.Comments property + foreach(var comment in _commentService.GetComments().List()) { + var commentedContent = _commentService.GetCommentedContent(comment.Record.CommentedOn); + var commentsPart = commentedContent.As(); + + // the comment part might have been removed since the comment was placed + if(commentsPart != null) { + commentsPart.Record.CommentPartRecords.Add(comment.Record); + } + } + + return 3; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentPartRecord.cs index 2209c4979..b07511b5b 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentPartRecord.cs @@ -14,5 +14,7 @@ namespace Orchard.Comments.Models { public virtual string CommentText { get; set; } public virtual int CommentedOn { get; set; } public virtual int CommentedOnContainer { get; set; } + + public virtual CommentsPartRecord CommentsPartRecord { get; set; } } } diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentsPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentsPartRecord.cs index d423f8c54..972178c31 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentsPartRecord.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentsPartRecord.cs @@ -1,8 +1,13 @@ +using System.Collections.Generic; using Orchard.ContentManagement.Records; +using Orchard.Data.Conventions; namespace Orchard.Comments.Models { public class CommentsPartRecord : ContentPartRecord { public virtual bool CommentsShown { get; set; } public virtual bool CommentsActive { get; set; } + + [CascadeAllDeleteOrphan] + public virtual IList CommentPartRecords { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj index 4df3b95c1..1d4375faa 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj +++ b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj @@ -67,6 +67,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs index 51e34d6ca..8498d79bf 100644 --- a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs +++ b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs @@ -84,6 +84,7 @@ namespace Orchard.Comments.Services { if (commentedOn != null && commentedOn.Container != null) { comment.Record.CommentedOnContainer = commentedOn.Container.ContentItem.Id; } + commentedOn.As().Record.CommentPartRecords.Add(comment.Record); }); } diff --git a/src/Orchard/ContentManagement/DefaultContentQuery.cs b/src/Orchard/ContentManagement/DefaultContentQuery.cs index 66403c79c..b044488d6 100644 --- a/src/Orchard/ContentManagement/DefaultContentQuery.cs +++ b/src/Orchard/ContentManagement/DefaultContentQuery.cs @@ -31,8 +31,8 @@ namespace Orchard.ContentManagement { return _session; } - internal ICriteria BindCriteriaByPath(ICriteria criteria, string path) { - return criteria.GetCriteriaByPath(path) ?? criteria.CreateCriteria(path); + internal ICriteria BindCriteriaByPath(ICriteria criteria, string path, string alias = null) { + return criteria.GetCriteriaByPath(path) ?? (alias == null ? criteria.CreateCriteria(path) : criteria.CreateCriteria(path, alias)); } internal ICriteria BindTypeCriteria() { @@ -44,12 +44,12 @@ namespace Orchard.ContentManagement { internal ICriteria BindItemCriteria() { // [ContentItemVersionRecord] >join> [ContentItemRecord] - return BindCriteriaByPath(BindItemVersionCriteria(), "ContentItemRecord"); + return BindCriteriaByPath(BindItemVersionCriteria(), "ContentItemRecord", "ci"); } internal ICriteria BindItemVersionCriteria() { if (_itemVersionCriteria == null) { - _itemVersionCriteria = BindSession().CreateCriteria(); + _itemVersionCriteria = BindSession().CreateCriteria("civ"); } return _itemVersionCriteria; }