kazda01/yii2-search

一个简单的搜索引擎,允许用户通过定义的属性和规则搜索模型。

安装: 687

依赖项: 0

建议者: 0

安全: 0

星星: 2

关注者: 2

分支: 0

开放问题: 1

类型:yii2-extension

dev-main 2024-03-16 17:14 UTC

This package is auto-updated.

Last update: 2024-09-16 18:14:56 UTC


README

一个简单的搜索引擎,允许用户通过定义的属性和规则搜索模型。

Tests Total Downloads License

Search example

指定规则后,用户可以一次性通过多个属性搜索多个模型。搜索结果将在输入下动态列出。对于每个搜索结果,都会显示其识别字符串和找到匹配的属性名称。精确匹配也会以粗体显示。

安装

安装此扩展的首选方法是通过 composer

composer require kazda01/yii2-search "@dev"

用法

1. 添加模块并配置搜索参数

通过composer添加项目后,您需要在web.php模块中添加SearchModule并配置搜索参数。如果您想拥有多个不同的搜索引擎(例如,发票和用户搜索引擎),则需要多次添加模块,模块ID将用于区分。

模块ID还将用于创建搜索路由。最终请求将转到website.com/ModuleID/search?search=query。将ModuleID添加到引导程序中很重要,以便将路由添加到UrlManager,并优先于您站点的路由(如果您的路由与搜索路由不冲突,则不需要此操作)。

return [
    ...
    'bootstrap' => ['<ModuleID>'],
    'modules' => [
        '<ModuleID>' => [
            'class' => '\kazda01\search\SearchModule',
            'searchConfig' => [
                '<ModelSearch>' => [
                    'columns' => ['<ModelAttribute>', '<ModelAttribute>'],
                    'matchTitle' => '<matchTitle>',
                    'matchText' => function($model){
                        return 'Model: ' . $model->id;
                    }
                ],
            ]
        ],
    ],
    ...
];

所有可用设置在此处描述。

2. 添加搜索模型类

必须生成搜索模型类。可以通过Gii CRUD生成器简单地生成。您可以限制某些用户可以搜索/显示的结果。

3. 生成搜索输入

在视图中添加此行。

<?= SearchInput::widget(['search_id' => 'main-search']); ?>

所有可用设置在此处描述。

选项

模块配置

搜索配置

输入小部件配置

示例

示例 web.php

搜索 invoice-search 允许所有用户搜索

  • Invoice 模型通过其 invoice_number 属性

搜索 main-search 允许登录用户搜索

  • Invoice 模型通过其 invoice_number 属性
  • InvoiceItem 模型通过其 description 属性
  • Company 模型通过其 namevat_idstate 属性

单击发票结果,用户将被重定向到发票详情页面。

单击发票项结果,用户将被重定向到包含该项目的发票详情页面。

单击公司结果,用户将被重定向到带有设置参数的发票列表页面,以按公司客户过滤发票。

公司结果也按 namevat_idstate 属性分组。它们还根据记录为任何发票上的客户(而不是供应商)的公司进行筛选。

return [
    ...
    'bootstrap' => ['main-search', 'invoice-search'],
    'modules' => [
        'main-search' => [
            'class' => '\kazda01\search\SearchModule',
            'allowGet' => true,
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                    'actions' => ['index'], // allows only logged in users
                ],
            ],
            'searchConfig' => [
                'CompanySearch' => [
                    'columns' => ['name', 'vat_id', 'state'],
                    'matchTitle' => function(){
                        return Yii::t('app', 'Company')
                    },
                    'matchText' => function($model){
                        return $model->name . ', ' . $model->vat_id;
                    }
                    'route' => 'invoice/index',
                    'route_params' => function ($model) {
                        return ['InvoiceSearch[fk_company_customer]' => $model->name];
                    },
                    'only_if' => function ($model) {
                        return \app\models\Invoice::find()->where(['fk_company_customer' => $model->id])->count() > 0;
                    },
                    'group_by' => true,
                ],
                'InvoiceSearch' => [
                    'columns' => ['invoice_number'],
                    'matchTitle' => 'Invoice',
                    'matchText' => function($model){
                        return 'Invoice number ' . $model->invoice_number;
                    }
                ],
                'InvoiceItemSearch' => [
                    'columns' => ['description'],
                    'matchTitle' => 'Invoice item',
                    'matchText' => function($model){
                        return 'Invoice number: ' . $model->invoice->invoice_number;
                    }
                    'route' => 'invoice/view',
                    'route_params' => function ($model) {
                        return ['id' => $model->invoice->id];
                    }
                ],
            ]
        ],
        'invoice-search' => [
            'class' => '\kazda01\search\SearchModule',
            'searchConfig' => [
                'InvoiceSearch' => [
                    'columns' => ['invoice_number'],
                    'matchTitle' => 'Invoice',
                    'matchText' => function($model){
                        return 'Invoice number: ' . $model->invoice_number;
                    }
                ],
            ]
        ]
    ],
    ...
];

示例 view.php

<div class="row g-0 justify-content-center">
    <?= SearchInput::widget([
        'search_id' => 'main-search',
        'placeholder' => Yii::t('app', 'Invoice number, customer name, job description..'),
        'wrapperClass' => 'col-11 col-lg-8 col-xl-7 mx-auto',
        'inputClass' => 'form-control p-2 no-outline',
    ]); ?>
</div>

许可证

MIT

作者

测试

每次向存储库推送都会触发CI测试管道。您可以在项目根目录中运行以下命令在本地运行它们。

vendor/bin/phpstan analyse ./src
vendor/bin/phpcs ./src --extensions=php --colors --standard=PSR12 -n
vendor/bin/phpunit tests