Controller
Создаём PostController. Делаем тоже, что и что и с контроллером TagController . Копируем все из CategoryController, заменяем, добавляем новые элементы из https://adminlte.io/themes/v3/
View
Создаем вью resources/views/admin/posts/create.blade.php :
@extends('admin.layouts.layout'); @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Создание статьи</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Главная</a></li> <li class="breadcrumb-item active">Создание статьи</li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <form action="{{ route('posts.store') }}" method="post" enctype="multipart/form-data"> @csrf <div class="card-body"> <div class="form-group"> <label for="title">Статья</label> <input type="text" class="form-control @error('title') is-invalid @enderror" id="title" placeholder="Название" autocomplete="off" name="title"> </div> <div class="form-group"> <label for="description">Цитата</label> <textarea name="description" class="form-control @error('description') is-invalid @enderror" rows="3" id="description" placeholder="Цитата ..."></textarea> </div> <div class="form-group"> <label for="content">Контент</label> <textarea name="content" class="form-control @error('content') is-invalid @enderror" rows="3" id="content" placeholder="Контент ..."></textarea> </div> <div class="form-group"> <label for="category_id">Категория</label> <select name="category_id" id="category_id" class="form-control @error('category_id') is-invalid @enderror"> @foreach ($categories as $k => $v) <option value="{{ $k }}">{{ $v }}</option> @endforeach </select> </div> <div class="form-group"> <label for="tags">Тэги</label> <select name="tags[]" id="tags" class="select2 @error('tags') is-invalid @enderror" multiple="multiple" data-placeholder="Выберите тэги" style="width: 100%;"> @foreach ($tags as $k => $v) <option value="{{ $k }}">{{ $v }}</option> @endforeach </select> </div> <div class="form-group"> <label for="thumbnail">Выберите изображение</label> <div class="input-group"> <div class="custom-file"> <input type="file" name="thumbnail" class="custom-file-input @error('thumbnail') is-invalid @enderror" id="thumbnail"> <label class="custom-file-label" for="thumbnail">Выберите файл</label> </div> </div> </div> <div class="card-footer"> <button type="submit" class="btn btn-primary">Создать</button> </div> </div> </form> </section> <!-- /.content --> @endsection
И index.blade.php :
@extends('admin.layouts.layout'); @section('content') <!-- Content Header (Page header) --> <section class="content-header"> <div class="container-fluid"> <div class="row mb-2"> <div class="col-sm-6"> <h1>Статьи</h1> </div> <div class="col-sm-6"> <ol class="breadcrumb float-sm-right"> <li class="breadcrumb-item"><a href="#">Главная</a></li> </ol> </div> </div> </div><!-- /.container-fluid --> </section> <!-- Main content --> <section class="content"> <a href="{{ route('posts.create') }}"> <button type="button" class="btn btn-primary">Добавить статью</button> </a> @if (!empty($posts->count())) <div class="card-body"> <table class="table table-bordered"> <thead> <tr> <th style="width: 10px">id</th> <th>Название</th> <th>Категория</th> <th>Тэги</th> <th>Дата</th> <th style="width: 50px">Действия</th> </tr> </thead> <tbody> @foreach ($posts as $post) <tr> <td>{{ $post->id }}.</td> <td>{{ $post->title }}</td> <td>{{ $post->category->title }}</td> <td>{{ $post->tags->pluck('title')->join(', ') }}</td> <td>{{ $post->created_at }}</td> <td style="display: flex;"> <a href="{{ route('posts.edit', ['post' => $post->id]) }}"> <button type="submit" class="btn btn-success btn-sm mr-2"><i class="fas fa-edit"></i> </button> </a> <form method="post" action="{{ route('posts.destroy', ['post' => $post->id]) }}"> @csrf @method('DELETE') <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm('Подтвердите удаление!')"><i class="fas fa-trash-alt"></i></button> </form> </td> </tr> @endforeach </tbody> </table> {{ $posts->links() }} </div> @else <div>Статей пока нет!</div> @endif </section> <!-- /.content --> @endsection
Плагин select2
Скопируем файлы из папки AdminLTE/plugins папки select2 и select2-bootstrap4-theme в resources/assets/admin/plugins.
В файл resources/assets/admin/js/demo.js внесем код для инициализации select2 :
$('.select2').select2()
Подключим нужные нам стили и скрипты в webpack.min.js в том порядке, в котором они подключаются на исходной странице https://adminlte.io/themes/v3/pages/forms/advanced.html .
Также добавим файлы плагина bs-custom-file-input . Они нам понадобятся для формы загрузки картинки к посту. Чтобы вместо «Choose file…» отображалось название нашей картинки.
mix.scripts([ 'resources/assets/admin/plugins/jquery/jquery.min.js', 'resources/assets/admin/plugins/bootstrap/js/bootstrap.bundle.min.js', 'resources/assets/admin/plugins/bs-custom-file-input/bs-custom-file-input.js', 'resources/assets/admin/plugins/select2/js/select2.full.js', 'resources/assets/admin/js/adminlte.min.js', 'resources/assets/admin/js/demo.js', ], 'public/assets/admin/admin.js'); mix.styles([ 'resources/assets/admin/plugins/fontawesome-free/css/all.min.css', 'resources/assets/admin/plugins/select2/css/select2.css', 'resources/assets/admin/plugins/select2-bootstrap4-theme/select2-bootstrap4.css', 'resources/assets/admin/css/adminlte.min.css', 'resources/css/app.css' ], 'public/assets/admin/admin.css');
И добавим в скрипт resources/views/admin/layouts/layout.blade.php инициализацию скрипта bs-custom-file-input :
<script> $(function () { bsCustomFileInput.init(); }); </script>
И соберем заново наши фронтэнд:
npm run dev