Laravel 5.3:当请求与 URL(含语言)匹配时,如何将导航菜单标记为活动菜单
Laravel 5.3: How-to mark navigation menu as active, when the request matches the URL (with language)
我想在 URL 匹配请求时将导航菜单标记为 "active"。
这工作正常:
<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' : '') }}}>
解决这个问题的最佳方法是什么?
通常,我有一个布局,其中包含由当前视图扩展的这些导航项,例如:
<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", "BasicController@getHome");
然后在我的控制器中:
public function getHome(){
return view("home")->with(["page" => "home"]);
}
现在我的视图 home.blade.php
有一个 $page
被传递给它,因为它扩展了带有导航部分的 .blade
文件(通常是 @extends("layouts.master")
或其他东西) 您可以针对这些导航项访问和检查 $page
变量:
<li class="{{ $page == "home" ? "active" : "" }}><a href="{{ url("/home") }}>Home</a></li>
这样您就不必担心将多种语言的路由匹配到他们的活动页面。唯一的缺点是您需要在每个控制器中包含一个 ->with(["page" => "whatever"])
,returns 一个扩展该导航布局的视图。可能有更简单的方法来完成此操作,但这应该给您一个开始。
它 simple.Just 在包含 header 或导航栏和链接的文件中执行以下操作:
<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>
我现在正在使用这个解决方案,效果很好,并且 blade 保持清洁。
首先,在 routes/web.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', 'DashboardController@getAll')->name('dashboard');
Route::get('/admin/maintenances', 'MaintenanceController@get')->name('maintenances-overview');
Route::get('/admin/users', 'UserController@getUsers')->name('users-overview');
在您的导航 blade(例如 resources/views/layouts/admin/navbar.blade.php
)中,您现在可以简单地引用这些名称:
<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>
当您有一个 multi-language 站点时,此解决方案也非常有用,因为您不必使用正则表达式来确定它现在是否匹配 URL。您还可以编辑和更新您的路由 URLs 到您想要的任何内容,而无需更新所有 blades,只是因为 URL 已更改。 route()
函数 returns 自动。更新后的 URL 和 Route::currentRouteName()
函数总是 return 设置您的路线名称。 :)
正如对 multi-language 站点的提示:您可以简单地将静态文本 Users
替换为语言变量:
<li class="{{ Route::currentRouteName() == 'users-overview' ? 'active' : '' }}">
<a href="{{ route('users-overview') }}">@lang('layouts/admin/navbar.users')</a>
</li>
有关本地化的更多信息,请查看 laravel.com localization documentation
只需将这个小功能代码放入您的助手中即可 class
function is_current_route($route){
return Route::currentRouteName() == $route ? 'class=active' : '';
}
并在您的视图中像这样使用它
<li {{is_current_route('your-route-name-here')}}>
<a href="{{ url("/home") }}>Home</a>
</li>
我想在 URL 匹配请求时将导航菜单标记为 "active"。
这工作正常:
<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' : '') }}}>
解决这个问题的最佳方法是什么?
通常,我有一个布局,其中包含由当前视图扩展的这些导航项,例如:
<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", "BasicController@getHome");
然后在我的控制器中:
public function getHome(){
return view("home")->with(["page" => "home"]);
}
现在我的视图 home.blade.php
有一个 $page
被传递给它,因为它扩展了带有导航部分的 .blade
文件(通常是 @extends("layouts.master")
或其他东西) 您可以针对这些导航项访问和检查 $page
变量:
<li class="{{ $page == "home" ? "active" : "" }}><a href="{{ url("/home") }}>Home</a></li>
这样您就不必担心将多种语言的路由匹配到他们的活动页面。唯一的缺点是您需要在每个控制器中包含一个 ->with(["page" => "whatever"])
,returns 一个扩展该导航布局的视图。可能有更简单的方法来完成此操作,但这应该给您一个开始。
它 simple.Just 在包含 header 或导航栏和链接的文件中执行以下操作:
<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>
我现在正在使用这个解决方案,效果很好,并且 blade 保持清洁。
首先,在 routes/web.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', 'DashboardController@getAll')->name('dashboard');
Route::get('/admin/maintenances', 'MaintenanceController@get')->name('maintenances-overview');
Route::get('/admin/users', 'UserController@getUsers')->name('users-overview');
在您的导航 blade(例如 resources/views/layouts/admin/navbar.blade.php
)中,您现在可以简单地引用这些名称:
<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>
当您有一个 multi-language 站点时,此解决方案也非常有用,因为您不必使用正则表达式来确定它现在是否匹配 URL。您还可以编辑和更新您的路由 URLs 到您想要的任何内容,而无需更新所有 blades,只是因为 URL 已更改。 route()
函数 returns 自动。更新后的 URL 和 Route::currentRouteName()
函数总是 return 设置您的路线名称。 :)
正如对 multi-language 站点的提示:您可以简单地将静态文本 Users
替换为语言变量:
<li class="{{ Route::currentRouteName() == 'users-overview' ? 'active' : '' }}">
<a href="{{ route('users-overview') }}">@lang('layouts/admin/navbar.users')</a>
</li>
有关本地化的更多信息,请查看 laravel.com localization documentation
只需将这个小功能代码放入您的助手中即可 class
function is_current_route($route){
return Route::currentRouteName() == $route ? 'class=active' : '';
}
并在您的视图中像这样使用它
<li {{is_current_route('your-route-name-here')}}>
<a href="{{ url("/home") }}>Home</a>
</li>