0

我对 CakePHP 和面向对象编程比较陌生。我以前在 CakePHP 中构建过应用程序,但从来没有达到这个程度,因此我寻求帮助的原因。

我有一个大型产品管理数据库,用户需要能够设置过滤条件以找到最接近的产品匹配项。

products 表包含与各个表相关的 category_id、manufacturer_id、type_id、status_id。

我有一个带有每个过滤器下拉框的侧边栏,并希望所有过滤器一起工作,例如,如果选择了制造商和产品类型,则显示这些过滤结果,并将状态和类别下拉列表更改为仅包含来自已经过滤的结果。

在过去,我通过使用基于用户输入的动态查询设置条件来实现这一点,每次应用过滤器时都附加 where 子句。

到目前为止,我只能使用单独过滤的结果

$this->Product->recursive = 0;
    $mid = (isset($this->params['named']['mid'])) ? $this->params['named']['mid'] : '';
    if(!empty($mid)){
        $this->paginate = array(
            'conditions' => array('Product.manufacturer_id' => $mid),
            'limit' => 10
        );
    }
    $products = $this->paginate('Product');
    $this->set(compact('products'));

其中“mid”是制造商 ID,这是在 url 中手动输入“mid”

如果用户设置 category_id、manufacturer_id、type_id、status_id 或任何组合,我如何获得累积过滤结果?我将使用哪些查询来重新填充下拉列表?

(最终我将使用 ajax,但现在假设我有 4 个带有提交按钮的下拉框)

4

1 回答 1

1

漫长的道路将是:

var $conditions = array();

if (isset($this->params['named']['mid']) && !empty($this->params['named']['mid'])){
   $conditions['Product.manufacturer_id'] = $this->params['named']['mid']);
}
if (isset($this->params['named']['catid']) && !empty($this->params['named']['catid'])){
   $conditions['Product.category_id'] = $this->params['named']['catid']);
}
if (isset($this->params['named']['statid']) && !empty($this->params['named']['statid'])){
   $conditions['Product.status_id'] = $this->params['named']['statid']);
}

$this->paginate['conditions'] = $conditions;
$this->paginate['limit'] = '10';
$this->set('products', $this->paginate('Product'));

一旦掌握了窍门,就可以将所有检查放入一个循环中。

于 2013-02-10T13:21:50.577 回答