2016-12-19 13 views
0

Я хочу отметить меню навигации как «активное», когда URL-адрес соответствует запросу.Laravel 5.3: Как включить меню навигации как активное, когда запрос соответствует URL-адресу (с языком)

Это работает отлично:

<div class="sidebar"> 
      <ul class="sidebar-menu"> 
        <li {{{ (Request::is('en/dashboard') ? 'class=active' : '') }}}> 
          <a href="/{{ App::getLocale() }}/dashboard"> 
            <i class="fa fa-dashboard"></i> <span>{{ trans('sidebar.dashboard') }}</span> 
          </a> 
        </li> 

        <li {{{ (Request::is('en/settings') ? 'class=active' : '') }}}> 
          <a href="/{{ App::getLocale() }}/settings"> 
            <i class="fa fa-gears"></i> <span>{{ trans('sidebar.settings') }}</span> 
          </a> 
        </li> 
      </ul> 
    </div> 

К сожалению, это работает только и маркировки меню навигации, когда URL используется код языка «EN». Но как заменить статическую строку «en» на что-то более динамичное?

Я уже пытался решить эту проблему, используя этот код, но он не работает:

<li {{{ (Request::is('{{ App::getLocale() }}/dashboard') ? 'class=active' : '') }}}> 

Какой самый лучший способ решить эту проблему?

ответ

1

Я сейчас, используя это решение, которое работает очень хорошо и держит нож в чистоте.

Прежде всего, дать каждому из ваших маршрутов уникальное имя в routes/web.php: (., Например, resources/views/layouts/admin/navbar.blade.php)

<?php 

    /* 
    |-------------------------------------------------------------------------- 
    | Web Routes 
    |-------------------------------------------------------------------------- 
    | 
    | Here is where you can register web routes for your application. These 
    | routes are loaded by the RouteServiceProvider within a group which 
    | contains the "web" middleware group. Now create something great! 
    | 
    */ 

    Route::get('/admin/dashboard', '[email protected]')->name('dashboard'); 
    Route::get('/admin/maintenances', '[email protected]')->name('maintenances-overview'); 
    Route::get('/admin/users', '[email protected]')->name('users-overview'); 

В навигационном клинка, теперь вы можете просто ссылаться на эти имена:

<li class="{{ Route::currentRouteName() == 'dashboard' ? 'active' : '' }}"> 
     <a href="{{ route('dashboard') }}">Dashboard</a> 
    </li> 

    <li class="{{ Route::currentRouteName() == 'maintenances-overview' ? 'active' : '' }}"> 
     <a href="{{ route('maintenances-overview') }}">Maintenances</a> 
    </li> 

    <li class="{{ Route::currentRouteName() == 'users-overview' ? 'active' : '' }}"> 
     <a href="{{ route('users-overview') }}">Users</a> 
    </li> 

Это решение также очень полезно, если у вас многоязычный сайт, потому что вам не нужно использовать регулярные выражения для определения, если он теперь соответствует URL-адресу или нет. Вы также можете редактировать и обновлять URL-адреса маршрутов независимо от того, что вы хотите, без необходимости обновления всех ваших blade-серверов, только потому, что URL-адрес был изменен. Функция route() возвращает автомат. обновленный URL-адрес и функция Route::currentRouteName() всегда возвращают заданное имя вашего маршрута.:)

Так же, как намек на многоязычных сайтов: Вы можете просто заменить статический текст Users с переменной языка:

<li class="{{ Route::currentRouteName() == 'users-overview' ? 'active' : '' }}"> 
     <a href="{{ route('users-overview') }}">@lang('layouts/admin/navbar.users')</a> 
    </li> 

Для получения дополнительной информации о локализации, пожалуйста, посмотрите на laravel.com localization documentation

1

Обычно, у меня есть макет с этими навигационными элементами, предоставленных текущим видом, так что-то вроде:

<li><a href="{{ url("home") }}>Home</a></li> 
<li><a href="{{ url("about") }}>About</a></li> 
<li><a href="{{ url("contact") }}>Contact</a></li> 

Тогда мои маршрутов:

Route::get("/home", "[email protected]"); 

Затем в моем контроллере:

public function getHome(){ 
    return view("home")->with(["page" => "home"]); 
} 

Теперь, когда мой взгляд home.blade.php имеет переданный ему $page, а si сть он расширяет .blade файл с отрезком нав (обычно @extends("layouts.master") или что-то), вы можете получить доступ и проверить переменную $page против этих навигационных элементов:

<li class="{{ $page == "home" ? "active" : "" }}><a href="{{ url("/home") }}>Home</a></li> 

Таким образом, вам не придется беспокоиться о совпадающих маршрутах в нескольких языков на их активную страницу. Единственным недостатком является то, что вам нужно включить ->with(["page" => "whatever"]) в каждый из ваших контроллеров, который возвращает представление, которое расширяет этот макет Nav. Там может быть более простой способ сделать это, но это должно дать вам начало.

+0

И как вы определяете язык и, например, изменяете меню навигации, например «Настройки», на немецкую версию «Einstellungen»? – user2966991

+0

Это обрабатывается с помощью 'trans()', с папками для 'en',' fr', ect и т. Д. (Не уверен, что такое код языка для немецкого), и тогда у вас будет такая ссылка: '

  • {{ trans("urls.home") }}
  • '. 'urls' будет файлом в каждой из папок' resources/lang', которая будет содержать массив всех применимые переводы. Итак, для английского языка: 'return [" settings "=>" Settings "];' и по-немецки 'return [" settings "=>" Einstellungen "];' –

    +0

    Вам нужно будет прочитать docs https://laravel.com/docs/5.3/localization, чтобы лучше справляться с локализацией –

    0

    Это simple.Just сделать следующее в файл, который содержит ваш заголовок или Navbar и ссылки:

    <li class="{{ (Request::path()=='nameofyourfile' ? 'active' : '') }}"> 
    <a href="{{ route('nameofyourfile') }}"> 
             <span class="icon fa fa-building-o" aria-hidden="true"></span><span class="title">nameofyourfile</span> 
                   </a></li> 
    

     Смежные вопросы

    • Нет связанных вопросов^_^