【问题标题】:Laravel Nova - Reorder left navigation menu itemsLaravel Nova - 重新排序左侧导航菜单项
【发布时间】:2018-11-21 05:08:34
【问题描述】:

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

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

转到answer

【问题讨论】:

  • 根据 v1.1.7,这是不可能的。将来可能会。 github.com/laravel/nova-issues/issues/461
  • @SauminiNavaratnam 该问题与您在评论中提出的问题不同,该问题与左侧导航栏中显示的菜单项的订购有关。你提到的github issue与每个资源下的排序记录有关。

标签: php laravel laravel-5.8 laravel-nova


【解决方案1】:

你可以在

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;
        });
    }
}

这样你设置资源的优先级并根据优先级呈现资源。

【讨论】:

  • 我必须在类名前添加 \App\Nova\。但它工作了谢谢
  • 如果您使用的资源显示在导航栏中,但它用于导航栏中显示的资源,则必须将它们添加到资源数组中。否则 nova 将显示 404 页面
  • 不知道为什么,但在 Nova 3.x 中对我不起作用。有什么想法吗?
  • @MustafaEhsanAlokozay 我已经更新了一个替代方案,如果这对你有用,但原始解决方案是他们在文档中建议的。
  • @PrafullaKumarSahu 要点解决方案 (Nova::sortResourceBy()) 对我有用,谢谢!
【解决方案2】:

一种更简洁的方式,并在最新的 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

【讨论】:

    【解决方案3】:

    有两种方法可以实现:

    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,
        ]);
     }
    

    【讨论】:

    • 我正在使用 __() 辅助方法以及 label()singularLabel() 方法来翻译我的 Nova 资源的名称。似乎第二种解决方案在这种情况下不起作用,因为我的资源是按字母顺序排序的,而不是我传递给 Nova::resources() 的顺序。
    【解决方案4】:

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

    public static $group = 'Admin';
    

    【讨论】:

      【解决方案5】:

      将 /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) }}
      

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

      • 用户
      • 相册
      • C联系人

      或者更好的链接方法 crate 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');
          }
      

      注意:必须转换标题中的特殊字符!

      【讨论】:

        【解决方案6】:

        对组进行排序:

        将此添加到您的资源中:

            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);
        
        
        

        【讨论】:

        • 资源管理器文件我应该把这段代码sn-p放在哪里?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2012-05-23
        • 2017-08-05
        • 2015-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多