petrelli / search-interface-builder
轻松构建和管理搜索分类和链接,包括所有URL及其相应状态
Requires
- php: ^7.0
- laravel/framework: ~5.6|~5.7|~5.8|^6.0|^7.0
This package is not auto-updated.
Last update: 2024-09-26 16:58:14 UTC
README
为您的列表构建和维护过滤器。
只需定义几个类,所有内容都将自动管理。URL、值、标签等。
实时示例
请点击此处并四处浏览。
此示例的完整视图仅几行
@foreach ($filtering->filters() as $filter) <div> <h4>{{ $filter->label() }}</h4> @foreach($filter->links() as $option) <a href="{{$option->url}}" @if($option->active) class="active" @endif> {{ $option->label }} </a> @endforeach </div> @endforeach @if ($filtering->activeFilters()->isNotEmpty()) <div> <h4>Selected filters:</h4> @foreach($filtering->activeFilters() as $option) <a href="{{$option->url}}">{{ $option->label }}</a> @endforeach <a href="{!! route('filters') !!}">Clear all</a> </div> @endif
构建所有URL的逻辑完全由我们的分区和过滤器类自动管理。
执行实际搜索
实际在您的数据源上触发搜索的方式完全由您决定。
此包将为您提供构建过滤器和排序器的简单灵活方式,但连接生成的URL将取决于您的应用程序。
执行作用域
为了填补这个差距,我建议使用作用域控制器包。
它的唯一功能是在您的查询构建器上执行作用域,根据您的URL,这使得它成为完美的选择。
这样,您的控制器和视图将始终保持整洁。
安装
在您的composer.json文件中包含它,通过调用
composer require petrelli/search-interface-builder
或者添加
"petrelli/search-interface-builder": "^0.0.2@alpha"
然后运行composer update。
服务提供者
只有当您已禁用Laravel的自动发现时,您才需要手动将服务提供者添加到您的config/app.php文件中。
'providers' => [ //... Petrelli\SearchInterfaceBuilder\ServiceProvider::class, //... ]
重要概念
分区
分区是一组过滤器或排序器。您可以定义任意数量的分区。
过滤器
过滤器是用于筛选集合的特定类别(例如,上一张图片中的部门和位置)。
您可以在您的各个分区中重复使用过滤器。
目录结构
默认情况下,所有内容都将位于App/Filters下。
App/Filters/Definitions:过滤器类和排序器(位置、年份、按价格等)。App/Filters/Sections:主要搜索、员工搜索、事件搜索等。
用法
1. 创建一个新的空分区。
php artisan search-builder:section [name] [route.name?]
这将在App/Filters/Sections中生成一个新的分区类。
如果您没有指定路由,请打开生成的文件并更新它。
2.1 创建过滤器
php artisan search-builder:filter [name]
这将在App/Filters/Definitions中生成一个新的过滤器类。
namespace App\Filters\Definitions; class Location extends Petrelli\SearchInterfaceBuilder\MultipleSelector { protected $parameter = 'filter_location'; protected $label = 'Location'; public function values() { //... Always return a [value => label ...] associative array return [ 'ny' => __('New York'), 'nb' => __('Nairobi'), 'fr' => __('France'), ]; } }
这里您可以调整以下三项
-
$parameter:用于此过滤器的URL参数。 -
$label:要打印的标签。 -
values():一个数组,元素为['value' => 'label', ...]。您可以从数据库、API、硬编码等加载这些值。
可选
-
$asArray:将此URL参数作为数组发送,而不是使用分隔符的单个字符串。默认为false。 -
$separator:用于在URL上分隔值的字符。默认为,。
2.2 创建排序器(可选)
排序器实际上是一个过滤器,因此创建它的步骤与2.1相同。
唯一的区别是我们应该只允许一次选择一个选项。
为了实现这一点,您需要从 SingleSelector 继承而不是从 MultipleSelector 继承。
3. 将这些过滤器添加到部分
以下示例部分包含两个过滤器(部门和位置)和一个排序器(SortStaff)。
// Filters use App\Filters\Definitions\Department; use App\Filters\Definitions\Location; // Sorter use App\Filters\Definitions\SortStaff; class StaffFiltering extends Petrelli\SearchInterfaceBuilder\BaseSection { protected $route = 'staff'; protected $filters = [ Department::class, Location::class, ]; protected $sorter = SortStaff::class; }
4. 在您的视图中使用 Section 对象
从控制器发送对象到视图
return view('staff.index', [ 'filtering' => app(StaffsFiltering::class), // ... ]);
然后我们可以从视图中打印所有内容。
用法:打印过滤器标题
用于打印每个过滤器的名称以构建顶部部分
@foreach ($filtering->filters() as $filter) <span>{{ $filter->label() }}</span> @endforeach
用法:打印所有过滤器选项
在这里,我们打印每个选项
@foreach ($filtering->filters() as $filter) <span>{{ $filter->label() }}</span> @foreach($filter->links() as $option) <a href="{{$option->url}}" class="@if($option->active) is-active @endif"> {{ $option->label }} </a> @endforeach @endforeach
每个选项对象包含以下属性
$option->label // Label $option->value // Value $option->active // Boolean that indicates if is active $option->urlRoot // URL with no filters at all $option->url // URL that contains or not the value depending if it's active (url-present) or not
对于99%的使用场景,您只需要使用 url、active 和 label。
用法:打印所选过滤器的列表
正如您将在实际示例中看到的那样,在选择了几个过滤器之后,该列表可以自动生成。
@if ($filters->activeFilters()->isNotEmpty()) @foreach($filters->activeFilters() as $filter) <a href="{{$filter->url}}">{{ $filter->label }}</a> @endforeach <a href="{!! route('staff') !!}">Clear all</a> </div> @endif
此列表将包含所有过滤器中所有选定的选项。
用法:创建一个只允许选择一个元素的过滤器
为了实现这一点,您需要从 SingleSelector 继承而不是从 MultipleSelector 继承。
class Location extends Petrelli\SearchInterfaceBuilder\SingleSelector
用法:为特定过滤器构建自定义路由
只需在您的过滤器类中覆盖 buildRoute 函数即可。
public function buildRoute($extraParams) { return route($this->route, request()->except(['page', $this->parameter]) + $extraParams); }
待办事项
- 改进文档
- 示例
- 测试
许可协议
MIT 许可协议 (MIT)。请参阅 许可文件 了解更多信息。



