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
  

Поделиться статьей с друзьями:

  

Комментарии к статье