dvizh/yii2-filter

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

安装量: 1,551

依赖者: 2

建议者: 0

安全性: 0

星级: 2

关注者: 5

分支: 6

公开问题: 2

类型:yii2-extension

dev-master 2018-02-05 13:07 UTC

This package is not auto-updated.

Last update: 2024-09-20 21:57:47 UTC


README

此模块允许在后台为任何模型添加选项,并可以从外部根据选定的选项过滤搜索结果(包括ajax)。

功能

  • 添加过滤器(即选项)
  • 为不同的模型分配不同的过滤器(根据字段值)
  • 管理选项的选项
  • 根据过滤器值过滤 ActiveQuery
  • 一组小工具

options

安装

执行命令

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 产品实例。