@pavelshavlenkov2112

Как создать кастомную страницу для создания записи в Laravel Moonshine?

Делаю админку на Laravel Moonshine. Я создал кастомную страницу со списком категорий и наткнулся на проблему, что я не могу создать кастомную страницу для создания категории.
По сути, мне нужно создать кнопку "Create" которая направит на эту страницу в которой есть форма для создания категории и уже там создать ее.

MoonShineServiceProvider.php
class MoonShineServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        app(MoonShine::class)->menu([
            MenuItem::make('Categories', new CategoryPage())
        ]);
    }
}


CategoryPage.php
class CategoryPage extends CustomPage
{
	public string $title = 'Categories';

	public string $alias = 'categories';

	public function __construct()
	{
		parent::__construct(
			$this->title(),
			$this->alias(),
			$this->view()
		);
	}

	public function view(): string
	{
		return 'custom';
	}

    public static function buildAnswers($categories, $parentId = null, $level = 0)
    {
        $result = [];

        foreach ($categories as $category) {
            if ($category['parent_id'] === $parentId) {
                $childAnswer = self::buildAnswers($categories, $category->id, $level + 1);

                $result[] = [
                    'id' => $category['id'],
                    'title' => $category['title'],
                    'cat' => !empty($childAnswer) ? $childAnswer : null,
                    'margin' => $level * 50 // Умножаем уровень на 20
                ];


            }
        }

        return $result;
    }


    public function datas(): array
	{
        return [
            'items' => self::buildAnswers(Category::all())
        ];
	}
}


custom.blade.php
@foreach($items as $item)
    <div class="alert" style="width: 300px; margin-left: {{ $item['margin'] }}px">
        <b>{{ $item['title'] }}</b>
    </div>
    @if (!empty($item['cat']))
        @include('custom', ['items' => $item['cat']])
    @endif
@endforeach

6520617d396d5688333810.jpeg
  • Вопрос задан
  • 315 просмотров
Пригласить эксперта
Ответы на вопрос 1
Не много не понял Ваших целей в создании на кастомных страниц списка категорий и создания модели. А станица редактирования данных тоже будет на кастомной? Или Вы хотите что бы страница списка была в виде дерева, с вложенностью?

Я использую Moonshine, в принципе можно сделать как Вы хотите, сделать кастомную страницу, на которой буде размещена форма для создания модели. Документация к Moonshine довольно подробная, и там хорошо, с примерами изложена информация о создании кастомных страниц.

К примеру , используя кастомные страницы Moonshin создавал функционал экспорта, импорта данных, обновления курсов валют. Возможно на данном примере Вы сможете решить свою задачу.

1. В app\Providers\MoonShineServiceProvider.php создаем пункт меню, ведущий на кастомную страницу админ панели.
MenuItem::make('Импорт товаров',
                    CustomPage::make('Excel import', 'product-import', 'admin.import.import_product', fn() => [])
                )->icon('heroicons.document-arrow-down'),

Тут можно увидеть параметры:
  • 'Excel import',< - заголовок кастомной страницы.
  • 'product-import' - slug страницы для формирования url.
  • 'admin.import.import_product', - blade шаблон view кастомной страницы, который как обычно располагается в resources/views.
  • fn() => [] Функция cfllback – в данном случае пустая, так как нет необходимости в обработке и передаче данных во view.

2. Создаем blade шаблон кастомной страницы. В моем случае он находился resources/views/'admin/import/import_product.blade.php. В данном шаблоне вы можете создать форму для создания элемента. Можно накидать свою, а можно использовать готовые UI компоненты Moonshine
Пример blade шаблон кастомной страницы.

@if (session('status'))
    <x-moonshine::alert type="success" removable="true">{{ session('status') }}</x-moonshine::alert>
@endif
@if (isset($errors) && $errors->any())
    <x-moonshine::alert type="error">
        @foreach ($errors->all() as $error)
            {{ $error }}
        @endforeach
    </x-moonshine::alert>
@endif
<form action="{{route('import.product')}}" method="post" enctype="multipart/form-data">
    @csrf
    <div class="grid grid-cols-12 gap-6">
        <div class="space-y-6 col-span-12 xl:col-span-6">
            <div class="box">
                <h2 class="box-title">Импорт данных товаров из EXCEL - файла</h2>
                <div class="grid grid-cols-12 gap-6">
                    <div class="form-group space-y-6 col-span-12 xl:col-span-9" x-show="true" id="wrapper_">
                        <label class="form-label" for="file">
                            Excel файл
                        </label>
                        <div class="form-group form-group-dropzone">
                            <input class="form-input form-file-upload" type="file" name="file" accept="*/*">
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <div class="space-y-6 col-span-12 xl:col-span-12">
        <div class="mt-3 flex w-full flex-wrap justify-start gap-2">
            <button type="submit" class="btn btn-primary form_submit_button">Отправить</button>
        </div>
    </div>
</form>


2. Action – ссылка формы ведет на контроллер, точнее метод обработчик – создания модели. Создаем роут для ссылки
Route::post('/moonshine/product-import', [App\Http\Controllers\Admin\Import\ImportController::class, 'importProduct'])->name('import.product');

4. Создать конроллер и соответствующий метод для валидации и сохранения данных из формы.


А вообще MoonShine имеет довольно большое и дружелюбное комьюнити, где сами разработчики и опытные пользователи быстро помогаю решать различные задачи, дают советы и отвечаю на вопросы. Тут можно получить ответы на вопросы связанные с MoonShine - t.me/laravel_chat

P.S
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы