1

我正在使用 CakeDC 搜索插件。我有一个简单的购物车,里面的产品都属于子类别。例如,食物的子类别可能是水果、蔬菜、肉类等,因此梨只属于水果类别。

所以我有一个包含所有类别的下拉列表,如果我选择父类别食物,则不会显示任何项目,如果我选择水果,则会显示水果。

我想要的行为是最初只显示父类别,所以食物、体育用品等,然后当他们选择食物时,我希望发生一些不同的事情:

1) 显示与该类别相关的所有产品以及所有子类别

2) 显示另一个包含水果、蔬菜、肉类等的下拉菜单,以便进一步过滤

3)如果这个子类别有子类别,也显示他们的孩子,直到过滤更多。

我现在的代码只允许我找到与某个类别的直接关联

这是我的模型 Product.php 中的代码

 public $actsAs = array('Search.Searchable');

    public $filterArgs = array(
        array('name' => 'cid', 'field' => 'category_id', 'type' => 'value', 'method' => 'query', 'method' => 'query', 'allowEmpty' => true);


    public function filterCat($data, $field = null) {
        if (empty($data['cid'])) {
            return array();
        }
        $cat = $data['cid'];
        return array(
            'OR' => array(
                $this->alias . '.category_id' => $cat,
                ));
    }

我已经到处寻找解决方案,我认为这很简单,但没有找到任何东西。非常感谢任何帮助!

4

1 回答 1

3

我可以通过修改 filterCat() 函数来实现我想要的功能,如下所示。

public function filterCat($data, $field = null) {
    if (empty($data['cid'])) {
        return array();
    }
    $cat[] = $data['cid'];
    // Get child categories
    $children = $this->Category->children($cat['0'],false,'id');
    // extract the ids of the child categories
    $children = Hash::extract($children, '{n}.Category.id');
    // if no child categories, return requested category id
    if(empty($children)){
        return array(                
           $this->alias . '.category_id' => $cat);
    }else{
    // else merge array of child category ids with parent category id
    // and create SQL string to match the list of category ids
        $children = array_merge($cat,$children);
        return array(                
            $this->alias . '.category_id IN ' => $children);    
    }
}

该函数查找子类别,如果没有子类别,则返回带有类别 ID 的搜索字符串。如果有子类别,它会在列表中返回包含父类别 ID 和子类别 ID 的搜索字符串。

我知道这是一个老问题,但希望这可以帮助其他人。

CakePHP 2.2.3 版和 CakeDC 搜索插件 2.1 版

于 2014-07-29T21:35:01.253 回答