dvizh / yii2-filter
yii2-filter 为您的模型添加选项和过滤器
dev-master
2018-02-05 13:07 UTC
Requires
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-20 21:57:47 UTC
README
此模块允许在后台为任何模型添加选项,并可以从外部根据选定的选项过滤搜索结果(包括ajax)。
功能
- 添加过滤器(即选项)
- 为不同的模型分配不同的过滤器(根据字段值)
- 管理选项的选项
- 根据过滤器值过滤 ActiveQuery
- 一组小工具
安装
执行命令
php composer require dvizh/yii2-filter "@dev"
或者在 composer.json 中添加
"dvizh/yii2-filter": "@dev",
然后执行
php composer update
接下来,迁移数据库
php yii migrate --migrationPath=vendor/dvizh/yii2-filter/src/migrations
连接和配置
在应用程序配置文件中添加模块 filter,并对其进行配置
'modules' => [ //... 'filter' => [ 'class' => 'dvizh\filter\Module', 'relationFieldName' => 'category_id', //Наименование поля, по значению которого будут привязыватья опции //callback функция, которая возвращает варианты relationFieldName 'relationFieldValues' => function() { //Пример с деревом: $return = []; $categories = \common\models\Category::find()->all(); foreach($categories as $category) { if(empty($category->parent_id)) { $return[] = $category; foreach($categories as $category2) { if($category2->parent_id == $category->id) { $category2->name = ' --- '.$category2->name; $return[] = $category2; } } } } return \yii\helpers\ArrayHelper::map($return, 'id', 'name'); }, ], //... ]
管理过滤器: ?r=filter/filter
为与过滤器一起工作的模型添加行为
function behaviors() { return [ 'filter' => [ 'class' => 'dvizh\filter\behaviors\AttachFilterValues', ], ]; }
为了能够过滤 Find 的结果,我们需要在模型中替换 Query
public static function Find() { $return = new ProductQuery(get_called_class()); return $return; }
在 ProductQuery 中应该有这种行为
function behaviors() { return [ 'filter' => [ 'class' => 'dvizh\filter\behaviors\Filtered', ], ]; }
使用
从具有 AttachFilterValues 行为的模型中获取选项及其值
<?php if($filters = $model->getOptions()) {?> <?php foreach($filters as $filter_name => $filter_values) { ?> <p> <strong><?=$filter_name;?></strong>: <?=implode(', ', $filter_values);?> </p> <?php } ?> <?php } ?>
根据代码获取一个选项的值
<?=implode(', ', $model->getOption('code'));?>
为了考虑 FilterPanel 发送的数据来过滤搜索结果,请添加 filtered 调用
$productsFind = Product::find()->where(['category_id' => 11]); if(Yii::$app->request->get('filter')) { $productsFind = $productsFind->filtered(); } $products = $productsFind->all();
根据选项值选择所有记录
$productsFind = Product::find()->option('power', 100)->all(); //Все записи с power=100 $productsFind = Product::find()->option('power', 100, '>')->all(); //Все записи с power>100 $productsFind = Product::find()->option('power', 100, '<')->all(); //Все записи с power<100
小工具
选择模型 $model 的选项值块(如果通过 relationFieldName 字段与该模型关联了一些选项,则将显示选项)
<?=\dvizh\filter\widgets\Choice::widget(['model' => $model]);?>
输出带有过滤器的块(复选框、单选按钮等)。传递与 relationFieldName 字段关联的过滤器的标识符(通常是分类 ID)
<?=\dvizh\filter\widgets\FilterPanel::widget(['itemId' => $model->id]);?>
- itemId - relationFieldName 的值
为了使过滤生效,需要将 AQ 添加到调用链中
if(Yii::$app->request->get('filter')) { $products = $products->filtered(); }
为了使 FilterPanel 通过ajax工作,需要按以下方式配置它
<?=\dvizh\filter\widgets\FilterPanel::widget(['itemId' => $model->id, 'findModel' => $query, 'ajaxLoad' => true, 'resultHtmlSelector' => '#productsList']);
其中 resultHtmlSelector 是显示产品的页面上元素的 CSS 选择器,findModel 是 AQ 产品实例。