From 44ec6440c6d30390513b13eb6dd39736d4c69839 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 20 Oct 2011 00:17:13 -0700 Subject: [PATCH] Adding FieldDriver.Describe to let content fields expose their storage properties --HG-- branch : 1.x --- .hgsubstate | 4 +-- .../Core/Common/Drivers/TextFieldDriver.cs | 8 ++++++ .../Orchard.Tags/Projections/TagsFilter.cs | 3 ++- .../ContentManagement/DefaultContentQuery.cs | 5 ++++ .../Drivers/ContentFieldDriver.cs | 2 ++ .../Drivers/IContentFieldDriver.cs | 1 + .../Handlers/DescribeMembersContext.cs | 25 +++++++++++++++++++ src/Orchard/ContentManagement/ISortFactory.cs | 1 + src/Orchard/Orchard.Framework.csproj | 1 + 9 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 src/Orchard/ContentManagement/Handlers/DescribeMembersContext.cs diff --git a/.hgsubstate b/.hgsubstate index 148e5184d..512ad9013 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -1,5 +1,5 @@ -d0cf85644ff34b0630a12eed746a66a8d88eb5cf src/Orchard.Web/Modules/Orchard.Forms -b571876d276f9022c12b8b464d5e138f5ce06c14 src/Orchard.Web/Modules/Orchard.Projections +53d2172cf326b72801dcb5418d25fff394cd22bb src/Orchard.Web/Modules/Orchard.Forms +ef9e924d76d610da862d952f1f0bf3e28c007138 src/Orchard.Web/Modules/Orchard.Projections 108ae2f95c8bf9bf0d4d06d0e31b5b77f855cba3 src/Orchard.Web/Modules/Orchard.Rules 65057c6a5cd71f7994ba9bcbeece50dbb737620e src/Orchard.Web/Modules/Orchard.TaskLease 9496e39d3bab7655114d8dfc75290954856ec567 src/Orchard.Web/Modules/Orchard.Tokens diff --git a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs index df2818cb1..793405598 100644 --- a/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs +++ b/src/Orchard.Web/Core/Common/Drivers/TextFieldDriver.cs @@ -3,14 +3,17 @@ using Orchard.ContentManagement; using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Handlers; using Orchard.Core.Common.Fields; +using Orchard.Localization; namespace Orchard.Core.Common.Drivers { [UsedImplicitly] public class TextFieldDriver : ContentFieldDriver { public TextFieldDriver(IOrchardServices services) { Services = services; + T = NullLocalizer.Instance; } + public Localizer T { get; set; } public IOrchardServices Services { get; set; } private static string GetPrefix(TextField field, ContentPart part) { @@ -46,5 +49,10 @@ namespace Orchard.Core.Common.Drivers { protected override void Exporting(ContentPart part, TextField field, ExportContentContext context) { context.Element(field.FieldDefinition.Name + "." + field.Name).SetAttributeValue("Text", field.Value); } + + public override void Describe(DescribeMembersContext context) { + context + .Member(null, typeof(string), T("Value"), T("The text associated with the field.")); + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Tags/Projections/TagsFilter.cs b/src/Orchard.Web/Modules/Orchard.Tags/Projections/TagsFilter.cs index 0f2a61fdb..a00e4b380 100644 --- a/src/Orchard.Web/Modules/Orchard.Tags/Projections/TagsFilter.cs +++ b/src/Orchard.Web/Modules/Orchard.Tags/Projections/TagsFilter.cs @@ -6,6 +6,7 @@ using Orchard.DisplayManagement; using Orchard.Environment.Extensions; using Orchard.Events; using Orchard.Localization; +using Orchard.Tags.Models; using Orchard.Tags.Services; namespace Orchard.Tags.Projections { @@ -38,7 +39,7 @@ namespace Orchard.Tags.Projections { if (!String.IsNullOrEmpty(tags)) { var ids = tags.Split(new[] { ',' }).Select(Int32.Parse).ToArray(); var query = (IContentQuery)context.Query; - context.Query = query.Where(x => x.WithRecord("TagsPartRecord").WithRelationship("Tags.TagRecord").In("Id", ids)); + context.Query = query.Join().Where(x => x.Tags.Any(t => ids.Contains(t.TagRecord.Id))); } } diff --git a/src/Orchard/ContentManagement/DefaultContentQuery.cs b/src/Orchard/ContentManagement/DefaultContentQuery.cs index fbb56f70e..66403c79c 100644 --- a/src/Orchard/ContentManagement/DefaultContentQuery.cs +++ b/src/Orchard/ContentManagement/DefaultContentQuery.cs @@ -474,6 +474,11 @@ namespace Orchard.ContentManagement { return this; } + public ISortFactory WithRelationship(string path) { + Criteria = _query.BindCriteriaByPath(Criteria, path); + return this; + } + public void Asc(string propertyName) { Order = Order.Asc(propertyName); } diff --git a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs index a26b50fbe..713b0f7e7 100644 --- a/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/ContentFieldDriver.cs @@ -81,6 +81,8 @@ namespace Orchard.ContentManagement.Drivers { protected virtual void Imported(ContentPart part, TField field, ImportContentContext context) { } protected virtual void Exporting(ContentPart part, TField field, ExportContentContext context) { } protected virtual void Exported(ContentPart part, TField field, ExportContentContext context) { } + + public virtual void Describe(DescribeMembersContext context) { } public ContentShapeResult ContentShape(string shapeType, Func factory) { return ContentShapeImplementation(shapeType, null, ctx => factory()); diff --git a/src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs b/src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs index a6cc65649..a5fecef78 100644 --- a/src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs +++ b/src/Orchard/ContentManagement/Drivers/IContentFieldDriver.cs @@ -11,6 +11,7 @@ namespace Orchard.ContentManagement.Drivers { void Imported(ImportContentContext context); void Exporting(ExportContentContext context); void Exported(ExportContentContext context); + void Describe(DescribeMembersContext context); IEnumerable GetFieldInfo(); void GetContentItemMetadata(GetContentItemMetadataContext context); } diff --git a/src/Orchard/ContentManagement/Handlers/DescribeMembersContext.cs b/src/Orchard/ContentManagement/Handlers/DescribeMembersContext.cs new file mode 100644 index 000000000..27929727a --- /dev/null +++ b/src/Orchard/ContentManagement/Handlers/DescribeMembersContext.cs @@ -0,0 +1,25 @@ +using System; +using Orchard.Localization; + +namespace Orchard.ContentManagement.Handlers { + public class DescribeMembersContext { + private readonly Action _processMember; + + public DescribeMembersContext(Action processMember) { + _processMember = processMember; + } + + public DescribeMembersContext Member(string storageName, Type storageType) { + return Member(storageName, storageType, null); + } + + public DescribeMembersContext Member(string storageName, Type storageType, LocalizedString displayName) { + return Member(storageName, storageType, displayName, null); + } + + public DescribeMembersContext Member(string storageName, Type storageType, LocalizedString displayName, LocalizedString description) { + _processMember(storageName, storageType, displayName, description); + return this; + } + } +} \ No newline at end of file diff --git a/src/Orchard/ContentManagement/ISortFactory.cs b/src/Orchard/ContentManagement/ISortFactory.cs index d230f3216..944c23004 100644 --- a/src/Orchard/ContentManagement/ISortFactory.cs +++ b/src/Orchard/ContentManagement/ISortFactory.cs @@ -2,6 +2,7 @@ public interface ISortFactory { ISortFactory WithRecord(string recordName); ISortFactory WithVersionRecord(string recordName); + ISortFactory WithRelationship(string propertyName); void Asc(string propertyName); void Desc(string propertyName); diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 8b11b9ea9..f16f357b8 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -169,6 +169,7 @@ +