From eb8d339e62d1e2b6387ce90d066f820703420ecd Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Wed, 30 May 2012 11:33:51 -0700 Subject: [PATCH] Adding Content Search in Admin --HG-- branch : 1.x --- .../Orchard.Search/ContentAdminMenu.cs | 26 +++++++ .../ContentPickerNavigationProvider.cs | 4 +- .../Controllers/AdminController.cs | 77 +++++++++++++++++++ .../Controllers/ContentPickerController.cs | 2 + .../Modules/Orchard.Search/Module.txt | 20 ++++- .../Orchard.Search/Orchard.Search.csproj | 5 ++ .../Orchard.Search/Views/Admin/Index.cshtml | 21 +++++ .../Views/SearchContentTab.cshtml | 2 +- 8 files changed, 152 insertions(+), 5 deletions(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Search/ContentAdminMenu.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Search/Views/Admin/Index.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Search/ContentAdminMenu.cs b/src/Orchard.Web/Modules/Orchard.Search/ContentAdminMenu.cs new file mode 100644 index 000000000..c3669f6bc --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/ContentAdminMenu.cs @@ -0,0 +1,26 @@ +using Orchard.Environment.Extensions; +using Orchard.Localization; +using Orchard.UI.Navigation; + +namespace Orchard.Search { + [OrchardFeature("Orchard.Search.Content")] + public class ContentAdminMenu : INavigationProvider { + public ContentAdminMenu() { + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + public string MenuName { + get { return "admin"; } + } + + public void GetNavigation(NavigationBuilder builder) { + builder.Add(T("Content"), + menu => menu + .Add(T("Search"), "1.5", item => item.Action("Index", "Admin", new {area = "Orchard.Search"}).LocalNav()) + ); + + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/ContentPickerNavigationProvider.cs b/src/Orchard.Web/Modules/Orchard.Search/ContentPickerNavigationProvider.cs index 7768a1613..912eaa339 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/ContentPickerNavigationProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/ContentPickerNavigationProvider.cs @@ -1,7 +1,9 @@ -using Orchard.Localization; +using Orchard.Environment.Extensions; +using Orchard.Localization; using Orchard.UI.Navigation; namespace Orchard.Search { + [OrchardFeature("Orchard.Search.ContentPicker")] public class ContentPickerNavigationProvider : INavigationProvider { public ContentPickerNavigationProvider() { T = NullLocalizer.Instance; diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs new file mode 100644 index 000000000..91b371bb9 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/AdminController.cs @@ -0,0 +1,77 @@ +using System; +using System.Linq; +using System.Web.Mvc; +using Orchard.Collections; +using Orchard.ContentManagement; +using Orchard.Environment.Extensions; +using Orchard.Indexing; +using Orchard.Localization; +using Orchard.Logging; +using Orchard.Search.Models; +using Orchard.Search.Services; +using Orchard.Settings; +using Orchard.Themes; +using Orchard.UI.Navigation; +using Orchard.UI.Notify; + +namespace Orchard.Search.Controllers { + [OrchardFeature("Orchard.Search.Content")] + public class AdminController : Controller { + private readonly ISearchService _searchService; + private readonly ISiteService _siteService; + + public AdminController( + IOrchardServices orchardServices, + ISearchService searchService, + ISiteService siteService) { + _searchService = searchService; + _siteService = siteService; + Services = orchardServices; + T = NullLocalizer.Instance; + Logger = NullLogger.Instance; + } + + public IOrchardServices Services { get; set; } + public ILogger Logger { get; set; } + public Localizer T { get; set; } + + public ActionResult Index(PagerParameters pagerParameters, string searchText = "") { + Pager pager = new Pager(_siteService.GetSiteSettings(), pagerParameters); + var searchFields = Services.WorkContext.CurrentSite.As().SearchedFields; + + IPageOfItems searchHits = new PageOfItems(new ISearchHit[] { }); + try { + + searchHits = _searchService.Query(searchText, pager.Page, pager.PageSize, + Services.WorkContext.CurrentSite.As().Record.FilterCulture, + searchFields, + searchHit => searchHit); + } + catch (Exception exception) { + Logger.Error(T("Invalid search query: {0}", exception.Message).Text); + Services.Notifier.Error(T("Invalid search query: {0}", exception.Message)); + } + + var list = Services.New.List(); + foreach (var contentItem in searchHits.Select(searchHit => Services.ContentManager.Get(searchHit.ContentItemId))) { + // ignore search results which content item has been removed or unpublished + if (contentItem == null) { + searchHits.TotalItemCount--; + continue; + } + + list.Add(Services.ContentManager.BuildDisplay(contentItem, "SummaryAdmin")); + } + + var pagerShape = Services.New.Pager(pager).TotalItemCount(searchHits.TotalItemCount); + + dynamic viewModel = Services.New.ViewModel() + .ContentItems(list) + .Pager(pagerShape) + .SearchText(searchText); + + // Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation. + return View((object)viewModel); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs b/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs index 3a03d6dd7..e33dadef5 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs +++ b/src/Orchard.Web/Modules/Orchard.Search/Controllers/ContentPickerController.cs @@ -4,6 +4,7 @@ using System.Web.Mvc; using Orchard.Collections; using Orchard.ContentManagement; using Orchard.DisplayManagement; +using Orchard.Environment.Extensions; using Orchard.Indexing; using Orchard.Localization; using Orchard.Logging; @@ -18,6 +19,7 @@ using Orchard.UI.Notify; namespace Orchard.Search.Controllers { [Admin] + [OrchardFeature("Orchard.Search.ContentPicker")] public class ContentPickerController : Controller { private readonly ISearchService _searchService; private readonly ISiteService _siteService; diff --git a/src/Orchard.Web/Modules/Orchard.Search/Module.txt b/src/Orchard.Web/Modules/Orchard.Search/Module.txt index 6b85a46ab..ccad81b4c 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Module.txt +++ b/src/Orchard.Web/Modules/Orchard.Search/Module.txt @@ -5,6 +5,20 @@ Website: http://orchardproject.net Version: 1.4.1 OrchardVersion: 1.4.1 Description: The search module enables the management of the search index and provides the front-end searching user interface. -FeatureDescription: Standard interface to Orchard's built-in search. -Category: Search -Dependencies: Orchard.Indexing + +Features: + Orchard.Search: + Name: Search + Description: Standard interface to Orchard's built-in search. + Dependencies: Orchard.Indexing + Category: Search + Orchard.Search.Content: + Name: Admin Content Search + Description: Provides a Content Search tab in Admin. + Dependencies: Contents + Category: Search + Orchard.Search.ContentPicker: + Name: Content Picker Search + Description: Provides a search tab in Content Picker. + Dependencies: Orchard.ContentPicker + Category: Search diff --git a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj index 673be3480..c6d68c9d4 100644 --- a/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj +++ b/src/Orchard.Web/Modules/Orchard.Search/Orchard.Search.csproj @@ -48,6 +48,8 @@ + + @@ -98,6 +100,9 @@ + + +