From 0c2023b0bdbd37c8720dfb46cc3c9aaffa42c010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= <> Date: Fri, 3 Sep 2010 18:48:50 -0700 Subject: [PATCH 1/3] Use checkboxes in Site Settings to select terms to include in search --HG-- branch : dev --- .../Drivers/SmtpSettingsPartDriver.cs | 12 ++--- .../Controllers/SearchController.cs | 2 +- .../Drivers/SearchSettingsPartDriver.cs | 50 +++++++++++++++++++ .../Handlers/SearchSettingsPartHandler.cs | 1 - .../Models/SearchSettingsPart.cs | 7 ++- .../Orchard.Search/Orchard.Search.csproj | 2 + .../ViewModels/SearchSettingsViewModel.cs | 14 ++++++ .../Parts/Search.SiteSettings.ascx | 16 ++++-- 8 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs diff --git a/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs index eb936c5ad..da6e8b96c 100644 --- a/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs +++ b/src/Orchard.Web/Modules/Orchard.Email/Drivers/SmtpSettingsPartDriver.cs @@ -5,7 +5,7 @@ using Orchard.Localization; namespace Orchard.Email.Drivers { - // We define a specific driver instead of using a TemplateFilterForRecord, because we need the ;odel to be the part and not the record. + // We define a specific driver instead of using a TemplateFilterForRecord, because we need the model to be the part and not the record. // Thus the encryption/decryption will be done when accessing the part's property public class SmtpSettingsPartDriver : ContentPartDriver { @@ -17,13 +17,13 @@ namespace Orchard.Email.Drivers { protected override string Prefix { get { return "SmtpSettings"; } } - protected override DriverResult Editor(SmtpSettingsPart termPart) { - return ContentPartTemplate(termPart, "Parts/Smtp.SiteSettings"); + protected override DriverResult Editor(SmtpSettingsPart part) { + return ContentPartTemplate(part, "Parts/Smtp.SiteSettings"); } - protected override DriverResult Editor(SmtpSettingsPart termPart, IUpdateModel updater) { - updater.TryUpdateModel(termPart, Prefix, null, null); - return Editor(termPart); + protected override DriverResult Editor(SmtpSettingsPart part, IUpdateModel updater) { + updater.TryUpdateModel(part, Prefix, null, null); + return Editor(part); } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs index da2f13e4b..abd4ad485 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/SearchController.cs @@ -24,7 +24,7 @@ namespace Orchard.Search.Controllers { protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } public ActionResult Index(string q, int page = 1, int pageSize = 10) { - var searchFields = CurrentSite.As().Record.SearchedFields.Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries); + var searchFields = CurrentSite.As().SearchedFields; var searchHits = _searchService.Query(q, page, pageSize, CurrentSite.As().Record.FilterCulture, diff --git a/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs new file mode 100644 index 000000000..ef0c6121f --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Drivers/SearchSettingsPartDriver.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Indexing; +using Orchard.Localization; +using Orchard.Search.Models; +using Orchard.Search.ViewModels; + +namespace Orchard.Search.Drivers { + + public class SearchSettingsPartDriver : ContentPartDriver { + private const string SearchIndexName = "Search"; + private readonly IIndexManager _indexManager; + + public SearchSettingsPartDriver(IIndexManager indexManager) { + _indexManager = indexManager; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + protected override string Prefix { get { return "SearchSettings"; } } + + protected override DriverResult Editor(SearchSettingsPart part) { + var model = new SearchSettingsViewModel(); + var searchedFields = part.SearchedFields; + + if (_indexManager.HasIndexProvider()) { + model.Entries = new List(); + foreach (var field in _indexManager.GetSearchIndexProvider().GetFields(SearchIndexName)) { + model.Entries.Add(new SearchSettingsEntry { Field = field, Selected = searchedFields.Contains(field) }); + } + } + + return ContentPartTemplate(model, "Parts/Search.SiteSettings"); + } + + protected override DriverResult Editor(SearchSettingsPart part, IUpdateModel updater) { + var model = new SearchSettingsViewModel(); + + if(updater.TryUpdateModel(model, Prefix, null, null)) { + part.SearchedFields = model.Entries.Where(e => e.Selected).Select(e => e.Field).ToArray(); + } + + return Editor(part); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsPartHandler.cs index 882d389f4..12da0a748 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsPartHandler.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Handlers/SearchSettingsPartHandler.cs @@ -9,7 +9,6 @@ namespace Orchard.Search.Handlers { public SearchSettingsPartHandler(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/SearchSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsPart.cs index c5d4ecec5..8ad179ab7 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsPart.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Models/SearchSettingsPart.cs @@ -1,6 +1,11 @@ -using Orchard.ContentManagement; +using System; +using Orchard.ContentManagement; namespace Orchard.Search.Models { public class SearchSettingsPart : ContentPart { + public string[] SearchedFields { + get { return Record.SearchedFields.Split(new[] {',', ' '}, StringSplitOptions.RemoveEmptyEntries); } + set { Record.SearchedFields = String.Join(", ", value); } + } } } diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj index 39fe7de64..22128d21f 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj +++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj @@ -67,6 +67,7 @@ + @@ -74,6 +75,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs new file mode 100644 index 000000000..1511b3d46 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/ViewModels/SearchSettingsViewModel.cs @@ -0,0 +1,14 @@ +using Orchard.Mvc.ViewModels; +using System.Collections.Generic; + +namespace Orchard.Search.ViewModels { + public class SearchSettingsViewModel : BaseViewModel { + public IList Entries { get; set; } + } + + public class SearchSettingsEntry { + public string Field { get; set; } + public bool Selected { get; set; } + public int Weight { get; set; } + } +} \ No newline at end of file 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 index 859b38720..fbe72ea8d 100644 --- 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 @@ -1,5 +1,5 @@ -<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> -<%@ Import Namespace="Orchard.Search.Models"%> +<%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Search.ViewModels"%>
<%: T("Search")%> <%-- TODO: (sebros) Implementation details after Alpha @@ -10,8 +10,14 @@ --%>
- - <%: Html.EditorFor(m => m.SearchedFields)%> - <%: Html.ValidationMessage("SearchedFields", "*")%> + <% + for(var i=0; i + checked="checked" <% } %> + name="<%:Html.FieldNameFor(m => m.Entries[j].Selected)%>" id="<%:Html.FieldIdFor(m => m.Entries[j].Selected)%>"/> + <%: Html.HiddenFor(m => m.Entries[j].Field)%> + + <% + }%>
\ No newline at end of file From 7b5a3bc4f513369a893f6fe75ac521be3cedccf4 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 7 Sep 2010 11:57:41 -0700 Subject: [PATCH 2/3] Corrected search with empty keyword --HG-- branch : dev --- .../Modules/Orchard.Search/Services/SearchService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs index c73336d73..eb30556f3 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Services/SearchService.cs @@ -31,7 +31,7 @@ namespace Orchard.Search.Services { IPageOfItems ISearchService.Query(string query, int page, int? pageSize, bool filterCulture, string[] searchFields, Func shapeResult) { if (string.IsNullOrWhiteSpace(query)) - return null; + return new PageOfItems(Enumerable.Empty()); var searchBuilder = Search().Parse(searchFields, query); From b5cbff76070aa27a88008fa7b613751640a8170a Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Tue, 7 Sep 2010 12:41:52 -0700 Subject: [PATCH 3/3] Missing localization string --HG-- branch : dev --- src/Orchard.Web/Themes/Contoso/Views/LogOn.ascx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Orchard.Web/Themes/Contoso/Views/LogOn.ascx b/src/Orchard.Web/Themes/Contoso/Views/LogOn.ascx index 7a62692f8..341c7ee3f 100644 --- a/src/Orchard.Web/Themes/Contoso/Views/LogOn.ascx +++ b/src/Orchard.Web/Themes/Contoso/Views/LogOn.ascx @@ -2,7 +2,7 @@ <%@ Import Namespace="Orchard.Users.ViewModels"%>

<%: Html.TitleForPage(Model.Title)%>

-

<%: T("Please enter your username and password.")%> <%: Html.ActionLink("Register", "Register")%><%: T(" if you don't have an account.")%>

+

<%: T("Please enter your username and password.")%> <%: Html.ActionLink(T("Register").ToString(), "Register")%><%: T(" if you don't have an account.")%>

<%: Html.ValidationSummary(T("Login was unsuccessful. Please correct the errors and try again.").ToString())%> <% using (Html.BeginFormAntiForgeryPost(Url.Action("LogOn", new {ReturnUrl = Request.QueryString["ReturnUrl"]}))) { %>