HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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;
            }
        }
    }
}