(Resolved) Display number of products by attribute?

This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.
13 years ago
I would like to show the number of products after name of the attribute option (SpecificationAttributeOptionName).

e.g.:

Color
  - Red (29)
  - Green (199)
  - Blue (2)

I'm using version 1.6.

Thanks.
13 years ago
Well I've got one solution, but it's not at all optimal.

ProductSpecificationFilter.ascx.cs


protected void rptFilterByPSO_OnItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                var row = e.Item.DataItem as SpecificationAttributeOptionFilter;
              
                int totalRecords = 0;
                List<int> psoFilterOption = new List<int>();
                psoFilterOption.Add(row.SpecificationAttributeOptionId);
                
                var productCollection = ProductManager.GetAllProducts(this.CategoryId,
                0, 0, false, 0, 9999,
                string.Empty, false, 999, 0, psoFilterOption, ProductSortingEnum.Name, out totalRecords);

              
                var lnkFilter = e.Item.FindControl("lnkFilter") as HyperLink;
                if (lnkFilter != null)
                {
                    string name = row.SpecificationAttributeName.Replace(" ", "");
                    string url = CommonHelper.ModifyQueryString(CommonHelper.GetThisPageUrl(true), name + "=" + row.SpecificationAttributeOptionId, null);
                    url = excludeQueryStringParams(url);
                    lnkFilter.NavigateUrl = url;
                    lnkFilter.Text = row.SpecificationAttributeOptionName + " (" + totalRecords.ToString() + ")";
                }
                
            }
        }
13 years ago
OK, so I had to change a couple of things.. Correct me if anything's (probably) done sloppy. Yeah, stored procedure would be better, but for now...


SqlProductProvider.cs


Add


/// <summary>
        /// Gets number of products by categoryID and attributeoptionId
        /// </summary>
        /// <param name="categoryId">Category identifier</param>
        /// <param name="specificationAttributeOptionID">attribute identifier</param>
        /// <returns>Number of products</returns>
        public override int GetNumberOfProductsByCategoryAndAttribute(int categoryID,
            int specificationAttributeOptionID)
        {
            var result = 0;
            Database db = NopSqlDataHelper.CreateConnection(_sqlConnectionString);

            var sql =  " select count(*) " +
                       " from nop_product p " +
                       " LEFT OUTER JOIN Nop_Product_Category_Mapping pcm on p.productID=pcm.productID " +
                       " LEFT OUTER JOIN Nop_Product_SpecificationAttribute_Mapping psam on p.productID=psam.productID " +
                       " where pcm.categoryId=@categoryID and psam.SpecificationAttributeOptionID=@specificationAttributeOptionID ";
            DbCommand dbCommand = db.GetSqlStringCommand(sql);
          

            db.AddInParameter(dbCommand, "categoryID", DbType.Int32, categoryID);
            db.AddInParameter(dbCommand, "specificationAttributeOptionID", DbType.Int32, specificationAttributeOptionID);
            result = (int)db.ExecuteScalar(dbCommand);
          
            return result;
        }


DBProductProvider

Add


/// <summary>
        /// Gets number of products by categoryID and attributeoptionId
        /// </summary>
        /// <param name="categoryId">Category identifier</param>
        /// <param name="specificationAttributeOptionID">attribute identifier</param>
        public abstract int GetNumberOfProductsByCategoryAndAttribute(int categoryID, int specificationAttributeOptionID);

        #endregion


ProductManager.cs

Add

        /// <summary>
        /// Gets number of products by categoryID and attributeoptionId
        /// </summary>
        /// <param name="categoryId">Category identifier</param>
        /// <param name="specificationAttributeOptionID">attribute identifier</param>
        /// <returns>number of products for category and attribute</returns>
        public static int GetNumberOfProductsByCategoryAndAttribute(int categoryID, int attributeOptionId)
        {
            return (int)DBProviderManager<DBProductProvider>.Provider.GetNumberOfProductsByCategoryAndAttribute(categoryID, attributeOptionId);
        }
        #endregion


ProductSpecificationFilter.ascx.cs

Modifiy


protected void rptFilterByPSO_OnItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                var row = e.Item.DataItem as SpecificationAttributeOptionFilter;
              
                int totalRecords = 0;
              
                totalRecords = ProductManager.GetNumberOfProductsByCategoryAndAttribute(this.CategoryId, row.SpecificationAttributeOptionId);

                var lnkFilter = e.Item.FindControl("lnkFilter") as HyperLink;
                if (lnkFilter != null)
                {
                    string name = row.SpecificationAttributeName.Replace(" ", "");
                    string url = CommonHelper.ModifyQueryString(CommonHelper.GetThisPageUrl(true), name + "=" + row.SpecificationAttributeOptionId, null);
                    url = excludeQueryStringParams(url);
                    lnkFilter.NavigateUrl = url;
                    lnkFilter.Text = row.SpecificationAttributeOptionName + " (" + totalRecords.ToString() + ")";
                }
                
            }
        }
12 years ago
TheMe wrote:


SqlProductProvider.cs


Add


/// <summary>
        /// Gets number of products by categoryID and attributeoptionId
        /// </summary>
        /// <param name="categoryId">Category identifier</param>
        /// <param name="specificationAttributeOptionID">attribute identifier</param>
        /// <returns>Number of products</returns>
        public override int GetNumberOfProductsByCategoryAndAttribute(int categoryID,
            int specificationAttributeOptionID)
        {
            var result = 0;
            Database db = NopSqlDataHelper.CreateConnection(_sqlConnectionString);

            var sql =  " select count(*) " +
                       " from nop_product p " +
                       " LEFT OUTER JOIN Nop_Product_Category_Mapping pcm on p.productID=pcm.productID " +
                       " LEFT OUTER JOIN Nop_Product_SpecificationAttribute_Mapping psam on p.productID=psam.productID " +
                       " where pcm.categoryId=@categoryID and psam.SpecificationAttributeOptionID=@specificationAttributeOptionID ";
            DbCommand dbCommand = db.GetSqlStringCommand(sql);
          

            db.AddInParameter(dbCommand, "categoryID", DbType.Int32, categoryID);
            db.AddInParameter(dbCommand, "specificationAttributeOptionID", DbType.Int32, specificationAttributeOptionID);
            result = (int)db.ExecuteScalar(dbCommand);
          
            return result;
        }





Well I noticed in some cases the count is doubled. So the easy way out is to change the sql select line to

select count(distinct p.productID)
....
This topic was automatically closed 365 days after the last reply. New replies are no longer allowed.