Laravel Nova - изменить порядок левых пунктов меню навигации

По умолчанию элементы левого меню расположены в алфавитном порядке.

Мой клиент хочет заказать эти меню вручную. Есть идеи, как это сделать?

Laravel Nova - изменить порядок левых пунктов меню навигации

Перейти к отвечать

В соответствии с v1.1.7 это невозможно. В будущем это может быть возможно. github.com/laravel/nova-issues/issues/461

Saumini Navaratnam 21.11.2018 06:33

@SauminiNavaratnam Вопрос отличается от проблемы, которую вы задали в своем комментарии, вопрос связан с порядком пунктов меню, которые отображаются на левой панели навигации. Упомянутая вами проблема GitHub связана с упорядочиванием записей для каждого ресурса.

Mustafa Ehsan Alokozay 09.04.2020 18:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
16
2
10 091
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

вы можете использовать группировку, если это помогает. Я знаю, что это не 100% исправление, но, возможно, это немного поможет.

public static $group = 'Admin';

Вы можете сделать это в

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

Таким образом вы устанавливаете приоритет ресурса и в зависимости от приоритета визуализируете ресурс.

Мне пришлось добавить \ App \ Nova \ перед именем класса. Но это сработало Спасибо

dmgd 29.07.2019 16:00

@dmgd, если вы не импортируете ресурс вверху, вам нужно использовать `\ App \ Nova` перед ресурсом.

Prafulla Kumar Sahu 29.07.2019 16:01

Этот метод работает, но если у вас также есть группировка, порядок сортировки группы возвращается к тому, что имя группы имя.

Eugene van der Merwe 29.07.2019 22:46

Если вы используете ресурс, который нет отображается на панели навигации, но он используется в ресурсах, отображаемых на панели навигации, вы должны добавить их в массив ресурсов. иначе nova покажет страницу 404

Hadi Sharghi 14.08.2019 21:43

Не знаю почему, но у меня не сработало в Nova 3.x. Любые идеи?

Mustafa Ehsan Alokozay 09.04.2020 18:04

@MustafaEhsanAlokozay, не глядя на ваш код или ошибку, которую вы получаете.

Prafulla Kumar Sahu 09.04.2020 18:51

@MustafaEhsanAlokozay Я обновил альтернативу, пожалуйста, если это сработает для вас, но исходное решение - это то, что они предложили в документации.

Prafulla Kumar Sahu 21.04.2020 00:27

@PrafullaKumarSahu главное решение (Nova::sortResourceBy()) сработало для меня, спасибо!

Mustafa Ehsan Alokozay 23.04.2020 08:40

Измените /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контакт

Или лучший метод для ссылок ящик приложения / 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 расширяет этот настраиваемый ресурс, и вы можете использовать общедоступную статическую метку $:

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

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

Внимание: в заголовке необходимо преобразовывать спецсимволы!

Более чистый способ и протестирован на последней версии Nova 3.x. Кроме того, это было добавлено в Nova, начиная с версии 2.10+. Все, что вам нужно сделать, это добавить статическое свойство в ваши классы 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;
        }

добавьте это перед тем, как вернуться в конец менеджера ресурсов (надеюсь, мне не придется перезаписывать это здесь):

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


где находится файл менеджера ресурсов, который я должен поместить в этот фрагмент кода?

Richie 03.03.2021 08:24
Ответ принят как подходящий

Этого можно добиться двумя способами:

  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().

TheSETJ 06.12.2020 07:55

Другие вопросы по теме