0

如何在 Yii 中将搜索结果过滤为复选框和下拉列表的组合?我有一些类别作为复选框和预算作为从数据库中列出的下拉列表。选中多个复选框并从下拉列表中选择一个值,我如何过滤掉搜索结果..有没有更好的方法?(我的要求就像这个链接一样。http://www.ebay.in/sch/i.html ?_from=R40&_sacat=0&_nkw=pendrives&rt=nc&LH_FS=1 )

4

2 回答 2

1

我建议使用搜索模型。这可能看起来像这样:

class SearchProducts extends CFormModel
{
    public $minPrice;
    public $maxPrice;
    public $categories;

    // Add a public property for each search form element here

    public function rules()
    {
        return array(
            // You should validate your search parameters here
            array('minPrice,maxPrice,categories', 'safe'),
        );
    }

    public function search()
    {
        $criteria = new CDbCriteria;

        if(!empty($this->minPrice))
            $criteria->addCondition('price > '.(int)$this->minPrice);

        if(!empty($this->maxPrice))
            $criteria->addCondition('price < '.(int)$this->maxPrice);

        if(!empty($this->categories))
            $criteria->addInCondition('category_id', $this->categories);

        // Add more conditions for each property here

        return new CActiveDataProvider('Product', array(
            'criteria' => $criteria,
            // more options here, e.g. sorting, pagination, ...
        ));
    }
}

在您的控制器中,您创建一个新的搜索表单实例并像往常一样分配搜索变量:

public function actionProducts()
{
    $searchModel = new ProductSearch();

    if(isset($_POST['ProductSearch']))
        $searchModel->attributes = $_POST['ProductSearch'];

    $this->render('products', array(
        'searchModel' => $searchModel,
    ));
}

最后在您的视图中,您现在可以渲染

  1. 用于$searchModel属性的常规 Yii 表单,它将成为您的搜索过滤器表单
  2. 您设置的ACListView或 a将成为您的搜索结果。CGridViewprovider$searchModel->search()

对于您将使用 checkBoxList 的复选框:

<?php $this->formCheckBoxList($model, 'categories[]', Category::opts()) ?>

注意[]这表明这应该作为数组发布。为方便起见,我通常还在opts()某些模型中实现静态方法,该方法返回id=>name可用于 dropDownList 或 checkBoxList 选项的列表。

这只是基本模式。您可以轻松扩展它以创建真正强大的搜索表单和结果列表。请始终牢记,您应该将所有与搜索相关的数据保存在另一个模型中。

于 2013-04-02T09:06:32.277 回答
0

试试这个扩展:ddautofilter https://bitbucket.org/jwerner/yii-ddautofilter/overview

于 2013-11-02T13:26:44.680 回答