set_st/yii2-filter

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

安装: 1

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 6

类型:yii2-extension

dev-master 2020-03-23 12:35 UTC

This package is auto-updated.

Last update: 2024-09-23 22:38:41 UTC


README

该模块允许在后台为任何模型添加选项,并通过选择这些选项(包括ajax)来过滤查询结果。

功能

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

options

安装

执行命令

php composer require set_st/yii2-filter "@dev"

或在 composer.json 中添加

"set_st/yii2-filter": "@dev",

然后执行

php composer update

接下来,迁移数据库

php yii migrate --migrationPath=vendor/set_st/yii2-filter/src/migrations

连接和配置

将 filter 模块添加到应用程序配置文件中,并配置它

    'modules' => [
        //...
        'filter' => [
            'class' => 'set_st\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' => 'set_st\filter\behaviors\AttachFilterValues',
            ],
        ];
    }

为了能够过滤 Find 结果,我们替换了模型中的 Query

    public static function Find()
    {
        $return = new ProductQuery(get_called_class());
        return $return;
    }

在 ProductQuery 中应该有这种行为

    function behaviors()
    {
       return [
           'filter' => [
               'class' => 'set_st\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 字段关联到某些选项时,该选项才会显示)

<?=\set_st\filter\widgets\Choice::widget(['model' => $model]);?>

输出带有过滤器的块(复选框、单选按钮等)。传递与 relationFieldName 字段关联的过滤器的标识符(通常是类别 ID)

<?=\set_st\filter\widgets\FilterPanel::widget(['itemId' => $model->id]);?>
  • itemId - relationFieldName 的值

为了使过滤生效,请添加 AQ 调用链

if(Yii::$app->request->get('filter')) {
    $products = $products->filtered();
}

为了使 FilterPanel 通过 ajax 工作,请按以下方式配置它

<?=\set_st\filter\widgets\FilterPanel::widget(['itemId' => $model->id, 'findModel' => $query, 'ajaxLoad' => true, 'resultHtmlSelector' => '#productsList']);

其中 resultHtmlSelector 是显示产品的页面元素的 CSS 选择器,findModel 是产品 AQ 的实例。