pistol88 / yii2-filter
yii2-filter 为您的模型添加选项和过滤器
Requires
Requires (Dev)
This package is auto-updated.
Last update: 2024-08-27 21:40:32 UTC
README
从 2017 年 4 月 24 日起,模块的开发在这里进行:[dvizh/yii2-filter](https://github.com/dvizh/yii2-filter)。建议从 Dvizh 的仓库安装模块,最新的版本就在那里。
Yii2-filter
此模块允许在后台管理中为任何模型添加选项,并且可以从外部根据所选选项(包括 AJAX)过滤搜索结果。
功能
- 添加过滤器(即选项)
- 为不同模型分配不同的过滤器(根据字段值)
- 管理选项的选项
- 根据过滤器的值过滤 ActiveQuery
- 插件集合
安装
执行命令
php composer require pistol88/yii2-filter "*"
或者将以下内容添加到 composer.json 中
"pistol88/yii2-filter": "*",
并执行
php composer update
接下来,迁移数据库
php yii migrate --migrationPath=vendor/pistol88/yii2-filter/migrations
连接和配置
在应用程序配置文件中添加模块 filter,并配置它
'modules' => [ //... 'filter' => [ 'class' => 'pistol88\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' => 'pistol88\filter\behaviors\AttachFilterValues', ], ]; }
为了能够过滤 Find 的结果,我们需要替换模型中的 Query
public static function Find() { $return = new ProductQuery(get_called_class()); return $return; }
在 ProductQuery 中应该有这种行为
function behaviors() { return [ 'filter' => [ 'class' => 'pistol88\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 字段与某些选项相关联时,选项才会显示)
<?=\pistol88\filter\widgets\Choice::widget(['model' => $model]);?>
输出具有过滤器的块(复选框、单选按钮等)。传递一个与 relationFieldName 字段相关联的标识符,通常是类别 ID)
<?=\pistol88\filter\widgets\FilterPanel::widget(['itemId' => $model->id]);?>
- itemId - relationFieldName 的值
要使过滤工作,必须将 AQ 添加到调用链中
if(Yii::$app->request->get('filter')) { $products = $products->filtered(); }
为了使 FilterPanel 通过 AJAX 工作,必须按照以下方式配置它
<?=\pistol88\filter\widgets\FilterPanel::widget(['itemId' => $model->id, 'findModel' => $query, 'ajaxLoad' => true, 'resultHtmlSelector' => '#productsList']);
其中 resultHtmlSelector 是输出产品页面上元素的 CSS 选择器,findModel 是产品 AQ 的实例。