Админ-панель
Модули могут напрямую взаимодействовать с админ-панелью движка.
Для этого необходимо выполнить следующее:
- Определить пункт в сайдбаре в админ-панели
- Определить роуты админ-панели
- Определить контроллеры
- Определить
view
для каждой страницы внутри админ-панели.
Сайдбар
Для большей ясности, мы будем использовать ServiceProvider под названием AdminServiceProvider, который как раз отвечает за иниализацию модуля внутри админ-панели.
Сам пункт обязан иметь такую структуру (additional
):
[
'icon' => 'ph-cube', // Иконка вашего пункта
'title' => 'mon_admin.title', // Название. Можно использовать как раз ключи переводов
'items' => [
[
'title' => 'Что-то',
'url' => '/admin/module/list' // Ссылка, куда ведет подпункт
],
]
],
Чтобы определить наши пункты в сайдбаре, достаточно в сервис провайдере вызывать один класс:
public function register() : void
{
AdminSidebarBuilder::add(
'additional',
[
'icon' => 'ph-cube',
'title' => 'Название нашего пункта',
'items' => [
['title' => 'Что-то', 'url' => '/admin/module/list'],
]
],
);
}
Аргументы функции add()
:
- $key - Ключ в сайдбаре. Может быть
main
илиadditional
. - $item - Массив с данными о пунктах
- $permission - Право, которое необходимо для просмотра этого пункта
Роуты и контроллеры
После, нам нужно определить в нашем ServiceProvider'e наши админ-роуты.
Роуты
В роутах нам нужно постоянно проверять на определенные права пользователя, обращающегося к нашим роутам. Это можно сделать просто - вызываем middleware с указанием нашего права и потом пишем наши роуты.
Вот пример:
router()->group(function (RouteGroup $router) {
// Проверка прав на наш модуль
HasPermissionMiddleware::permission('admin.module');
$router->middleware(HasPermissionMiddleware::class);
// Наши роуты
$router->get('/list', [AdminViewController::class, 'list']);
$router->post('/add', [AdminApiController::class, 'add']);
}, 'admin/module');
Мы просто создаем роуты с префиксом admin/, ничего сложного.
Контроллеры
Контроллеры абсолютно никак не отличаются от других контроллеров. Пример реализации ниже:
class AdminApiController extends AbstractController
{
public function __construct()
{
// Проверяем на CSRF
$this->middleware(CSRFMiddleware::class);
}
public function add(FluteRequest $request)
{
/** Делаем что хотим тут */
}
}
Интерфейс
Каждый интерфейс админ-панели должен делать @extends
основного шаблона админ-панели, а потом добавлять свой контент. Пример:
@extends('Core.Admin.Http.Views.layout', [
'title' => 'Название нашей страницы',
])
@push('header')
<!-- Тут мы можем определить наши стили -->
@endpush
@push('content')
<div class="admin-header">
<h2>Заголовок страницы</h2>
<p>Описание нашей страницы</p>
</div>
<!-- Какой-то контент -->
@endpush
@push('footer')
<!-- Тут можно подгружать наш JS -->
@endpush
Безусловно, во все аргументы можно вставлять переводы через @t()
или __()
.
Примеры реализации страниц можете посмотреть в app\Core\Admin\Http\Views\pages