File: D:/HostingSpaces/TDijk1/erp-apps.eu/wwwroot/CMSWebParts/Pux/Search/AsyncSearch.ascx.cs
using CMS.DataEngine;
using CMS.DocumentEngine;
using CMS.Helpers;
using CMS.PortalControls;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class CMSWebParts_Pux_Product_AsyncSearch : CMSAbstractWebPart
{
public string PageType
{
get
{
return DataHelper.GetNotEmpty(ValidationHelper.GetString(GetValue("PageType"), "CMS.MenuItem"), "CMS.MenuItem");
}
set
{
SetValue("PageType", value);
}
}
public string Path
{
get
{
return DataHelper.GetNotEmpty(ValidationHelper.GetString(GetValue("Path"), "/%"), "/%");
}
set
{
SetValue("Path", value);
}
}
public int NestingLevel
{
get
{
return ValidationHelper.GetInteger(GetValue("NestingLevel"), -1);
}
set
{
SetValue("NestingLevel", value);
}
}
public string TransformationName
{
get
{
return ValidationHelper.GetString(GetValue("TransformationName"), "");
}
set
{
SetValue("TransformationName", value);
}
}
public int TopN
{
get
{
return ValidationHelper.GetInteger(GetValue("TopN"), 0);
}
set
{
SetValue("TopN", value);
}
}
public string Columns
{
get
{
return ValidationHelper.GetString(GetValue("Columns"), "");
}
set
{
SetValue("Columns", value);
}
}
public string SearchColumns
{
get
{
return ValidationHelper.GetString(GetValue("SearchColumns"), "DocumentName");
}
set
{
SetValue("SearchColumns", value);
}
}
public string OrderBy
{
get
{
return ValidationHelper.GetString(GetValue("OrderBy"), "");
}
set
{
SetValue("OrderBy", value);
}
}
public bool IgnoreDiacritics
{
get
{
return ValidationHelper.GetBoolean(GetValue("IgnoreDiacritics"), true);
}
set
{
SetValue("IgnoreDiacritics", value);
}
}
public string CategoriesPageType
{
get
{
return DataHelper.GetNotEmpty(ValidationHelper.GetString(GetValue("CategoriesPageType"), "CMS.MenuItem"), "CMS.MenuItem");
}
set
{
SetValue("CategoriesPageType", value);
}
}
public string CategoriesPath
{
get
{
return DataHelper.GetNotEmpty(ValidationHelper.GetString(GetValue("CategoriesPath"), "/%"), "/%");
}
set
{
SetValue("CategoriesPath", value);
}
}
public string CategoriesTransformationName
{
get
{
return ValidationHelper.GetString(GetValue("CategoriesTransformationName"), "");
}
set
{
SetValue("CategoriesTransformationName", value);
}
}
private int _resultsCount = -1;
public int ResultsCount
{
get
{
return _resultsCount;
}
set
{
_resultsCount = value;
}
}
private int _resultsCategoriesCount = -1;
public int ResultsCategoriesCount
{
get
{
return _resultsCategoriesCount;
}
set
{
_resultsCategoriesCount = value;
}
}
public int RepaterCacheMinutes
{
get
{
return ValidationHelper.GetInteger(GetValue("RepaterCacheMinutes"), 0);
}
}
static string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder();
foreach (var c in normalizedString)
{
var unicodeCategory = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != System.Globalization.UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}
protected void InitProducts(string query)
{
WhereCondition where = new WhereCondition();
foreach (string s in query.Split(' '))
{
string word = s.Trim();
if (!String.IsNullOrEmpty(word) && word.Length >= 1)
{
WhereCondition whereWord = new WhereCondition();
foreach (string searchColumn in SearchColumns.Split(';'))
{
WhereCondition whereColumn = new WhereCondition().WhereLike(searchColumn, "%" + word + "%").Or();
if (IgnoreDiacritics)
{
whereColumn.WhereLike("CAST([" + searchColumn + "] as varchar(max)) collate SQL_Latin1_General_CP1253_CI_AI", "%" + RemoveDiacritics(word) + "%");
}
whereWord.Where(whereColumn);
whereWord.Or();
}
where.Where(whereWord);
}
}
lblDebug.Text = where.ToString(true);
DocumentQuery products = DocumentHelper.GetDocuments(PageType)
.Path(Path.Replace("%", ""), PathTypeEnum.Children)
.Where(where.ToString(true))
.WhereEquals("SKUEnabled", 1)
.TopN(TopN)
.FilterDuplicates(true)
.Columns("DocumentName", "DocumentID", "NodeAliasPath", "NodeAlias")
.CombineWithDefaultCulture(true);
rpt.EnablePaging = false;
rpt.HideControlForZeroRows = true;
rpt.TransformationName = TransformationName;
rpt.ClassNames = PageType;
rpt.Path = Path;
rpt.TopN = TopN;
rpt.FilterOutDuplicates = true;
rpt.CultureCode = CurrentDocument.DocumentCulture;
rpt.WhereCondition = where.ToString(true);
rpt.CacheItemName = CurrentSiteName + ".QuickSearch.Product.Query" + query;
rpt.CacheMinutes = 5;
ResultsCount = products.Count;
}
protected void InitCategories(string query)
{
WhereCondition whereCategories = new WhereCondition();
foreach (string s in query.Split(' '))
{
string word = s.Trim();
if (!String.IsNullOrEmpty(word) && word.Length >= 2)
{
WhereCondition columnWhere = new WhereCondition()
.WhereLike("DocumentName", "%" + word + "%")
.Or();
if (IgnoreDiacritics)
{
columnWhere.WhereLike("CAST([DocumentName] as varchar(max)) collate SQL_Latin1_General_CP1253_CI_AI", "%" + RemoveDiacritics(word) + "%");
}
whereCategories.Where(columnWhere);
}
}
WhereCondition categoriesPageTypesWhere = new WhereCondition();
foreach (var categoryPageType in CategoriesPageType.Trim().Split(';'))
{
categoriesPageTypesWhere.WhereEquals("ClassName", categoryPageType).Or();
}
whereCategories.And().Where(categoriesPageTypesWhere);
MultiDocumentQuery categories = DocumentHelper.GetDocuments()
.Path(CategoriesPath.Replace("%", ""), PathTypeEnum.Children)
.Where(whereCategories)
.TopN(8)
.Columns("DocumentName", "DocumentID", "NodeAliasPath", "NodeAlias")
.CombineWithDefaultCulture(true)
.OrderBy("ClassName", "DocumentName");
ResultsCategoriesCount = categories.Count;
lblCategoryTitle.Visible = ResultsCategoriesCount > 0;
rptCategories.DataSource = categories;
rptCategories.CacheItemName = CurrentSiteName + ".AsyncSearch.Category.Query" + query;
rptCategories.CacheMinutes = RepaterCacheMinutes;
rptCategories.TransformationName = CategoriesTransformationName;
rptCategories.DataBind();
lblCategoryTitle.ResourceString = ResHelper.GetString(CurrentSiteName + ".QuickSearch.CategoryTitle");
}
protected void Page_Init(object sender, EventArgs e)
{
string query = SqlHelper.EscapeLikeText(SqlHelper.EscapeQuotes(HttpUtility.UrlDecode(QueryHelper.GetString("q", String.Empty), System.Text.Encoding.Default)));
if (String.IsNullOrEmpty(query))
{
query = SqlHelper.EscapeLikeText(SqlHelper.EscapeQuotes(Uri.UnescapeDataString(QueryHelper.GetString("searchtext", String.Empty))));
pnlQuickSearchProducts.CssClass = "full-text-search-products products-container";
}
InitProducts(query);
InitCategories(query);
}
public bool IsAjaxRequest(HttpRequest request)
{
if (request == null)
{
throw new ArgumentNullException("request");
}
return (request["X-Requested-With"] == "XMLHttpRequest") || ((request.Headers != null) && (request.Headers["X-Requested-With"] == "XMLHttpRequest"));
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
lblNoData.ResourceString = CurrentSiteName + ".QuickSearch.NoData";
if (IsAjaxRequest(Request))
{
if (Request.HttpMethod == "GET")
{
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);
if (ResultsCount + ResultsCategoriesCount > 0)
{
pnlNoData.Visible = false;
pnlData.Visible = true;
// render repeater
rpt.PagerControl.Visible = false;
//rpt.RenderControl(writer);
pnlData.RenderControl(writer);
}
else
{
pnlData.Visible = false;
pnlNoData.Visible = true;
pnlNoData.RenderControl(writer);
}
// create JSON to be returned to the client
JObject o = new JObject();
// number of pages
o["TotalResults"] = ResultsCount + ResultsCategoriesCount > 0 ? ResultsCount + ResultsCategoriesCount : 0;
o["Counter"] = QueryHelper.GetInteger("counter", 0);
// search results for current page
o["Data"] = sb.ToString();
// send response
Response.Write(o.ToString());
RequestHelper.EndResponse();
}
}
else
{
if (ResultsCount + ResultsCategoriesCount < 0)
{
pnlNoData.Visible = true;
pnlData.Visible = false;
}
else
{
pnlNoData.Visible = false;
pnlData.Visible = true;
}
}
}
}