using System; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.Controls; using CMS.Ecommerce; using CMS.ExtendedControls; using CMS.GlobalHelper; using CMS.SettingsProvider; using CMS.SiteProvider; public partial class CMSModules_Ecommerce_Controls_Filters_ProductFilter : CMSAbstractDataFilterControl { #region "Variables" private bool mShowPublicStatusFilter = true; private bool mShowManufacturerFilter = true; private bool mShowPagingFilter = true; private bool mShowStockFilter = true; private bool mShowSortingFilter = true; private bool? mUsingGlobalObjects = null; protected CMSButton button; #endregion #region "Properties" /// /// Show public status filter. /// public bool ShowPublicStatusFilter { get { return mShowPublicStatusFilter; } set { mShowPublicStatusFilter = value; } } /// /// Show manufacturer filter. /// public bool ShowManufacturerFilter { get { return mShowManufacturerFilter; } set { mShowManufacturerFilter = value; } } /// /// Show paging filter. /// public bool ShowPagingFilter { get { return mShowPagingFilter; } set { mShowPagingFilter = value; } } /// /// Show stock filter. /// public bool ShowStockFilter { get { return mShowStockFilter; } set { mShowStockFilter = value; } } /// /// Show sorting filter. /// public bool ShowSortingFilter { get { return mShowSortingFilter; } set { mShowSortingFilter = value; } } /// /// Show search filter. /// public bool ShowSearchFilter { get; set; } /// /// Paging filter options (values separated by comma). /// public string PagingOptions { get; set; } /// /// Filter by query parameters. /// public bool FilterByQuery { get; set; } /// /// Name of the site for which selectors are to be loaded. Uses current site name when empty or null. /// public override string SiteName { get { return base.SiteName; } set { base.SiteName = DataHelper.GetNotEmpty(value, CMSContext.CurrentSiteName); int siteId = SiteInfoProvider.GetSiteID(SiteName); // Clear flag mUsingGlobalObjects = null; // Propagate siteId to selectors manufacturerSelector.SiteID = siteId; statusSelector.SiteID = siteId; manufacturerSelector.DisplayGlobalItems = UsingGlobalObjects; statusSelector.DisplayGlobalItems = UsingGlobalObjects; } } /// /// Returns true if site given by SiteID uses global products. /// protected bool UsingGlobalObjects { get { // Unknown yet if (!mUsingGlobalObjects.HasValue) { mUsingGlobalObjects = false; // Try to figure out from settings string siteName = SiteName; if (string.IsNullOrEmpty(siteName)) { siteName = CMSContext.CurrentSiteName; } mUsingGlobalObjects = ECommerceSettings.AllowGlobalProducts(siteName); } return mUsingGlobalObjects.Value; } } #endregion protected void btnFilter_Click(object sender, EventArgs e) { if (FilterByQuery) { // Handle all query parameters string url = URLHelper.RawUrl; url = URLHelper.RemoveParameterFromUrl(url, "statusid"); if (Convert.ToInt32(statusSelector.Value) > 0) { url = URLHelper.AddParameterToUrl(url, "statusid", statusSelector.Value.ToString()); } url = URLHelper.RemoveParameterFromUrl(url, "manufacturerid"); if (Convert.ToInt32(manufacturerSelector.Value) > 0) { url = URLHelper.AddParameterToUrl(url, "manufacturerid", manufacturerSelector.Value.ToString()); } url = URLHelper.RemoveParameterFromUrl(url, "available"); if (chkStock.Checked) { url = URLHelper.AddParameterToUrl(url, "available", "1"); } url = URLHelper.RemoveParameterFromUrl(url, "pagesize"); if (drpPaging.SelectedValue != string.Empty) { url = URLHelper.AddParameterToUrl(url, "pagesize", drpPaging.SelectedValue); } url = URLHelper.RemoveParameterFromUrl(url, "order"); if (drpSort.SelectedValue != string.Empty) { url = URLHelper.AddParameterToUrl(url, "order", drpSort.SelectedValue); } url = URLHelper.RemoveParameterFromUrl(url, "search"); if (!string.IsNullOrEmpty(txtSearch.Text)) { url = URLHelper.AddParameterToUrl(url, "search", txtSearch.Text); } // Redirect with new query parameters URLHelper.Redirect(url); } } private void InitControls() { lblManufacturer.Text = ResHelper.GetString("ecommerce.filter.product.manufacturer"); manufacturerSelector.InnerControl.CssClass = "DropDownList"; lblStatus.Text = ResHelper.GetString("ecommerce.filter.product.status"); statusSelector.InnerControl.CssClass = "DropDownList"; lblStatus.Text = ResHelper.GetString("ecommerce.filter.product.status"); statusSelector.InnerControl.CssClass = "DropDownList"; chkStock.Text = ResHelper.GetString("ecommerce.filter.product.stock"); lblSort.Text = ResHelper.GetString("ecommerce.filter.product.sort"); lblSearch.Text = ResHelper.GetString("ecommerce.filter.product.search"); } private void SetControlsVisibility() { // Show/Hide manufacturer filter lblManufacturer.Visible = manufacturerSelector.Visible = ShowManufacturerFilter; // Show/Hide public status filter lblStatus.Visible = statusSelector.Visible = ShowPublicStatusFilter; // Show/Hide stock filter chkStock.Visible = ShowStockFilter; // Show/Hide paging filter lblPaging.Visible = drpPaging.Visible = ShowPagingFilter; // Show/Hide sorting filter lblSort.Visible = drpSort.Visible = ShowSortingFilter; // Show/Hide search filter lblSearch.Visible = txtSearch.Visible = ShowSearchFilter; } /// /// Setups the control. /// private void SetupControl() { if (!StopProcessing) { // Initialize labels InitControls(); // Initialize visibility of filter fields SetControlsVisibility(); // Dispsay filter rows bool firstRowVisible = (ShowSearchFilter || ShowPublicStatusFilter || ShowManufacturerFilter || ShowStockFilter); bool secondRowVisible = (ShowPagingFilter || ShowSortingFilter); plcFirstRow.Visible = firstRowVisible; plcFirstButton.Visible = (firstRowVisible && !secondRowVisible); plcSecondRow.Visible = secondRowVisible; plcSecButton.Visible = secondRowVisible; // Filter button button = secondRowVisible ? btnSecFilter : btnFirstFilter; button.Text = ResHelper.GetString("ecommerce.filter.product.filter"); pnlContainer.DefaultButton = button.ID; if (!RequestHelper.IsPostBack()) { // Initialize dropdowns drpSort.Items.Add(new ListItem(ResHelper.GetString("ecommerce.filter.product.nameasc"), "nameasc")); drpSort.Items.Add(new ListItem(ResHelper.GetString("ecommerce.filter.product.namedesc"), "namedesc")); drpSort.Items.Add(new ListItem(ResHelper.GetString("ecommerce.filter.product.priceasc"), "priceasc")); drpSort.Items.Add(new ListItem(ResHelper.GetString("ecommerce.filter.product.pricedesc"), "pricedesc")); drpPaging.Items.Add(new ListItem(ResHelper.GetString("General.SelectAll"), "0")); if ((PagingOptions != null) && (PagingOptions != string.Empty)) { // Parse PagingOptions string and fill dropdown string[] pageOptions = PagingOptions.Split(','); foreach (string pageOption in pageOptions) { if (pageOption.Trim() != string.Empty) { drpPaging.Items.Add(new ListItem(pageOption.Trim())); } } } } // Hide paging if (drpPaging.Items.Count > 0) { drpPaging.Visible = false; lblPaging.Visible = false; } // Section 508 validation lblManufacturer.AssociatedControlClientID = manufacturerSelector.ValueElementID; lblStatus.AssociatedControlClientID = statusSelector.ValueElementID; lblSearch.AssociatedControlClientID = txtSearch.ClientID; // Get filter setings from query parameter values if (FilterByQuery) { GetFilter(); } } else { statusSelector.StopProcessing = true; manufacturerSelector.StopProcessing = true; } } private void SetFilter() { string where = string.Empty; int paging = 0; string order = null; if (FilterByQuery) { // Collect values from query string int status = QueryHelper.GetInteger("statusid", 0); int manufacturer = QueryHelper.GetInteger("manufacturerid", 0); bool stock = QueryHelper.GetBoolean("available", false); paging = QueryHelper.GetInteger("pagesize", 12); order = QueryHelper.GetString("order", string.Empty); string search = QueryHelper.GetString("search", string.Empty); if (status > 0) { // Add public status condition where = SqlHelperClass.AddWhereCondition(where, "SKUPublicStatusID = " + status); } if (manufacturer > 0) { // Add manufacturer condition where = SqlHelperClass.AddWhereCondition(where, "SKUManufacturerID = " + manufacturer); } if (stock) { // Add available items condition where = SqlHelperClass.AddWhereCondition(where, "SKUAvailableItems > 0"); } if (!string.IsNullOrEmpty(search)) { where = SqlHelperClass.AddWhereCondition(where, String.Format("SKUName LIKE N'%{0}%'", SqlHelperClass.GetSafeQueryString(search, false))); } // Prepare order by clause switch (order.ToLowerCSafe()) { case "nameasc": order = "SKUName"; break; case "namedesc": order = "SKUName DESC"; break; case "priceasc": order = "SKUPrice"; break; case "pricedesc": order = "SKUPrice DESC"; break; default: order = string.Empty; break; } } else { // Build where condition according to dropdowns setings if (Convert.ToInt32(statusSelector.Value) > 0) { where = SqlHelperClass.AddWhereCondition(where, "SKUPublicStatusID = " + statusSelector.Value); } if (Convert.ToInt32(manufacturerSelector.Value) > 0) { where = SqlHelperClass.AddWhereCondition(where, "SKUManufacturerID = " + manufacturerSelector.Value); } if (chkStock.Checked) { where = SqlHelperClass.AddWhereCondition(where, "SKUAvailableItems > 0"); } if (!string.IsNullOrEmpty(txtSearch.Text)) { where = SqlHelperClass.AddWhereCondition(where, String.Format("SKUName LIKE N'%{0}%'", SqlHelperClass.GetSafeQueryString(txtSearch.Text, false))); } // Process drpSort dropdown if (drpPaging.SelectedValue != string.Empty) { // If paging not visible, set -1 and dont change page settings at all paging = drpPaging.Visible ? ValidationHelper.GetInteger(drpPaging.SelectedValue, 12) : -1; } // Process drpSort dropdown if (drpSort.Visible && (drpSort.SelectedValue != string.Empty)) { switch (drpSort.SelectedValue.ToLowerCSafe()) { case "nameasc": order = "SKUName"; break; case "namedesc": order = "SKUName DESC"; break; case "priceasc": order = "SKUPrice"; break; case "pricedesc": order = "SKUPrice DESC"; break; } } } if (where != string.Empty) { // Set where condition WhereCondition = where; } if (order != string.Empty) { // Set orderBy condition OrderBy = order; } if (paging >= 0) { // Set paging PageSize = paging; } // Filter changed event RaiseOnFilterChanged(); } private void GetFilter() { int status = QueryHelper.GetInteger("statusid", 0); int manufacturer = QueryHelper.GetInteger("manufacturerid", 0); bool stock = QueryHelper.GetBoolean("available", false); int paging = QueryHelper.GetInteger("pagesize", 12); string order = QueryHelper.GetString("order", string.Empty); string search = QueryHelper.GetString("search", string.Empty); // Set internal status if in query if (status > 0) { statusSelector.Value = status; } // Set manufacturer if in query if (manufacturer > 0) { manufacturerSelector.Value = manufacturer; } // Set search if in query if (search != string.Empty) { txtSearch.Text = search; } // Set only in stock if in query if (stock) { chkStock.Checked = true; } // Set paging if in query if (paging >= 0) { try { drpPaging.SelectedValue = paging.ToString(); } catch { } } // Set order if in query if (order != string.Empty) { try { drpSort.SelectedValue = order; } catch { } } } /// /// Child control creation. /// protected override void CreateChildControls() { base.CreateChildControls(); } protected override void OnInit(EventArgs e) { // Init controls SetupControl(); base.OnInit(e); } protected override void OnLoad(EventArgs e) { if (!StopProcessing) { // Set filter only after postback or in case the filter is in a query mode if (RequestHelper.IsPostBack() || FilterByQuery) { // Apply the filter to the displayed data SetFilter(); } } else { statusSelector.StopProcessing = true; manufacturerSelector.StopProcessing = true; } base.OnLoad(e); } }