From ae82ccc86536afac390acb9d9227f85294b9a316 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 17 Jun 2010 16:41:10 -0700 Subject: [PATCH] Make the culture filter on search results an option. Add checkbox in admin. --HG-- branch : dev --- .../Controllers/SearchController.cs | 8 +++++++- .../Handlers/SearchSettingsHandler.cs | 15 +++++++++++++++ .../Orchard.Search/Models/SearchSettings.cs | 6 ++++++ .../Orchard.Search/Models/SearchSettingsRecord.cs | 7 +++++++ .../Modules/Orchard.Search/Orchard.Search.csproj | 4 ++++ .../Orchard.Search/Services/ISearchService.cs | 2 +- .../Orchard.Search/Services/SearchService.cs | 8 +++++--- .../Parts/Search.SiteSettings.ascx | 10 ++++++++++ 8 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettings.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsRecord.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.ascx diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs index 53d2ce88c..35b3e347a 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs @@ -1,7 +1,11 @@ using System.Web.Mvc; +using JetBrains.Annotations; using Orchard.ContentManagement; using Orchard.Search.Services; using Orchard.Search.ViewModels; +using Orchard.Settings; +using Orchard.Search.Models; + namespace Orchard.Search.Controllers { [ValidateInput(false)] public class SearchController : Controller { @@ -13,11 +17,13 @@ namespace Orchard.Search.Controllers { _contentManager = contentManager; } + protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } + public ActionResult Index(string q, int page = 1, int pageSize = 10) { var searchViewModel = new SearchViewModel { Query = q, DefaultPageSize = 10, // <- yeah, I know :| - PageOfResults = _searchService.Query(q, page, pageSize, searchHit => new SearchResultViewModel { + PageOfResults = _searchService.Query(q, page, pageSize, CurrentSite.As().Record.FilterCulture, searchHit => new SearchResultViewModel { Content = _contentManager.BuildDisplayModel(_contentManager.Get(searchHit.ContentItemId), "SummaryForSearch"), SearchHit = searchHit }) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsHandler.cs b/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsHandler.cs new file mode 100644 index 000000000..ff50356ee --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsHandler.cs @@ -0,0 +1,15 @@ +using JetBrains.Annotations; +using Orchard.Search.Models; +using Orchard.Data; +using Orchard.ContentManagement.Handlers; + +namespace Orchard.Search.Handlers { + [UsedImplicitly] + public class SearchSettingsHandler : ContentHandler { + public SearchSettingsHandler(IRepository repository) { + Filters.Add(new ActivatingFilter("site")); + Filters.Add(StorageFilter.For(repository)); + Filters.Add(new TemplateFilterForRecord("CommentSettings", "Parts/Search.SiteSettings")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettings.cs b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettings.cs new file mode 100644 index 000000000..4fa1b70ec --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettings.cs @@ -0,0 +1,6 @@ +using Orchard.ContentManagement; + +namespace Orchard.Search.Models { + public class SearchSettings : ContentPart { + } +} diff --git a/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsRecord.cs b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsRecord.cs new file mode 100644 index 000000000..1d6336af3 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsRecord.cs @@ -0,0 +1,7 @@ +using Orchard.ContentManagement.Records; + +namespace Orchard.Search.Models { + public class SearchSettingsRecord : ContentPartRecord { + public virtual bool FilterCulture { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj index 6c6232cbf..725a6ece2 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj +++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj @@ -67,7 +67,10 @@ + + + @@ -84,6 +87,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Search/Services/ISearchService.cs b/src/Orchard.Web/Modules/Orchard.Search/Services/ISearchService.cs index 0437e73ba..c2f66455d 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Services/ISearchService.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Services/ISearchService.cs @@ -5,7 +5,7 @@ using Orchard.Indexing; namespace Orchard.Search.Services { public interface ISearchService : IDependency { bool HasIndexToManage { get; } - IPageOfItems Query(string query, int skip, int? take, Func shapeResult); + IPageOfItems Query(string query, int skip, int? take, bool filterCulture, Func shapeResult); void RebuildIndex(); void UpdateIndex(); DateTime GetIndexUpdatedUtc(); diff --git a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs index dba953f48..4a64712d4 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs @@ -33,18 +33,20 @@ namespace Orchard.Search.Services get { return _indexManager.HasIndexProvider(); } } - IPageOfItems ISearchService.Query(string query, int page, int? pageSize, Func shapeResult) { + IPageOfItems ISearchService.Query(string query, int page, int? pageSize, bool filterCulture, Func shapeResult) { if (string.IsNullOrWhiteSpace(query) || !_indexManager.HasIndexProvider()) return null; var searchBuilder = _indexManager.GetSearchIndexProvider().CreateSearchBuilder(SearchIndexName) - .Parse(new [] {"title", "body"}, query); + .Parse(new[] {"title", "body"}, query); + if ( filterCulture ) { var culture = _cultureManager.GetSiteCulture(); - + // use LCID as the text representation gets analyzed by the query parser searchBuilder .WithField("culture", CultureInfo.GetCultureInfo(culture).LCID); + } var totalCount = searchBuilder.Count(); if (pageSize != null) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.ascx b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.ascx new file mode 100644 index 000000000..685a3cd9b --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Views/EditorTemplates/Parts/Search.SiteSettings.ascx @@ -0,0 +1,10 @@ +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Search.Models"%> +
+ <%: T("Search")%> +
+ <%: Html.EditorFor(m => m.FilterCulture) %> + + <%: Html.ValidationMessage("FilterCulture", "*")%> +
+
\ No newline at end of file