8. Страница вывода категорий. Админка

07 Июня 2020 00:13 (Редактировано: 08 Июня 2020 03:01)

Проверка маршрутов и создание контроллера

Список маршрутов для админки:

Method URI Name Description
POST admin/blog/categories blog.admin.categories.store Сохранение новой категории
GET | HEAD admin/blog/categories blog.admin.categories.index Страница со списком всех категорий
GET | HEAD admin/blog/categories/create blog.admin.categories.create Страница создания категорий
PUT | PATCH admin/blog/categories/{category} blog.admin.categories.update Страница обновления
GET | HEAD admin/blog/categories/{category}/edit blog.admin.categories.edit Страница редактирования. Отсюда будет осуществляться переход в update

Теперь работаем с файлом CategoryController.php. Приводим его в следующий вид:

<?php

namespace App\Http\Controllers\Blog\Admin;

use App\Models\BlogCategory;
use Illuminate\Http\Request;

class CategoryController extends BaseController
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $dsd = BlogCategory::all();
        $paginator = BlogCategory::paginate(5);

        dd($dsd, $paginator);

        return view('blog.admin.category.index', compact('paginator'));
    }
    ...

Как видно, делаем наследование от BaseController и в index добавили инструменты работы с пагинацией. Пагинацию берем из BlogCategory, который мы ранее прописали и который наследуется от ларавелевского Model

Далее можно по тестировать с помощью dd() и посмотреть какие параметры есть у категорий и пагинации.

Примечание. Чтобы PHPStorm не отмечал нам метод pagination как отсутствующий, добавляем в BlogCategory.php вот это use Eloquent; и добавляем комментарий 

/**
 * BlogCategory
 *
 * @mixin Eloquent
 */

Создание шаблона

Создаем страницу с версткой для работы с категориями в админке. Для этого создаем файл по такому пути: project.loc\resources\views\blog\admin\category\index.blade.php. Если каких то директорий не хватает - создаем их.

Добавляем в него следующее содержимое:

@extends('layouts.app')

@section('content')
    <div class="container">
        <div class="row justify-content-center">
            <div class="col-md-12">
                <nav class="navbar navbar-toggleable-md navbar-light bg-faded">
                    <a class="btn btn-primary" href="{{ route('blog.admin.categories.create') }}">Добавить</a>
                </nav>
                <div class="card">
                    <div class="card-body">
                        <table class="table table-hover">
                            <thead>
                                <tr>
                                    <th>#</th>
                                    <th>Категория</th>
                                    <th>Родитель</th>
                                </tr>
                            </thead>
                            <tbody>
                                @foreach($paginator as $item)
                                    @php /** @var \App'models\BlogCategory $item */ @endphp
                                    <tr>
                                        <td>{{ $item->id  }}</td>
                                        <td>
                                            <a href="{{ route('blog.admin.categories.edit', $item->id) }}">
                                                {{ $item->title }}
                                            </a>
                                        </td>
                                        <td @if(in_array($item->parent_id, [0, 1])) style="color: #ccc" @endif>
                                            {{ $item->parent_id }}{{-- $item->parentCategory->title --}}
                                        </td>
                                    </tr>
                                @endforeach
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
        @if($paginator->total() > $paginator->count())
            <br>
            <div class="row justify-content-center">
                <div class="col-md-12">
                    <div class="card">
                        <div class="card-body">
                            {{ $paginator->links() }}
                        </div>
                    </div>
                </div>
            </div>
        @endif
    </div>
@endsection

Здесь как и на этом этапе, мы наследуем этот шаблон от главного layouts.app. и размечаем область content. Здесь все просто - за основу берется шаблон app.index.php из директории layouts, а вместо секции content будет подставлена эта верстка.

Основные действия:

  • 8 строка. В этой кнопке  <a class="btn btn-primary" href="{{ route('blog.admin.categories.create') }}">Добавить</a> мы в качестве ссылки указываем функцию Хелпера laravel, которая сформирует нам ссылку по необходимому маршруту. Ссылка на документацию - https://laravel.com/docs/7.x/helpers#method-route
  • 21-34 строки. Формируем вывод категорий.

Примечание. Чтобы работали клики по $item в PHPStorm мы прописываем в 22 строке в виде комментария php такую конструкцию 

@php /** @var \App'models\BlogCategory $item */ @endphp
  • Строка 26. Мы опять формируем ссылку, но уже на редактирование конкретной категории, при этом, передавая айдишник редактируемой категории вторым параметром в route();.
  • Строки 30-32. Мы определяем есть ли у категории родитель и если нет то можем, например, прописать какой-нибудь особый стиль для нее, в данном случае - это серый цвет color: #ccc.
  • Строки 41-52. Условие - если общее количество записей больше количество текущего набора (мы брали по 5, а всего 11) то формируем верстку с пагинацией.

Результат