pistol88/yii2-filter

yii2-filter 为您的模型添加选项和过滤器

安装: 500

依赖关系: 3

建议: 0

安全性: 0

星星: 1

关注者: 2

分支: 3

开放问题: 0

类型:yii2-extension

dev-master 2017-04-24 05:57 UTC

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
  • 插件集合

options

安装

执行命令

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 的实例。