Laravel - вывод хлебных крошек
воскресенье, 13 января 2019 04:26:51, написал Admin
Настройка хлебных крошек в Larevel с использованием davejamesmiller/laravel-breadcrumbs
Полная инструкция по установке https://github.com/davejamesmiller/laravel-breadcrumbs
Пример приведен для блога на Voyager.
Установка:
composer require davejamesmiller/laravel-breadcrumbs:5.x
Если в проекте используется не bootsrap4, а что-то другое, то тогда выполняем
php artisan vendor:publish --provider="DaveJamesMiller\Breadcrumbs\BreadcrumbsServiceProvider"
и в конфиге config/breadcrumbs.php
меняем строку
'view' => 'breadcrumbs::bootstrap4',
на одно из следующих значений:
- breadcrumbs::bootstrap4 – Bootstrap 4
- breadcrumbs::bootstrap3 – Bootstrap 3
- breadcrumbs::bootstrap2 – Bootstrap 2
- breadcrumbs::bulma – Bulma
- breadcrumbs::foundation6 – Foundation 6
- breadcrumbs::materialize – Materialize
- breadcrumbs::uikit – UIkit
- breadcrumbs::json-ld – JSON-LD Structured Data (<script> tag, no visible output)
Создаем файл routes/breadcrumbs.php с таким содержанием
<?php // Home Breadcrumbs::for('home', function ($breadcrumbs) { // $breadcrumbs->parent('home'); $breadcrumbs->push('Главная', route('home')); }); // Home > Welcome Breadcrumbs::for('welcome', function ($breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push('Welcome', route('welcome')); }); // Home > Contact Breadcrumbs::for('contact', function ($breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push('Форма обратной связи', route('contacts')); }); // Home > Blog Breadcrumbs::for('blog', function ($breadcrumbs) { $breadcrumbs->parent('home'); $breadcrumbs->push('Блог', route('blog.index')); }); // Home > Blog > [Category] > [Post] Breadcrumbs::for('post', function ($breadcrumbs, $post) { $breadcrumbs->parent('category', $post->category); $breadcrumbs->push($post->title, route('blog.show', $post->slug)); }); // Home > Blog > Archive Breadcrumbs::for('archive', function ($breadcrumbs, $title, $year, $month) { $breadcrumbs->parent('blog'); $breadcrumbs->push($title, route('blog.archive', ['year' => $year, 'month' => $month])); }); // Home > Blog > Category Breadcrumbs::for('category', function ($trail, $category) { if ($category->parentId) { $trail->parent('category', $category->parentId); } else { $trail->parent('blog'); } $trail->push($category->name, route('blog.category', $category->slug)); }); // Home > Blog > Tag Breadcrumbs::for('tag', function ($breadcrumbs, $tag) { $breadcrumbs->parent('blog'); $breadcrumbs->push('Статьи с тэгом '.$tag->title, route('blog.tag', ['slug' => $tag->slug])); }); // Home > [Page] Breadcrumbs::for('page', function ($breadcrumbs, $page) { $breadcrumbs->parent('home'); $breadcrumbs->push($page->title, route('page', $page->slug)); });
Обратите внимание на рекурсивный обход категорий в category и post
В лайоуте прописываем
@yield('breadcrumbs')
Во вью делаем вызов
@section('breadcrumbs', Breadcrumbs::render('post', $article))
Вот что получилось
С моделью категории Voyager у меня возникли проблемы. Там отношения описаны как
public function parentId() { return $this->belongsTo(self::class); }
И во вью breadcrumbs не цепляется
$category->parentId
возвращает null. Потому что надо
public function parentId() { return $this->belongsTo(self::class, 'parent_id'); }
В итоге скопирвал класс TCG\Voyager\Models\Category в App\Category и поправил функцию. Конечный листинг:
<?php namespace App; use Illuminate\Database\Eloquent\Model; use TCG\Voyager\Facades\Voyager; use TCG\Voyager\Traits\Translatable; class Category extends Model { use Translatable; protected $translatable = ['slug', 'name']; protected $table = 'categories'; protected $fillable = ['slug', 'name']; public function posts() { return $this->hasMany(Voyager::modelClass('Post')) ->published() ->orderBy('created_at', 'DESC'); } public function parentId() { return $this->belongsTo(self::class, 'parent_id'); } }Breadcrumbs Laravel Laravel