Laravel Nova - 重新排序左侧导航菜单项

Laravel Nova - Reorder left navigation menu items

默认情况下,左侧菜单项的顺序是按字母顺序排列的。

我的客户想手动订购这些菜单。知道如何让它成为可能吗?

转到

如果有帮助,您可以使用分组。我知道这不是 100% 的修复,但也许会有所帮助。

public static $group = 'Admin';

你可以在

App\Providers\NovaServiceProvider.php

添加方法 resources() 并手动注册资源,如

 protected function resources()
    {
        Nova::resources([
            User::class,
            Post::class,
        ]);
    }

候补

这个gist还有一个方法,这个好像也不错,但是官方文档还没有提到

资源

<?php

namespace App\Nova;

class User extends Resource
{
    /**
     * The model the resource corresponds to.
     *
     * @var string
     */
    public static $model = 'App\User';

    /**
     * Custom priority level of the resource.
     *
     * @var int
     */
    public static $priority = 1;

    // ...
}

在 NovaServiceProvider 中

<?php

namespace App\Providers;

use Laravel\Nova\Nova;
use Laravel\Nova\Cards\Help;
use Illuminate\Support\Facades\Gate;
use Laravel\Nova\NovaApplicationServiceProvider;

class NovaServiceProvider extends NovaApplicationServiceProvider
{
   /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        Nova::sortResourcesBy(function ($resource) {
            return $resource::$priority ?? 99999;
        });
    }
}

您可以通过这种方式设置资源的优先级,并根据优先级渲染资源。

将 /nova/resources/navigation.blade.php {{ $group }} 更改为以下内容:

{!! $group !!}

现在您可以轻松地按如下方式对组进行排序:

public static $group = '<span class="hidden">20</span>Music';

public static $group = '<span class="hidden">30</span>User';

注意:标题中的特殊字符一定要转换!


有了链接,有点不一样.... 第一种方法:又脏又丑

你可以改变

{{ $resource::label() }}

{{ substr($resource::label(), 1) }}

然后您可以按资源名称的第一个字母对链接进行排序。

  • 一个用户
  • 专辑
  • 联系

或者更好的链接方法 板条箱 app/Nova/CustomResource.php:

<?php

namespace App\Nova;

use Illuminate\Support\Str;

abstract class CustomResource extends Resource
{
    public static $label = '';

    /**
     * @return string
     */
    public static function label()
    {
        if(static::$label) {
            return static::$label;
        }
        return Str::plural(Str::title(Str::snake(class_basename(get_called_class()), ' ')));
    }
}

改变/nova/resources/navigation.blade.php

{!!  $resource::label()  !!}

并且在 Nova 资源中,扩展这个自定义资源并且您可以使用 public static $label:

class Lyric extends CustomResource
{
    public static $label = '<span class="hidden">10</span>Lyrics';

     public static function singularLabel()
    {
        return __('Lyric');
    }

注意:标题中的特殊字符一定要转换!

一种更简洁的方法并在最新的 Nova 3.x 上进行了测试。此外,自 2.10+ 版本以来,它已被添加到 Nova 中。您需要做的就是在您的 nova 类 上添加一个静态 属性。例如,客户将是:

/**
 * The side nav menu order.
 *
 * @var int
 */
public static $priority = 2;

然后您可以使用 NovaServiceProvider 告诉 nova 使用您的自定义排序。您可以将代码放在 boot method

public function boot()
{
    Nova::sortResourcesBy(function ($resource) {
        return $resource::$priority ?? 9999;
    });
}

**参考Nova Private Repo

对组进行排序:

将此添加到您的资源中:

    public static function groupOrder() {
            return 9999999;
        }

您可以通过将它添加到任何成员资源来覆盖它,以降低它在导航树中的顺序:

    public static function groupOrder() {
            return 5;
        }

在 resourcemanager 末尾返回之前添加这个(我希望我不必在这个地方覆盖它):

    $arrSort = [];
    foreach ($navigation as $group => $resources) {
          $resourcesGruoupOrders = [];
          foreach ($resources as $aResource) {
                $resourcesGruoupOrders[] = $aResource::groupOrder();
          }
          $arrSort[] = min($resourcesGruoupOrders);
    }
          $navigation = json_decode(json_encode($navigation), true);
          array_multisort($navigation, SORT_ASC, SORT_NUMERIC, $arrSort);


有两种方法可以实现:

  1. 通过为资源设置优先级
  2. 在 NovaServiceProvider 中订购资源模型

1.优先方法

  • 在资源模型中按照以下代码添加优先级:
      public static $priority = 2;
    
  • 然后像这样更新 NovaServiceProvider:
    public function boot()
    {
        Nova::sortResourcesBy(function ($resource) {
            return $resource::$priority ?? 9999;
        });
    }
    

2。在 NovaServiceProvider

中订购资源模型

在 NovaServiceProvider 中,像这样订购资源模型:

protected function resources()
{
    Nova::resources([
        User::class,
        Post::class,
    ]);
 }