opencart:如何将exclude_categories过滤器添加到产品/类别

时间:2016-05-06 10:24:56

标签: mysql opencart

我正在使用opencart系统,我想添加exclude_categories过滤器。我已经完成了PHP方面的工作,需要帮​​助修复SQL。

    if (!empty($data['filter_sub_category']) && !empty($data['filter_exclude_categories'])) {

        $implode = array();

        $exclude_categories = explode(',', $data['filter_exclude_categories']);

        foreach ($exclude_categories as $cat_id) {
            $implode[] = (int)$cat_id;
        }
        $sql .= " AND cp.path_id NOT IN (" . implode(',', $implode) . ")";  
    }

对于不熟悉oc的人,category_path表看起来像这样。


     CATEGORY_ID      path_id     水平
     1      1      0
     2      1      0
     2      2      1
     3      1      0
     3      2      1
     3      3      2

让我们给这些类别命名。

category_id 1 == 'products'

category_id 2 == 'products->mens'

category_id 3 == 'products->mens->footwear'

当给出category_id时,将返回此类别及其子类别的所有产品。

这可以通过使用path_id而不是category_id来实现。

$sql .= " AND cp.path_id = '" . (int)$data['filter_category_id'] . "'"; 

如果$data['filter_category_id'] == 1,则用于获取产品的category_id为(1,2,3)

现在,如果我想要从mens(2)类别中排除所有产品,那么应该用于获取产品的唯一类别ID是(1),但是相同的结果显示我是否排除了某个类别。

我认为是因为category_id仍然在不同的path_id下返回。


     CATEGORY_ID      path_id     水平
     1      1      0
     2      1      0
     2      2      1 //< - 行已删除
     3      1      0
     3      2      1 //< - 行已删除
     3      3      2

添加

$sql .= " AND cp.category_id NOT IN (" . implode(',', $implode) . ")";  

会导致


     CATEGORY_ID      path_id     水平
     1      1      0
     2      1      0 //< - 行已删除
     2      2      1 //< - 行已删除
     3      1      0
     3      2      1 //< - 行已删除
     3      3      2

但这会留下鞋类(category_id = 3)

任何想法?

以下是我正在使用catalog/model/catalog/product.php#L99的内容的来源,我已经为我插入代码的地方添加了书签(第99行)

0 个答案:

没有答案