Skip to content

Latest commit

 

History

History
167 lines (128 loc) · 5.66 KB

menu_configuration.md

File metadata and controls

167 lines (128 loc) · 5.66 KB

Конфигурация меню

Конфигурация меню SleepingOwl Admin по умолчанию располагается в app/Admin/navigation.php. Если файл возвращает массив, то этот массив будет также использоваться для построения меню.

Класс навигации SleepingOwl\Admin\Navigation инициализируется через Service Container и доступ к нему можно получить несколькими способами:

$navigation = app('sleeping_owl.navigation');

// Или используя фасад

$navigation = AdminNavigation::getRootFacade();

Новый раздел в меню можно добавить несколькими способами:

Через сервис контейнер или фасад

app('sleeping_owl.navigation')
    ->addPage()
    ->setTitle('Blog')
    ->setUrl('/blog');
    
// Или

// Создание элемента меню для модели
AdminNavigation::addPage(\App\Blog::class)
    ->setPriority(100)
    ->setIcon('fa fa-newspaper-o');

Через AdminSection класс

AdminSection::addMenuPage(\App\User::class);

Метод addPage может принимать в качестве аргумента

  • [string] Model class name
  • [SleepingOwl\Admin\Navigation\Page] Page class
  • [array] ['title' => 'News', 'priority' => 100, 'icon' => 'fa fa-newspaper-o']

Пример

// Зарегестрированный класс модели использованной для создания раздела
AdminNavigation::addPage(\App\Blog::class);

AdminNavigation::addPage(new Page()->setTitle('News'));

AdminNavigation::addPage(['title' => 'News', 'priority' => 100, 'icon' => 'fa fa-newspaper-o']);

Меню может иметь неограниченную вложеность страниц:

use SleepingOwl\Admin\Navigation\Page;

AdminNavigation::addPage(\App\Blog::class)->setPages(fuction(Page $section) {
   
    $section
        ->addPage()
        ->setTitle('Tags')
        ->setUrl('blog/tags')
        ->setIcon('fa fa-tags');
    
    $section->addPage()->setTitle('settings')->setPages(function(Page $section) {
    
        $section
            ->addPage()
            ->setTitle('blog settings')
            ->setUrl(route('blog.settings'));
        
    });
});

Также разделы в меню можно добавить в виде массива:

use SleepingOwl\Admin\Navigation\Page;

$array = [
     [
         'title' => 'News', 
         'priority' => 100, 
         'icon' => 'fa fa-newspaper-o'
     ],
     [
         'title' => 'About', 
         'priority' => 200, 
         'pages' => [
             // Если в качестве страницы передана строка, то будет произведен поиск по
             // зарагистрированой модели
             \App\Blog::class,
             
             (new Page())->setTitle('Us')->setUrl('about/us'),
             
             [
                 'title' => 'Contacts', 
                 'priority' => 300, 
                 'icon' => 'fa fa-credit-card'
             ]
         ]
     ]
];

AdminNavigation::setFromArray($array);

// Или к внутренней странице

AdminNavigation::addPage(\App\Blog::class)->setPages(fuction(Page $section) {
       $section->addPage()->setTitle('Sub menu')->setFromArray($array);
});

Доступ

Также для разделов меню можно настраивать првила видимости. Процесс проверки прав доступа выглядит следующим образом: каждый объект меню может иметь свое локальное правило проверки прав

AdminNavigation::addPage(\App\Blog::class)->setAccessLogic(function() {
    return auth()->user()->isSuperAdmin();
})

Если правило для страницы не указано:

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

Есть несколько сценариев настройки прав доступа:

  • Указать глобальное правило
AdminNavigation::setAccessLogic(function(Page $page) {
   return auth()->user()->isSuperAdmin();
});
  • Указать правило для конкретной страницы
  • Указать правило для раздела содержащего страницы, это правило распространится на все внутренние страницы не имеющие своего правила

Вот простой пример как может выглядеть конфигурация меню:

return [
    [
        'title' => 'Permissions',
        'icon' => 'fa fa-group',
        'pages' => [
            (new Page(\App\User::class))
                ->setIcon('fa fa-user')
                ->setPriority(0),
            (new Page(\App\Role::class))
                ->setIcon('fa fa-group')
                ->setPriority(100)
        ]
    ]
];