7. Управление категориями. Часть 2

Добавление новых категорий

В app/Http/Controllers/Admin/CategoryController.php в методе create пропишем:

public function create()
    {
        return view('admin.categories.create');
    }

Создадим вид resources/views/admin/categories/create.blade.php с содержимым:

@extends('admin.layouts.layout');

@section('content')
    <form action="{{ route('categories.store') }}" method="post">
        @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="card-footer">
                <button type="submit" class="btn btn-primary">Создать</button>
            </div>
        </div>
    </form>
@endsection

В app/Models/Category.php добавим свойство fillable. Оно разрешает заполнять указанные поля.

protected $fillable = ['title'];

В app/Http/Controllers/Admin/CategoryController.php в метод store (сохранение нашей категории) добавим валидацию и сообщение об успешно добавленной категории:

public function store(Request $request)
{
    $request->validate([
        'title' => 'required',
        ]);
    Category::create($request->all());
    // $request->session()->flash('success', 'Категория добавлена!'); // flash message
    return redirect()->route('categories.index')->with('success', 'Категория добавлена!'); // similarly flash message
}

Показ ошибок валидации

В resources/views/admin/layouts/layout.blade.php в .content-wrapper добавим:

<div class="content-wrapper mb-2">

    @if ($errors->any())
        <div class="alert alert-danger">
            <ul class="list-unstyled">
                @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                @endforeach
            </ul>
        </div>
    @endif

    @if (session()->has('success'))
        <div class="alert alert-success">
            <ul class="list-unstyled">
                {{ session('success') }}
            </ul>
        </div>
    @endif

Всё. Создание новых категорий должно работать.

Валидация в отдельном файле

В консоли выполним команду:

php artisan make:request StoreCategory

Должен создастся файл app/Http/Requests/StoreCategory.php . В нем два метода authorize и rules. Метод authorize проверяет, авторизован ли пользователь. Изменим его:

public function authorize()
{
    return true;
}

А rules — это как раз правила валидации формы. В нем мы можем записать нашу валидацию:

public function rules()
{
    return [
        'title' => 'required',
    ];
}

В файле app/Http/Controllers/Admin/CategoryController.php изменим метод store :

public function store(StoreCategory $request)
{
    Category::create($request->all());
    return redirect()->route('categories.index')->with('success', 'Категория добавлена!');
}

Получаем ту же валидацию, что и была.

Редактирование категорий

В app/Http/Controllers/Admin/CategoryController.php редактируем метод edit :

public function edit($id)
{
    $category = Category::find($id);
    return view('admin.categories.edit', compact('category'));
}

Создадим файл resources/views/admin/categories/edit.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>Редактирование категории "{{ $category->title }}"</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('categories.update', ['category' => $category->id]) }}" method="post">
            @csrf
            @method('PUT')
            <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"
                           value="{{ $category->title }}" autocomplete="off" name="title">
                </div>
                <div class="card-footer">
                    <button type="submit" class="btn btn-primary">Изменить</button>
                </div>
            </div>
        </form>
    </section>
    <!-- /.content -->
@endsection

 

Метод update

В app/Http/Controllers/Admin/CategoryController.php в метод update добавим:

public function update(Request $request, $id)
{
    $request->validate([
        'title' => 'required',
    ]);
    $category = Category::find($id);
    //$category->slug = null; // чтобы изменялся слаг при редактировании
    $category->update($request->all());
    return redirect()->route('categories.index')->with('success', 'Категория изменена!');
}

Удаление категории

В app/Http/Controllers/Admin/CategoryController.php редактируем метод destroy :

public function destroy($id)
{
    $category = Category::find($id);
    if ($category->posts->count()) {
        return redirect()->route('categories.index')->with('error', 'У этой категории есть записи. Сначало удалите их!');
    }
    //Category::destroy($id);
    $category->delete();
    return redirect()->route('categories.index')->with('success', 'Категория удалена!');
}

В resources/views/admin/layouts/layout.blade.php добавим вывод сообщения об ошибках:

@if (session()->has('error'))
    <div class="alert alert-danger">
        <ul class="list-unstyled">
            {{ session('error') }}
        </ul>
    </div>
@endif

 

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии