Раздел «Архив» для вашего сайта на Laravel

Готовый пример приложения показан на рисунке (для постов взяты случайные данные (fzaninotto/faker)):В боковой панели цифра в скобках – это количество постов, относящихся к каждой дате.

Подготовка: работа с БД и вывод постов на страницу

Подготовка: работа с БД и вывод постов на страницу — Работа с БД Создадим таблицу постов (posts) и заполним их случайными данными. 

Для создания таблицы воспользуемся Laravel-миграциями. Для работы приложения нам также потребуются модель Post, чтобы одновременно создать файл модели и файл миграции воспользуемся консолью:

php artisan make:model Post –m

Откроем только что созданный файл миграции (папка database/migrations). Изменим содержимое функции up(), после чего она будет выглядеть следующим образом:

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->text('body');
        $table->timestamps();
    });
}

Как видно по коду, посты будут состоять из заголовка и тела поста. В данном случае нам этого будет достаточно. 

Для создания таблицы в БД выполним следующую команду: php artisan migrate Таблицу мы создали, теперь нужно заполнить ее данными. Вручную мы этого делать не будем, а заполним таблицу случайным образом. 

Откроем файл ModelFactory.php (папка database/factories) и пропишем в конец файла следующий код:

$factory->define(App\Post::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->sentence,
        'body' => $faker->text,
    ];
});

Данный код заполнит содержимое поста случайными данными. Но естественно нам нужен не один пост, а несколько. Для этого нужно создать отдельный класс, в нашем случае PostsTableSeeder. Чтобы создать класс можно воспользоваться следующей командой:

php artisan make:seeder PostsTableSeeder

Откроем созданный класс (папка database/seeds) и в функцию run() добавим следующий код:

factory(App\Post::class, 10)->create();

После того как этот код отработает, будут созданы 10 постов. 

Чтобы фреймворк знал, что класс PostsTableSeeder нужно запустить откроем файл DatabaseSeeder.php (эта же папка) и в функцию run() добавим вызов класса:

$this->call(PostsTableSeeder::class);

Теперь осталось выполнить команду:

php artisan db:seed

После чего таблица posts будет заполнена десятью записями постов. Следующим шагом нужно будет вывести посты на страницу сайта. 

Вывод постов
По умолчанию в Laravel добавлен вид welcome (папка resources/views) с ним и будем работать в этом проекте. Откроем файл welcome.blade.php и изменим его содержимое на следующее:

<!doctype html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Laravel</title>
        <!-- Styles -->
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            h1, h2, h3, h4, li, article {
                margin: 10px 0;
            }
            html, body {
                font-size: 16px;
                margin: 0;
                font-family: sans-serif;
            }
            .container {
                max-width: 1000px;
                margin: auto;
                display: flex;
                align-items: flex-start;
            }
            .container > aside {
                margin-right: 50px;
                background-color: #f4f4f4;
                padding: 30px 10px;
                border-top: none;
                min-width: 200px;
                text-align: center;
            }
            .container > aside > ul {
                list-style-type: none;
            }
            .container > aside > ul >li > a {
                color: darkorange;
            }
            article:not(:last-child) {
                padding-bottom: 10px;
                border-bottom: 2px dotted orange;
            }
        </style>
    </head>
    <body>
        <div class="container">
            <aside>
                <h3>Архив</h3>
                <ul>
                    <li><a href="#">Январь</a></li>
                    <li><a href="#">Февраль</a></li>
                    <li><a href="#">Март</a></li>
                </ul>
            </aside>
            <posts>
                @forelse ($posts as $post)
                    <article>
                        <h1>{{$post->title}}</h1>
                        <h4>Дата создания: {{$post->created_at}}</h4>
                        <p>{{$post->body}}</p>
                    </article>
                @empty
                    <p>Здесь пока ничего нет.</p>
                @endforelse
            </posts>
        </div>
    </body>
</html>

Как вы можете видеть, в файл включены стили, сделано это для упрощения. 

Страница будет состоять из боковой панели с разделом «Архив» (внутри тега <aside>) и основного содержимого с набором постов (внутри тега <posts>). 

В файл уже включены директивы шаблонизатора Blade для вывода следующих данных из БД:

  • заголовок поста – {{$post->title}}
  • дата создания – {{$post->created_at}}
  • тело поста – {{$post->body}}

Переменную $post мы будем передавать из контроллера PostsController, который мы еще не создали. Давайте сейчас это и сделаем. 

Чтобы создать контроллер, выполним следующую команду:

php artisan make:controller PostsController

После чего откроем созданный файл PostsController.php (папка app/Http/Controllers) и добавим функцию index(), которая будет отрабатывать при переходе на главную страницу сайта. Содержимое функции должно быть следующим:

public function index()
{
    $posts = \App\Post::latest()->get();
    return view('welcome', compact('posts'));
}

Здесь в переменную $posts мы получаем список всех постов и передаем ее в вид welcome. 

Осталось изменить маршрут для главной страницы сайта (/), включив в него вызов созданного контроллера. 

Откроем файл web.php (папка routes) и изменим метод get() следующим образом:

Route::get('/', 'PostsController@index');

После чего при переходе на сайт вы должны увидеть такую картину:В следующем разделе (см. содержание) мы выведем список месяцев из БД и добавим фильтрацию выводимых постов.

Реализация основного функционала (список месяцев и фильтрация)

Для начала изменим даты в БД, чтобы список раздела «Архив» состоял не из одного пункта. 

Откроем файл welcome.blade.php (папка resources/views). Изменим содержимое тега