分类页侧边过滤功能

需求分享 · OneSmile · 于 4年前 发布 · 1566 次阅读

如图所示,分类页面左侧的过滤目前只有价格过滤,其他过滤属性并没有显示像上图那样,查文档并没有找到原因

共收到 8 条回复
OneSmile#14年前 0 个赞

我查了源代码,发现这块在mysql 的情况下并不好处理 如果用mongodb,就又丢弃了小而快并且简单的实际使用需求 考虑目前这样的处理方式可能说更适合大数据高并发的情况下 但是就目前情况而言,并没有这样的硬性要求, 正在考虑是彻底改掉目前这个,还是做一些简单修改满足当前所用

Fecmall#24年前 0 个赞

1.分类排序在后台设置,分类管理-->分类排序管理 , 如图:

2.源码查了,发现不好处理,请粘贴代码说明,show your code,没有代码说明你的观点,就是空谈。

3.默认mysql支持,一点问题没有,安装后没有出来,自己找原因。 去后台查看一下分类排序是否设置了(fecmall-2版本在后台设置)

4.

OneSmile#34年前 0 个赞

@Fecmall #2楼 是我描述错误了 问题是这样的 分类左侧筛选条件这里

默认mysql 下只有 price 但是实际商城运营过程中,可能需要color size 等自定义的属性分类 如果用mongodb ,运营维护成本就上去了,并不适合中小型企业

OneSmile#44年前 0 个赞

@Fecmall #2楼 非常感谢大佬能看到这个问题。 现在手上有实际运营的商城,过程中遇到一些需求和痛点,一些可以直接解决,但是一些涉及到更改低层的一些东西(数据表等),直接是可以搞定的,但是感觉不是那么流畅,和您原本的开发思路对不上,需要个方向

Fecmall#54年前 0 个赞

1.侧栏属性过滤,这个涉及到表字段,fecmall是可以在后台为产品表增加字段,而不是更改数据库

mysql实现增加字段的原理为:序列化数据,存储到某个字段,因此这种是无法进行查询的,对于mysql想实现过滤,需要用EAV模型,magento就是这样实现的,但是过于复杂,eav结构也有很多弱点,有时候某条数据的缺失就会代码致命的错误

mongodb实现增加字段的原理为:mongodb是没有表结构的,可以直接增加字段保存,增加的字段可以进行过滤查询等

2.如果mysql实现这个,你可以自己在产品表里面加字段,然后对这个字段进行过滤查询,因为每个人的这些字段不一样,因此,只能根据自己的情况,对product_flat表添加相应的字段

3.思维别那么局限,一个mongodb,就不适合中小公司了?mongodb并不难, 而且这个数据库很通用,是nosql数据库的代表(用户量上面)

多接触新事物。

OneSmile#64年前 0 个赞
 /**
     * @param $filter_attr | String 需要进行统计的字段名称
     * @propertuy $where | Array  搜索条件。这个需要些mongodb的搜索条件。
     * 得到的是个属性,以及对应的个数。
     * 这个功能是用于前端分类侧栏进行属性过滤。
     * @return
         [
            ['_id' => 'white', 'count' => 3],
            ['_id' => 'multicolor', 'count' => 6],
            ['_id' => 'black', 'count' => 13],
        ]
     */
    public function getFrontCategoryFilter($filter_attr, $where)
    {
        if (empty($where)) {
            return [];
        }
        if (!isset($where['status'])) {
            $where['status'] = $this->getEnableStatus();
        }

        if($filter_attr != 'color'){
            if (!$this->_productModel->hasAttribute($filter_attr)) {
            return [];
            }
        }

        // where条件处理
        if ($categoryId = $where['category']) {
            $productIds = $this->getProductIdsByCategoryId($categoryId);
            unset($where['category']);
            $arr = [];
            $whereArr = [
                'and',
                ['in', 'id', $productIds]
            ];
            foreach ($where as $k=>$v) {
                if($k == 'color'){
                    $whereArr[] = ['like','attr_group_info',$v];
                }else{
                    $whereArr[] = [$k =>$v];
                }

            }
            $where = $whereArr;
        }

        $product_attrs = $this->_productModel->find()
                    ->select('attr_group_info')
                    ->where($where)->asArray()
                    ->all();

        $filter_attr_array = [];

        foreach ($product_attrs as $key => $value) {
            $product_attr = unserialize($value['attr_group_info']);
            if(isset($product_attr['color'])){
                if(isset($filter_attr_array[$product_attr['color']])){
                    $filter_attr_array[$product_attr['color']] += 1;
                }else{
                    $filter_attr_array[$product_attr['color']] = 1;
                }   
            }
        }

        $filter_data = [];
        $filter_data_one = [];
        foreach ($filter_attr_array as $key => $value) {
            $filter_data_one['_id'] = $key;
            $filter_data_one['count'] = $value;
            $filter_data[] = $filter_data_one;
        }

        //echo "<pre>";
        //print_r($filter_attr_array);exit;

        // 总数    
        //$filter_data = $this->_productModel->find()
        //            ->select($filter_attr.' as _id ,   COUNT(*) as count')
        //            ->where($where)
        //            ->groupBy($filter_attr)
        //            ->all();
        
        return $filter_data;
    }

我改了核心services/product/ProductMysqldb.php里面这一块(1095行),在牺牲性能的情况下处理了这样的查询 ,保持了不加数据表不加字段,当然,目前只针对于COLOR 这一个字段做的,根据需求或者会增加其他字段,暂时先这样处理了,大佬看如何?

OneSmile#74年前 0 个赞

@Fecmall #5楼 如楼上,另外,这边要新开模版,我新开一个贴咨询下模版相关的问题

OneSmile#84年前 0 个赞

@Fecmall #5楼 mongodb 不是难不难的问题,而是没有相应的人,我还凑合,但是后期其他人维护都不一定搞定,小公司都是一兼多职,另外服务器也需要安装,维护等等,并不是单纯的增加一个工具,其实这对我来说,都一样,最早还用txt 存过数据。。:bowtie:

哈哈哈哈哈,个人见解

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics