默认情况下,左侧菜单项的顺序是按字母顺序排列的。
我的客户想手动订购这些菜单。知道如何使它成为可能吗?
去回答
你可以在
App\Providers\NovaServiceProvider.php
添加一个方法 resources() 并手动注册资源,例如
protected function resources()
{
Nova::resources([
User::class,
Post::class,
]);
}
备用
这个要点中提到了另一种方法,这似乎也不错,但官方文档尚未提及。
资源
<?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 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;
});
}
有两种方法可以实现这一点:
1. 优先方式
public static $priority = 2;
public function boot()
{
Nova::sortResourcesBy(function ($resource) {
return $resource::$priority ?? 9999;
});
}
2、在 NovaServiceProvider 中排序资源模型
在 NovaServiceProvider 中,像这样订购资源模型:
protected function resources()
{
Nova::resources([
User::class,
Post::class,
]);
}
如果有帮助,您可以使用分组。我知道这不是 100% 的修复,但也许会有所帮助。
public static $group = 'Admin';
将 /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');
}
注意:必须转换标题中的特殊字符!
对组进行排序:
将此添加到您的资源中:
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);