我正在使用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行)