В новом уроке мы с вами настроим административную панель для нашего Telegram бота. Мы с вами создадим страницу для добавления статей конституции и страницу для просмотра информации о пользователях.
С MoonShine разработка административной панели приносит одно удовольствие. Мы по сути собираем страницы из ранее заготовленных секций используя готовый код.
Вот так выглядит административная панель до внесения изменений.
Таблицы со списками элементов и страницы редактирования элементов завязаны на Resource классах.
Создание ресурсов
Нам необходимо создать 3 класса-ресурса:
- ArticleResource — для работы со статьями
- BotUserResource — для работы с пользователями бота
- ChapterResource — для работы с главами конституции
Для создания ресурсов необходимо запустить следующие команды:
php artisan moonshine:resource Article
php artisan moonshine:resource BotUser
php artisan moonshine:resource Chapter
После запуска данных команд в директории app/MoonShine/Resources появятся ресурсы.
Добавление новых разделов в меню
Для добавления новых разделов в меню, добавим в результат метода menu() дополнительные элементы.
Код файла MoonShineServiceProvider.php
declare(strict_types=1);
namespace App\Providers;
use App\MoonShine\Resources\ArticleResource;
use App\MoonShine\Resources\BotUserResource;
use App\MoonShine\Resources\ChapterResource;
use MoonShine\Providers\MoonShineApplicationServiceProvider;
use MoonShine\MoonShine;
use MoonShine\Menu\MenuGroup;
use MoonShine\Menu\MenuItem;
use MoonShine\Resources\MoonShineUserResource;
use MoonShine\Resources\MoonShineUserRoleResource;
use MoonShine\Contracts\Resources\ResourceContract;
use MoonShine\Menu\MenuElement;
use MoonShine\Pages\Page;
use Closure;
class MoonShineServiceProvider extends MoonShineApplicationServiceProvider
{
/**
* @return list<ResourceContract>
*/
protected function resources(): array
{
return [];
}
/**
* @return list<Page>
*/
protected function pages(): array
{
return [];
}
/**
* @return Closure|list<MenuElement>
*/
protected function menu(): array
{
return [
MenuItem::make('Статьи', new ArticleResource()),
MenuItem::make('Главы', new ChapterResource()),
MenuItem::make('Пользователи', new BotUserResource()),
MenuGroup::make(static fn() => __('moonshine::ui.resource.system'), [
MenuItem::make(
static fn() => __('moonshine::ui.resource.admins_title'),
new MoonShineUserResource()
),
MenuItem::make(
static fn() => __('moonshine::ui.resource.role_title'),
new MoonShineUserRoleResource()
),
]),
MenuItem::make('Documentation', 'https://moonshine-laravel.com/docs')
->badge(fn() => 'Check')
->blank(),
];
}
/**
* @return Closure|array{css: string, colors: array, darkColors: array}
*/
protected function theme(): array
{
return [];
}
}
Настройка ресурсов
Важные параметры ресурсов
Модель которая должна быть привязана к разделу
protected string $model = Article::class;
Название раздела
protected string $title = 'Статьи';
Параметры полей сущности
public function fields() {}
Описание полей для ArticleResource
public function fields(): array
{
return [
Block::make([
ID::make()->sortable(),
Number::make('Статья', 'article')->sortable()->required(),
Number::make('Часть', 'chapter')->sortable()->required(),
Number::make('Раздел', 'section')->required(),
Textarea::make('Текст', 'text')->required()
]),
];
}
Описание полей для BotUserResource
public function fields(): array
{
return [
Block::make([
ID::make()->sortable(),
Text::make('Имя пользователя', 'text', function (BotUser $botUser) {
$fullName = (!empty($botUser->lastname)) ? $botUser->lastname . " " : "";
$fullName .= (!empty($botUser->firstname)) ? $botUser->firstname . " " : "";
return $fullName;
})->readonly(),
Text::make('Логин', 'username')->readonly(),
Text::make('Дата изменения', 'updated_at')->readonly(),
Text::make('Дата создания', 'created_at')->readonly(),
]),
];
}
Описание полей для ChapterResource
public function fields(): array
{
return [
Block::make([
ID::make()->sortable(),
Text::make('Название', 'title'),
Text::make('Дата изменения', 'updated_at')->readonly(),
Text::make('Дата создания', 'created_at')->readonly(),
]),
];
}
Итог
После добавления разделов админка будет выглядеть так