gabelbart/nova-toolbar-tools

为laravel nova添加工具栏工具和资源。

1.2.2 2023-02-25 12:32 UTC

This package is auto-updated.

Last update: 2024-09-25 16:19:26 UTC


README

  • php: ^8.0
  • laravel/nova: ^4.0 (Nova 3版本请见0.5)

Nova 工具栏工具

laravel nova的composer包。它允许您全局选择和持久化资源。

示例用例

  • 开发自己的工具栏工具的基础
  • 选择您要在某些资源中过滤的模型,但不需要每次都应用过滤器,只需在会话中应用一次
    • 根据选择自定义菜单
      • 隐藏或显示资源
      • 隐藏或显示工具
    • 根据全局选择自定义工具行为

安装

composer require gabelbart/nova-toolbar-tools

将中间件添加到nova配置中

\Gabelbart\Laravel\Nova\ToolbarTools\Http\Middleware\BootToolbarTools::class添加到config/nova.php中的middleware列表

在您的\App\Providers\NovaServiceProvider中加载工具

添加此方法

public function toolbarTools()
{
    return [
    ];
}

将这些行添加到boot方法中

Nova::serving(function () {
    \Gabelbart\Laravel\Nova\ToolbarTools\ToolbarTools::toolbarTools($this->toolbarTools());
});

如果您已经有了一个Nova::serving块,您可能只需要组合内容。

使用方法

工具栏资源

设置工具栏资源

假设您有一个资源\App\Nova\Publisher,要创建一个工具栏下拉菜单,您需要创建一个\Gabelbart\Laravel\Nova\ToolbarTools\Tools\ToolbarResource的实例。将以下内容添加到您的NovaServiceProvidertoolbarTools方法中

ToolbarResource::make(\App\Nova\Publisher::class)

它可能看起来像这样

public function toolbarTools()
{
    return [
        ToolbarResource::make(\App\Nova\Publisher::class),
    ];
}

访问值

在nova的任何地方,您现在都可以使用\Gabelbart\Laravel\Nova\ToolbarTools\Tools\ToolbarResource的静态sessionValueFor方法访问值。例如

/** @var ?\App\Models\Publisher $publisher */
$publisher = ToolbarResource::sessionValueFor(\App\Nova\Publisher::class);

此外,您还可以使用\Gabelbart\Laravel\Nova\ToolbarTools\Traits\HasToolbarSelection特质。这允许您调用资源的getToolbarSelectiongetToolbarSelectionOrFail静态方法。

class Publisher extends \Laravel\Nova\Resource
{
    use \Gabelbart\Laravel\Nova\ToolbarTools\Traits\HasToolbarSelection;

    // snip...
}

/** @var ?\App\Models\Publisher $model */
$model = Publisher::getToolbarSelection();

选项

标签

默认情况下,将使用您的nova资源的标签,但这可以自定义

ToolbarResource::make(\App\Nova\Publisher::class)
    ->withLabel(__('my_own_label'))

可搜索的

默认情况下,将显示所有可能的选项。如果您希望用户进行搜索,可以使用searchable选项。

ToolbarResource::make(\App\Nova\Publisher::class)
    ->searchable()

这利用了nova的全局搜索。

可过滤的

默认情况下,将显示所有可能的选项。您可以使用filterable选项显示一个过滤器字段,以便根据文本输入过滤值。当与searchable一起使用时,搜索选项将优先。

ToolbarResource::make(\App\Nova\Publisher::class)
    ->searchable()

选择

默认情况下,将使用会话中的值,如果您将其关闭,您可能希望自己设置所选值。

ToolbarResource::make(\App\Nova\Publisher::class)
    ->selection(\Auth::user()->favoritePublisher())

排序

要更改项目的顺序,请使用sortBy选项。它接受三个参数

  1. key string|callable|false - 要排序的属性的名称或回调,传递false以禁用搜索
  2. options array(默认:null)- 任何在Collection::sortBy中可用的选项
  3. descending bool(默认:false)- 设置排序方向

这些参数直接传递到Illuminate\Support\Collection::sortBy方法,有关更多信息,请参阅那里。

ToolbarResource::make(\App\Nova\Publisher::class)
    ->orderBy('name', null, false)

无项可寻文本

使用 searchableDropdown 选项,如果没有找到匹配项,组件将显示“没有找到项”。您可以通过使用以下方式来自定义此消息:

ToolbarResource::make(\App\Nova\Publisher::class)
    ->noItemsFoundText(__('my_no_items_found_text')

保存到会话

默认情况下,选择的值将在会话中记住。如果您想更改这一点,请使用带有 false 作为参数的 saveToSession 方法。您可能希望考虑持久化值并自行提供选择,然后查看 selectiononChange

ToolbarResource::make(\App\Nova\Publisher::class)
    ->saveToSession(false)

对选择做出反应

如果您想自定义选择更改的行为,您可以在自定义回调中这样做。请求将有一个名为 id 的参数,其中包含选择的主键。

ToolbarResource::make(\App\Nova\Publisher::class)
    ->onChange(fn (\Illuminate\Http\Request $request) => \App\Nova\Publisher::onChangeToolbarSelection($request))

操作索引-查询

注意:由于它使用 nova 的全局搜索,此操作将 searchable 选项有效。

如果您想自定义可用选项的列表,可以使用 withIndexQuery 方法。它接收内部查询构建器作为参数。但是,如果您想替换内部查询构建器,可以返回自己的查询构建器实例。

ToolbarResource::make(\App\Nova\Book::class)
    ->withIndexQuery(fn (\Illuminate\Database\Eloquent\Builder $builder) => $builder->where('publisher_id', \Auth::user()->id))