petrelli/search-interface-builder

轻松构建和管理搜索分类和链接,包括所有URL及其相应状态

v0.0.5-alpha 2020-04-01 19:30 UTC

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,
    //...
]

重要概念

分区

分区是一组过滤器或排序器。您可以定义任意数量的分区。

A section

过滤器

过滤器是用于筛选集合的特定类别(例如,上一张图片中的部门和位置)。

您可以在您的各个分区中重复使用过滤器。

目录结构

默认情况下,所有内容都将位于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),
    // ...
]);

然后我们可以从视图中打印所有内容。

用法:打印过滤器标题

用于打印每个过滤器的名称以构建顶部部分

A section

@foreach ($filtering->filters() as $filter)
  <span>{{ $filter->label() }}</span>
@endforeach

用法:打印所有过滤器选项

在这里,我们打印每个选项

A section

@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%的使用场景,您只需要使用 urlactivelabel

用法:打印所选过滤器的列表

A section

正如您将在实际示例中看到的那样,在选择了几个过滤器之后,该列表可以自动生成。

@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)。请参阅 许可文件 了解更多信息。