optimistdigital/nova-sortable

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

资助包维护!
outl1ne

安装数: 1,701,824

依赖关系: 5

建议者: 0

安全性: 0

星标: 280

关注者: 6

分支: 118

开放问题: 25

语言:Vue


README

Latest Version on Packagist Total Downloads

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

使用Spatie的 eloquent-sortable

要求

  • php: >=8.0
  • laravel/nova: ^4.24.0

功能

  • 拖放排序(在索引视图或HasMany视图中)
  • 支持使用连接表进行BelongsTo/MorphsTo排序
  • 移动到开始和结束箭头(使项目成为第一个/最后一个)
  • 来自eloquent-sortable的所有功能
  • 本地化

截图

Sortable

安装

通过Composer在Laravel Nova项目中安装此包

# Install package
composer require outl1ne/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配置。

向Nova资源应用HasSortableRows

在Resource上应用此包中的HasSortableRows特性

use Outl1ne\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中对资源进行不同顺序的排序,您可以将nova_order_by标志设置为DESC(默认为ASC)在$sortable数组中。

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排序简单。在模型上$sortable数组中添加'sort_on_has_many' => true。如下所示

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

HasMany排序配置可以在每个模型的基础上应用,也可以在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="Outl1ne\NovaSortable\ToolServiceProvider" --tag="translations"

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

其他用法

使用indexQuery

本包覆盖了资源的 indexQuery,如果您仍然想使用它,可以按照以下方式操作

use HasSortableRows {
    indexQuery as indexSortableQuery;
}

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

致谢

许可证

Nova Sortable 是开源软件,受 MIT 许可证 许可。