kraenkvisuell/nova-sortable

此 Laravel Nova 扩展包允许您通过拖放的方式在 Nova 资源索引视图中重新排列模型。

v3.2.0 2022-07-11 15:23 UTC

README

Latest Version on Packagist Total Downloads

Laravel Nova 扩展包允许您通过拖放的方式在 Nova 资源索引视图中重新排列模型。

内部使用 Spatie 的 eloquent-sortable

要求

  • php: >=7.3
  • laravel/nova: ^3.0

功能

  • 拖放重新排序(在索引视图或 HasMany 视图中均可)
  • 支持 BelongsTo/MorphsTo 重新排序,包含连接表
  • 移动到开始和结束箭头(使项目为第一个/最后一个)
  • 来自 eloquent-sortable 的所有内容
  • 本地化

屏幕截图

Sortable

安装

使用 Composer 在 Laravel Nova 项目中安装包

# Install package
composer require kraenkvisuell/nova-sortable

用法

创建迁移

使用 Laravel 迁移在模型中添加排序字段

// Add order column to the model
Schema::table('some_model', function (Blueprint $table) {
  $table->integer('sort_order');
});

// Set default sort order (just copy ID to sort order)
DB::statement('UPDATE some_model SET sort_order = id');

实现 eloquent-sortable

实现 Spatie 的 eloquent-sortable 接口并应用特性

use Spatie\EloquentSortable\Sortable;
use Spatie\EloquentSortable\SortableTrait;

class SomeModel extends Eloquent implements Sortable
{
  use SortableTrait;

  public $sortable = [
    'order_column_name' => 'sort_order',
    'sort_when_creating' => true,
  ];

  ...
}

当模型没有排序配置时,将使用默认的 eloquent-sortable 配置。

将 HasSortableRows 应用到 Nova 资源

在此包的 Resource 上应用 HasSortableRows 特性

use KraenkVisuell\NovaSortable\Traits\HasSortableRows;

class MyResource extends Resource
{
  use HasSortableRows;

  ...
}

NB! 这将覆盖 indexQuery() 方法。

按请求/资源禁用排序

您可以通过覆盖 Resource 方法中的 canSort() 来禁用按请求或资源排序

public static function canSort(NovaRequest $request, $resource)
{
  // Do whatever here, ie:
  // return user()->isAdmin();
  // return $resource->id !== 5;
  return true;
}

NB! 这需要您禁用缓存(见下文)。

禁用缓存

如果您想禁用缓存(因为使用 canSort 或运行测试),您可以在具有 HasSortableRows 特性的资源中将 sortableCacheEnabled 设置为 false。请参阅下面的示例

class Artist extends Resource
{
    use HasSortableRows;

    public static $sortableCacheEnabled = false;
}

或者,如果您想暂时禁用可排序缓存(用于测试),您可以在资源上调用 Resource::disableSortabilityCache()

自定义可排序选项

Nova 排序顺序

要在 Nova 中以不同的顺序排序资源,您可以将 $sortable 数组中的 nova_order_by 标志设置为 DESC(默认为 ASC)。

class SomeModel extends Eloquent implements Sortable
{
  use SortableTrait;

  public $sortable = [
    'order_column_name' => 'sort_order',
    'sort_when_creating' => true,
    'nova_order_by' => 'DESC',
  ];

  ...
}

忽略策略

如果您有一个资源具有 authorizedToUpdate 为 false,但您希望用户仍然可以排序它,您可以使用 ignore_policies 标志,如下所示

class SomeModel extends Eloquent implements Sortable
{
  use SortableTrait;

  public $sortable = [
    'order_column_name' => 'sort_order',
    'sort_when_creating' => true,
    'ignore_policies' => true,
  ];

  ...
}

在 HasMany 关系上排序

NB! 资源只能在 索引视图HasMany 列表视图 中进行排序,但不能同时使用两种视图!

在 HasMany 上排序很简单。将 'sort_on_has_many' => true 添加到模型上的 $sortable 数组。如下所示

public $sortable = [
  'order_column_name' => 'sort_order',
  'sort_when_creating' => true,
  'sort_on_has_many' => true,
];

排序配置可以在每个模型级别应用,也可以添加到 eloquent-sortable 的所有模型配置中。

return [

    // Spatie sortable configuration

    /**
     * Add sort on has many in all the models.
     **/
    'sort_on_has_many' => true,
];

在 ManyToMany 关系上排序

在 BelongsToMany 和 MorphToMany 关系上排序是可用的,但需要特殊步骤。

请参阅此处文档:排序 ManyToMany 关系(带连接表)

本地化

可以使用以下发布命令发布翻译文件

php artisan vendor:publish --provider="KraenkVisuell\NovaSortable\ToolServiceProvider" --tag="translations"

您可以将翻译添加到 resources/lang/vendor/nova-sortable/,通过创建一个带有区域名称的新翻译文件(例如 et.json)并从现有的 en.json 复制 JSON。

其他用例

使用indexQuery

此包覆盖了Resource的indexQuery,如果您仍然想使用它,可以按照以下方式进行

public static function indexQuery(NovaRequest $request, $query)
{
  // Do whatever with the query
  // ie $query->withCount(['children', 'descendants', 'modules']);
  return parent::indexQuery($request, HasSortableRows::indexQuery($request, $query));
}

致谢

许可证

Nova Sortable是一个开源软件,采用MIT许可证授权。