using System;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.UI;
using System.Web.UI.WebControls;
using CMS.CMSHelper;
using CMS.Controls;
using CMS.ExtendedControls;
using CMS.GlobalHelper;
using CMS.ISearchEngine;
using CMS.PortalEngine;
using CMS.SiteProvider;
using CMS.UIControls;
using CMS.WebAnalytics;
using SearchHelper = CMS.SiteProvider.SearchHelper;
public partial class CMSModules_SmartSearch_Controls_SearchResults : CMSUserControl, ISearchFilterable, IUniPageable
{
#region "Variables"
// Filter support
private string mFilterSearchCondition = null;
private string mFilterSearchSort = null;
private string mFilterID = null;
// Search
private string mSearchSort = null;
private string mSearchCondition = null;
private string mIndexes = null;
private string mPath = null;
private bool mCheckPermissions = false;
private SearchOptionsEnum mSearchOptions = SearchOptionsEnum.BasicSearch;
private string mTransformationName = "CMS.Root.SmartSearchResults";
private string mDocumentTypes = null;
private bool? mCombineWithDefaultCulture = null;
private string mCultureCode = CMSContext.PreferredCultureCode;
private bool mSearchInAttachments = false;
private string mAttachmentsWhere = "";
private string mAttachmentsOrderBy = "";
private string mNoResultsText = ResHelper.GetString("srch.results.noresults");
private bool mIgnoreTransformations = false;
private bool mBlockFieldOnlySearch = true;
private bool mSearchTextRequired = true;
// Pager template
private string mPagesTemplateName = null;
private string mCurrentPageTemplateName = null;
private string mSeparatorTemplateName = null;
private string mFirstPageTemplateName = null;
private string mLastPageTemplateName = null;
private string mPreviousPageTemplateName = null;
private string mNextPageTemplateName = null;
private string mPreviousGroupTemplateName = null;
private string mNextGroupTemplateName = null;
private string mLayoutTemplateName = null;
// Direct access templates
private ITemplate mPagesTemplate = null;
private ITemplate mCurrentPageTemplate = null;
private ITemplate mFirstPageTemplate = null;
private ITemplate mLastPageTemplate = null;
private ITemplate mPreviousPageTemplate = null;
private ITemplate mNextPageTemplate = null;
private ITemplate mPreviousGroupTemplate = null;
private ITemplate mNextGroupTemplate = null;
private ITemplate mLayoutTemplate = null;
private ITemplate mPageNumbersSeparatorTemplate = null;
// Template
private ITemplate mItemTemplate = null;
private ITemplate mAlternatingItemTemplate = null;
private ITemplate mFooterTemplate = null;
private ITemplate mHeaderTemplate = null;
private ITemplate mSeparatorTemplate = null;
// Basic repeater instance
private BasicRepeater repSearchResults = new BasicRepeater();
private int mMaxResults = 0;
// Pager instance
private UniPager pgr = null;
#endregion
#region "Delegates & events"
///
/// Search completed deleagate.
///
/// Determines whether this control is visible
public delegate void SearchCompletedHandler(bool visible);
///
/// Raises when search is completed.
///
public event SearchCompletedHandler OnSearchCompleted;
#endregion
#region "Properties"
///
/// Messages placeholder
///
public override MessagesPlaceHolder MessagesPlaceHolder
{
get
{
if (IsLiveSite)
{
return plcMess;
}
else
{
return base.MessagesPlaceHolder;
}
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
plcMess.IsLiveSite = value;
base.IsLiveSite = value;
}
}
///
/// Control CSS class
///
public string CssClass
{
get;
set;
}
#endregion
#region "Search properties"
///
/// Gets or sets filter search condition.
///
public string FilterSearchCondition
{
get
{
return mFilterSearchCondition;
}
set
{
mFilterSearchCondition = value;
}
}
///
/// Gets or sets filter sorting of search.
///
public string FilterSearchSort
{
get
{
return mFilterSearchSort;
}
set
{
mFilterSearchSort = value;
}
}
///
/// Gets or sets sorting of search.
///
public string SearchSort
{
get
{
return mSearchSort;
}
set
{
mSearchSort = value;
}
}
///
/// Gets or sets search condition.
///
public string SearchCondition
{
get
{
return mSearchCondition;
}
set
{
mSearchCondition = value;
}
}
///
/// Gets or sets indexes.
///
public string Indexes
{
get
{
return mIndexes;
}
set
{
mIndexes = value;
}
}
///
/// Gets or sets path.
///
public string Path
{
get
{
return mPath;
}
set
{
mPath = value;
}
}
///
/// Gets or sets document types.
///
public string DocumentTypes
{
get
{
return mDocumentTypes;
}
set
{
mDocumentTypes = value;
}
}
///
/// Gets or sets check permissions.
///
public bool CheckPermissions
{
get
{
return mCheckPermissions;
}
set
{
mCheckPermissions = value;
}
}
///
/// Gets or sets search option.
///
public SearchOptionsEnum SearchOptions
{
get
{
return mSearchOptions;
}
set
{
mSearchOptions = value;
}
}
///
/// Gets or sets transformation name.
///
public string TransformationName
{
get
{
return mTransformationName;
}
set
{
mTransformationName = value;
}
}
///
/// Gets or sets culture code.
///
public string CultureCode
{
get
{
return mCultureCode;
}
set
{
mCultureCode = value;
}
}
///
/// Gets or sets combine with default culture.
///
public bool CombineWithDefaultCulture
{
get
{
// Get from setting if not set
if (!mCombineWithDefaultCulture.HasValue)
{
return SiteInfoProvider.CombineWithDefaultCulture(CMSContext.CurrentSiteName);
}
else
{
return mCombineWithDefaultCulture.Value;
}
}
set
{
mCombineWithDefaultCulture = value;
}
}
///
/// Gets or sets search int attachments.
///
public bool SearchInAttachments
{
get
{
return mSearchInAttachments;
}
set
{
mSearchInAttachments = value;
}
}
///
/// Gets or sets culture code.
///
public string AttachmentsWhere
{
get
{
return mAttachmentsWhere;
}
set
{
mAttachmentsWhere = value;
}
}
///
/// Gets or sets culture code.
///
public string AttachmentsOrderBy
{
get
{
return mAttachmentsOrderBy;
}
set
{
mAttachmentsOrderBy = value;
}
}
///
/// Gets or sets culture code.
///
public string NoResultsText
{
get
{
return mNoResultsText;
}
set
{
mNoResultsText = value;
}
}
///
/// Gets or sets the search mode label text.
///
public string FilterID
{
get
{
return mFilterID;
}
set
{
mFilterID = value;
}
}
///
/// Indicates if transformations should be ignored and templates for direct access should be used.
///
public bool IgnoreTransformations
{
get
{
return mIgnoreTransformations;
}
set
{
mIgnoreTransformations = value;
}
}
///
/// Indicates if parsing errors should be showed if occurs.
///
public bool ShowParsingErrors
{
get;
set;
}
///
/// Indicates if search text is required.
///
public bool SearchTextRequired
{
get
{
return mSearchTextRequired;
}
set
{
mSearchTextRequired = value;
}
}
///
/// Indicates if search should be work without search text.
///
public bool BlockFieldOnlySearch
{
get
{
return mBlockFieldOnlySearch;
}
set
{
mBlockFieldOnlySearch = value;
}
}
///
/// Gets or sets if filter is applied immediately.
///
public bool SearchOnEachPageLoad
{
get
{
return ValidationHelper.GetBoolean(GetValue("SearchOnEachPageLoad"), false);
}
set
{
SetValue("SearchOnEachPageLoad", value);
}
}
#endregion
#region "Pager properties"
///
/// Gets or sets the value that indicates whether scroll position should be cleared after post back paging
///
public bool ResetScrollPositionOnPostBack
{
get
{
return pgrSearch.ResetScrollPositionOnPostBack;
}
set
{
pgrSearch.ResetScrollPositionOnPostBack = value;
}
}
///
/// Gets or sets page size.
///
public int PageSize
{
get
{
return pgrSearch.PageSize;
}
set
{
pgrSearch.PageSize = value;
}
}
///
/// Gets or sets search option.
///
public UniPagerMode PagingMode
{
get
{
return pgrSearch.PagerMode;
}
set
{
pgrSearch.PagerMode = value;
}
}
///
/// Gets or sets query string key.
///
public string QueryStringKey
{
get
{
return pgrSearch.QueryStringKey;
}
set
{
pgrSearch.QueryStringKey = value;
}
}
///
/// Gets or sets group size.
///
public int GroupSize
{
get
{
return pgrSearch.GroupSize;
}
set
{
pgrSearch.GroupSize = value;
}
}
///
/// Gets or sets the value that indicates whether first and last item template are displayed dynamically based on current view.
///
public bool DisplayFirstLastAutomatically
{
get
{
return pgrSearch.DisplayFirstLastAutomatically;
}
set
{
pgrSearch.DisplayFirstLastAutomatically = value;
}
}
///
/// Gets or sets the value that indicates whether first and last item template are displayed dynamically based on current view.
///
public bool DisplayPreviousNextAutomatically
{
get
{
return pgrSearch.DisplayPreviousNextAutomatically;
}
set
{
pgrSearch.DisplayPreviousNextAutomatically = value;
}
}
///
/// Gets or sets the value that indicates whether pager should be hidden for single page.
///
public bool HidePagerForSinglePage
{
get
{
return pgrSearch.HidePagerForSinglePage;
}
set
{
pgrSearch.HidePagerForSinglePage = value;
}
}
///
/// Gets or sets the pager max pages.
///
public int MaxPages
{
get
{
return pgrSearch.MaxPages;
}
set
{
pgrSearch.MaxPages = value;
}
}
///
/// Gets or sets the max. displayed results.
///
public int MaxResults
{
get
{
return mMaxResults;
}
set
{
mMaxResults = value;
}
}
#endregion
#region "UniPager Template properties"
///
/// Gets or sets the pages template name.
///
public string PagesTemplateName
{
get
{
return mPagesTemplateName;
}
set
{
mPagesTemplateName = value;
}
}
///
/// Gets or sets the current page template name.
///
public string CurrentPageTemplateName
{
get
{
return mCurrentPageTemplateName;
}
set
{
mCurrentPageTemplateName = value;
}
}
///
/// Gets or sets the separator template name.
///
public string SeparatorTemplateName
{
get
{
return mSeparatorTemplateName;
}
set
{
mSeparatorTemplateName = value;
}
}
///
/// Gets or sets the first page template name.
///
public string FirstPageTemplateName
{
get
{
return mFirstPageTemplateName;
}
set
{
mFirstPageTemplateName = value;
}
}
///
/// Gets or sets the last page template name.
///
public string LastPageTemplateName
{
get
{
return mLastPageTemplateName;
}
set
{
mLastPageTemplateName = value;
}
}
///
/// Gets or sets the previous page template name.
///
public string PreviousPageTemplateName
{
get
{
return mPreviousPageTemplateName;
}
set
{
mPreviousPageTemplateName = value;
}
}
///
/// Gets or sets the next page template name.
///
public string NextPageTemplateName
{
get
{
return mNextPageTemplateName;
}
set
{
mNextPageTemplateName = value;
}
}
///
/// Gets or sets the previous group template name.
///
public string PreviousGroupTemplateName
{
get
{
return mPreviousGroupTemplateName;
}
set
{
mPreviousGroupTemplateName = value;
}
}
///
/// Gets or sets the next group template name.
///
public string NextGroupTemplateName
{
get
{
return mNextGroupTemplateName;
}
set
{
mNextGroupTemplateName = value;
}
}
///
/// Gets or sets the layout template name.
///
public string LayoutTemplateName
{
get
{
return mLayoutTemplateName;
}
set
{
mLayoutTemplateName = value;
}
}
///
/// Gets or sets the pages template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate PageNumbersTemplate
{
get
{
return mPagesTemplate;
}
set
{
mPagesTemplate = value;
}
}
///
/// Gets or sets the current page template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate CurrentPageTemplate
{
get
{
return mCurrentPageTemplate;
}
set
{
mCurrentPageTemplate = value;
}
}
///
/// Gets or sets the first page template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate FirstPageTemplate
{
get
{
return mFirstPageTemplate;
}
set
{
mFirstPageTemplate = value;
}
}
///
/// Gets or sets the last page template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate LastPageTemplate
{
get
{
return mLastPageTemplate;
}
set
{
mLastPageTemplate = value;
}
}
///
/// Gets or sets the previous page template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate PreviousPageTemplate
{
get
{
return mPreviousPageTemplate;
}
set
{
mPreviousPageTemplate = value;
}
}
///
/// Gets or sets the next page template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate NextPageTemplate
{
get
{
return mNextPageTemplate;
}
set
{
mNextPageTemplate = value;
}
}
///
/// Gets or sets the previous group template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate PreviousGroupTemplate
{
get
{
return mPreviousGroupTemplate;
}
set
{
mPreviousGroupTemplate = value;
}
}
///
/// Gets or sets the next group template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate NextGroupTemplate
{
get
{
return mNextGroupTemplate;
}
set
{
mNextGroupTemplate = value;
}
}
///
/// Gets or sets the next group template for direct access.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate PageNumbersSeparatorTemplate
{
get
{
return mPageNumbersSeparatorTemplate;
}
set
{
mPageNumbersSeparatorTemplate = value;
}
}
///
/// Gets or sets the layout template name.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public ITemplate LayoutTemplate
{
get
{
return mLayoutTemplate;
}
set
{
mLayoutTemplate = value;
}
}
///
/// Sets or gets item template.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public virtual ITemplate ItemTemplate
{
get
{
return mItemTemplate;
}
set
{
mItemTemplate = value;
}
}
///
/// Sets or gets alternating item template.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public virtual ITemplate AlternatingItemTemplate
{
get
{
return mAlternatingItemTemplate;
}
set
{
mAlternatingItemTemplate = value;
}
}
///
/// Sets or gets header template.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public virtual ITemplate HeaderTemplate
{
get
{
return mHeaderTemplate;
}
set
{
mHeaderTemplate = value;
}
}
///
/// Sets or gets footer template.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public virtual ITemplate FooterTemplate
{
get
{
return mFooterTemplate;
}
set
{
mFooterTemplate = value;
}
}
///
/// Sets or gets separator template.
///
[PersistenceMode(PersistenceMode.InnerProperty), DefaultValue((string)null), Browsable(false)]
public virtual ITemplate SeparatorTemplate
{
get
{
return mSeparatorTemplate;
}
set
{
mSeparatorTemplate = value;
}
}
#endregion
#region "Advanced methods"
protected void Page_Load(object sender, EventArgs e)
{
if (StopProcessing)
{
// Do nothing
}
else
{
// Try get external pager
pgr = UniPagerControl;
bool isExternal = true;
// Check whether external pager is set
if (pgr == null)
{
isExternal = false;
pgr = pgrSearch;
// UniPager properties
pgrSearch.PageSize = PageSize;
pgrSearch.GroupSize = GroupSize;
pgrSearch.QueryStringKey = QueryStringKey;
pgrSearch.DisplayFirstLastAutomatically = DisplayFirstLastAutomatically;
pgrSearch.DisplayPreviousNextAutomatically = DisplayPreviousNextAutomatically;
pgrSearch.HidePagerForSinglePage = HidePagerForSinglePage;
pgrSearch.PagerMode = PagingMode;
pgrSearch.MaxPages = MaxPages;
}
if (!isExternal)
{
#region "UniPager template properties"
// UniPager direct templates
if (PageNumbersTemplate != null)
{
pgrSearch.PageNumbersTemplate = PageNumbersTemplate;
}
if (CurrentPageTemplate != null)
{
pgrSearch.CurrentPageTemplate = CurrentPageTemplate;
}
if (PageNumbersSeparatorTemplate != null)
{
pgrSearch.PageNumbersSeparatorTemplate = PageNumbersSeparatorTemplate;
}
if (FirstPageTemplate != null)
{
pgrSearch.FirstPageTemplate = FirstPageTemplate;
}
if (LastPageTemplate != null)
{
pgrSearch.LastPageTemplate = LastPageTemplate;
}
if (PreviousPageTemplate != null)
{
pgrSearch.PreviousPageTemplate = PreviousPageTemplate;
}
if (NextPageTemplate != null)
{
pgrSearch.NextPageTemplate = NextPageTemplate;
}
if (PreviousGroupTemplate != null)
{
pgrSearch.PreviousGroupTemplate = PreviousGroupTemplate;
}
if (NextGroupTemplate != null)
{
pgrSearch.NextGroupTemplate = NextGroupTemplate;
}
if (LayoutTemplate != null)
{
pgrSearch.LayoutTemplate = LayoutTemplate;
}
// UniPager template properties
if (!String.IsNullOrEmpty(PagesTemplateName))
{
pgrSearch.PageNumbersTemplate = CMSDataProperties.LoadTransformation(pgrSearch, PagesTemplateName, false);
}
if (!String.IsNullOrEmpty(CurrentPageTemplateName))
{
pgrSearch.CurrentPageTemplate = CMSDataProperties.LoadTransformation(pgrSearch, CurrentPageTemplateName, false);
}
if (!String.IsNullOrEmpty(SeparatorTemplateName))
{
pgrSearch.PageNumbersSeparatorTemplate = CMSDataProperties.LoadTransformation(pgrSearch, SeparatorTemplateName, false);
}
if (!String.IsNullOrEmpty(FirstPageTemplateName))
{
pgrSearch.FirstPageTemplate = CMSDataProperties.LoadTransformation(pgrSearch, FirstPageTemplateName, false);
}
if (!String.IsNullOrEmpty(LastPageTemplateName))
{
pgrSearch.LastPageTemplate = CMSDataProperties.LoadTransformation(pgrSearch, LastPageTemplateName, false);
}
if (!String.IsNullOrEmpty(PreviousPageTemplateName))
{
pgrSearch.PreviousPageTemplate = CMSDataProperties.LoadTransformation(pgrSearch, PreviousPageTemplateName, false);
}
if (!String.IsNullOrEmpty(NextPageTemplateName))
{
pgrSearch.NextPageTemplate = CMSDataProperties.LoadTransformation(pgrSearch, NextPageTemplateName, false);
}
if (!String.IsNullOrEmpty(PreviousGroupTemplateName))
{
pgrSearch.PreviousGroupTemplate = CMSDataProperties.LoadTransformation(pgrSearch, PreviousGroupTemplateName, false);
}
if (!String.IsNullOrEmpty(NextGroupTemplateName))
{
pgrSearch.NextGroupTemplate = CMSDataProperties.LoadTransformation(pgrSearch, NextGroupTemplateName, false);
}
if (!String.IsNullOrEmpty(LayoutTemplateName))
{
pgrSearch.LayoutTemplate = CMSDataProperties.LoadTransformation(pgrSearch, LayoutTemplateName, false);
}
#endregion
}
// Load transformation
if (!string.IsNullOrEmpty(TransformationName) && !IgnoreTransformations)
{
repSearchResults.ItemTemplate = CMSDataProperties.LoadTransformation(this, TransformationName, false);
}
// Set transformation directly
else
{
repSearchResults.ItemTemplate = ItemTemplate;
repSearchResults.HeaderTemplate = HeaderTemplate;
repSearchResults.FooterTemplate = FooterTemplate;
repSearchResults.AlternatingItemTemplate = AlternatingItemTemplate;
repSearchResults.SeparatorTemplate = SeparatorTemplate;
}
plcBasicRepeater.Controls.Clear();
repSearchResults.ID = "repSearchResults";
plcBasicRepeater.Controls.Add(repSearchResults);
Visible = true;
}
}
///
/// On page prerender.
///
/// Event argument
protected override void OnPreRender(EventArgs e)
{
Search();
base.OnPreRender(e);
}
///
/// Renders control
///
/// HTML writer
protected override void Render(HtmlTextWriter writer)
{
// Hide messages placeholder when no messages are being displayed
plcMess.Visible = ShowParsingErrors || plcMess.HasText;
if (!string.IsNullOrEmpty(CssClass))
{
writer.Write("
", CssClass);
}
base.Render(writer);
if (!string.IsNullOrEmpty(CssClass))
{
writer.Write("
");
}
}
///
/// Perform search.
///
protected void Search()
{
if (StopProcessing)
{
// Do nothing
}
else
{
// Get query strings
string searchText = QueryHelper.GetString("searchtext", "");
bool searchTextIsNotEmptyOrRequired = (!SearchTextRequired || !String.IsNullOrEmpty(searchText));
bool searchAllowed = SearchOnEachPageLoad || QueryHelper.Contains("searchtext");
if ((searchTextIsNotEmptyOrRequired || !SearchHelper.SearchOnlyWhenContentPresent) && searchAllowed)
{
string searchMode = QueryHelper.GetString("searchMode", "");
SearchModeEnum searchModeEnum = CMS.ISearchEngine.SearchHelper.GetSearchModeEnum(searchMode);
// Get current culture
string culture = CultureCode;
if (string.IsNullOrEmpty(culture))
{
culture = ValidationHelper.GetString(ViewState["CultureCode"], CMSContext.PreferredCultureCode);
}
// Get default culture
string defaultCulture = CultureHelper.GetDefaultCulture(CMSContext.CurrentSiteName);
// Resolve path
string path = Path;
if (!string.IsNullOrEmpty(path))
{
path = CMSContext.ResolveCurrentPath(Path);
}
if (CMSContext.ViewMode == ViewModeEnum.LiveSite)
{
// Log on site keywords
if (AnalyticsHelper.JavascriptLoggingEnabled(CMSContext.CurrentSiteName))
{
ScriptHelper.RegisterWebServiceCallFunction(Page);
string script = "WebServiceCall('" + URLHelper.GetAbsoluteUrl("~/CMSPages/WebAnalyticsService.asmx") +
"','LogSearch', '{\"keyword\":" +
// Serialize raw search text to escape '<' and similar characters, then escape '\'
new JavaScriptSerializer().Serialize(searchText).Replace(@"\", @"\\") +
", \"pageGUID\":\"" + CMSContext.CurrentPageInfo.DocumentGUID + "\"}')";
ScriptHelper.RegisterStartupScript(Page, typeof(string), "logSearch", script, true);
}
else
{
AnalyticsHelper.LogOnSiteSearchKeywords(CMSContext.CurrentSiteName, CMSContext.CurrentAliasPath, culture, searchText, 0, 1);
}
}
// Prepare search text
searchText = SearchHelper.CombineSearchCondition(searchText, SearchCondition + FilterSearchCondition, searchModeEnum, SearchOptions, DocumentTypes, culture, defaultCulture, CombineWithDefaultCulture);
// Get positions and ranges for search method
int startPosition = 0;
int numberOfProceeded = 100;
int displayResults = 100;
if (pgr.PageSize != 0 && pgr.GroupSize != 0)
{
startPosition = (pgr.CurrentPage - 1) * pgr.PageSize;
numberOfProceeded = (((pgr.CurrentPage / pgr.GroupSize) + 1) * pgr.PageSize * pgr.GroupSize) + pgr.PageSize;
displayResults = pgr.PageSize;
}
if ((MaxResults > 0) && (numberOfProceeded > MaxResults))
{
numberOfProceeded = MaxResults;
}
// Combine regular search sort with filter sort
string srt = ValidationHelper.GetString(SearchSort, String.Empty).Trim();
string filterSrt = ValidationHelper.GetString(FilterSearchSort, String.Empty).Trim();
if (!String.IsNullOrEmpty(filterSrt))
{
if (!String.IsNullOrEmpty(srt))
{
srt += ", ";
}
srt += filterSrt;
}
// Prepare parameters
SearchParameters parameters = new SearchParameters()
{
SearchFor = searchText,
SearchSort = SearchHelper.GetSort(srt),
Path = path,
ClassNames = DocumentTypes,
CurrentCulture = culture,
DefaultCulture = defaultCulture,
CombineWithDefaultCulture = CombineWithDefaultCulture,
CheckPermissions = CheckPermissions,
SearchInAttachments = SearchInAttachments,
User = (UserInfo)CMSContext.CurrentUser,
SearchIndexes = Indexes,
StartingPosition = startPosition,
DisplayResults = displayResults,
NumberOfProcessedResults = numberOfProceeded,
NumberOfResults = 0,
AttachmentWhere = AttachmentsWhere,
AttachmentOrderBy = AttachmentsOrderBy,
BlockFieldOnlySearch = BlockFieldOnlySearch,
};
// Search
DataSet results = SearchHelper.Search(parameters);
int numberOfResults = parameters.NumberOfResults;
if ((MaxResults > 0) && (numberOfResults > MaxResults))
{
numberOfResults = MaxResults;
}
// Compute page number when necessary (filter changed the number of found result)
if ((pgr.PageSize != 0) && (pgr.GroupSize != 0) && (pgr.CurrentPage > ((numberOfResults - 1) / pgr.PageSize) + 1))
{
pgr.CurrentPage = numberOfResults == 0 ? 1 : ((numberOfResults - 1) / pgr.PageSize) + 1;
}
// Fill repeater with results
repSearchResults.DataSource = results;
repSearchResults.PagerForceNumberOfResults = numberOfResults;
this.PagerForceNumberOfResults = numberOfResults;
repSearchResults.DataBind();
// Call page binding event
if (OnPageBinding != null)
{
OnPageBinding(this, null);
}
// Show now results found ?
if (numberOfResults == 0)
{
if (ShowParsingErrors)
{
Exception searchError = SearchHelper.LastSmartSearchError;
if (searchError != null)
{
ShowError(GetString("smartsearch.searcherror") + " " + searchError.Message);
}
}
lblNoResults.Text = NoResultsText;
lblNoResults.Visible = true;
}
}
else
{
Visible = false;
}
// Invoke search completed event
if (OnSearchCompleted != null)
{
OnSearchCompleted(Visible);
}
}
}
///
/// Applies search filter.
///
/// Search condition
/// Search sort
public void ApplyFilter(string searchCondition, string searchSort)
{
FilterSearchCondition += " " + searchCondition;
FilterSearchSort += " " + searchSort;
}
///
/// Adds filter option to url.
///
/// Webpart id
/// Options
public void AddFilterOptionsToUrl(string searchWebpartID, string options)
{
// Do nothing
}
///
/// Loads data.
///
public void LoadData()
{
// Register control for filter
CMSControlsHelper.SetFilter(FilterID, this);
}
#endregion
#region "IUniPageable Members"
///
/// Pager data item object.
///
public object PagerDataItem
{
get;
set;
}
///
/// Pager control.
///
public UniPager UniPagerControl
{
get;
set;
}
///
/// Gets or sets the number of result. Enables proceed "fake" datasets, where number
/// of results in the dataset is not correspondent to the real number of results
/// This property must be equal -1 if should be disabled
///
public int PagerForceNumberOfResults
{
get;
set;
}
///
/// Occurs when the control bind data.
///
public event EventHandler OnPageBinding;
// Do not display warning for not-used event handler required by interface
#pragma warning disable 67
///
/// Occurs when the pager change the page and current mode is postback => reload data
///
public event EventHandler OnPageChanged;
#pragma warning restore 67
///
/// Evokes control databind.
///
public void ReBind()
{
// Do nothing
}
#endregion
}