如何将搜索结果过滤为Yii中的复选框和下拉列表的组合?我有一些类别作为复选框和预算作为从数据库列出的下拉列表。选中多个复选框并从下拉列表中选择一个值,如何过滤掉搜索结果..有没有更好的方法? (我的要求就像在这个链接中。http://www.ebay.in/sch/i.html?_from=R40&_sacat=0&_nkw=pendrives&rt=nc&LH_FS=1)
答案 0 :(得分: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,
));
}
最后在您的视图中,您现在可以呈现
$searchModel
属性的常规Yii表单,将成为您的搜索过滤器表单CListView
或CGridView
,您将provider
设置为$searchModel->search()
,这将是您的搜索结果。对于复选框,您将使用checkBoxList:
<?php $this->formCheckBoxList($model, 'categories[]', Category::opts()) ?>
请注意[]
,表示应将其作为数组发布。为方便起见,我通常还在某些模型中实现静态opts()
方法,该方法返回可用于dropDownList或checkBoxList选项的id=>name
列表。
这只是基本模式。您可以轻松扩展它以创建非常强大的搜索表单和结果列表。请务必记住,您应该将所有与搜索相关的数据保存在其他模型中。
答案 1 :(得分:0)
尝试此扩展程序:ddautofilter https://bitbucket.org/jwerner/yii-ddautofilter/overview