根据当前翻译的 Laravel 路线在刀片中添加“活动”类
Posted
技术标签:
【中文标题】根据当前翻译的 Laravel 路线在刀片中添加“活动”类【英文标题】:Add "active" class in blade depending on current translated Laravel route 【发布时间】:2016-01-07 19:06:11 【问题描述】:使用 Laravel 5.1 中的 mcamara/laravel-localization 包,我设法本地化了我的网站并翻译了路线。现在的问题如下:如何根据当前路线通过刀片模板添加自定义类“活动”?
到目前为止,我已经尝试过使用 html::macro,但似乎包 laravelcollective/html: "5.1.*" 与 L5.1 不完全兼容(尤其是宏)。
即使我设法使用宏,我也不能使用Request::is('about')
,因为路由已被翻译。我很确定这里必须是一个简单的方法......
Example routes:
www.sitename.com/en/about = www.sitename.com/ro/despre => route to same controller/action
【问题讨论】:
【参考方案1】:聚会有点晚了,但我也遇到了同样的问题,并使用 laravel 辅助函数 url()->current()
和本地化包辅助函数 localizeURL
解决了它
<a href="LaravelLocalization::localizeURL(trans('routes.my-route'))"
class="(url()->current() == LaravelLocalization::localizeURL(trans('routes.my-route'))) ? "active" : "" ">
trans('navigation.my-route')</a>
【讨论】:
【参考方案2】:试试这个!
<li class="@if (Request::is('/')) 'active' @endif"><a href="/">Home <span class="sr-only">(current)</span></a></li>
<li class="@if (Request::is('about')) 'active' @endif"><a href="URL::to('/about')">About</a></li>
<li class="@if (Request::is('contact')) 'active' @endif"><a href="URL::to('/contact')">Contact</a></li>
【讨论】:
【参考方案3】:在@keithm 和here 的鼓舞人心的帮助下,我做了以下事情:
首先使用新指令扩展刀片,直接在 AppServiceProvider.php 中构建
Blade::directive('activeState', function($expression)
return '<?php echo activeClass('. $expression . '); ?>';
);
然后在你的 helpers 文件中(如果你没有,你可以在 app/Http/helpers.php 中创建它)添加以下内容
function activeClass($url)
return Request::url() == $url ? 'active' : '';
在刀片中直接使用下面的指令:
<a href=" URL::route('front.portfolio.index') " class="nav-block @activeState(URL::route('front.portfolio.index'))">
【讨论】:
在您的 activeClass 辅助函数中,`Request::url() == $url` 意味着您必须传入完整的 url 路径;它不能匹配 url 部分。我修改了行进以仅匹配 url 的结尾:`ends_with(Request::url(), $url) ? '积极的' : ''; `【参考方案4】:不确定我是否收到了您的问题,但这是您要找的吗?
<span class="someClass @if (Request::url('/myurl') active @endif"></span>
很抱歉错过了这部分问题:)。
我没有以这种方式测试它,但它应该可以工作:
@if (Request::url($variable or $pattern .'/restofuri')
【讨论】:
不完全是。如果我有 20 种语言,我将不得不构建 20 个 @if-else 语句。 @if (Request::url('/myurl-en') active @elseif (Request::url('/myurl-ro') active @elseif (Request::url('/myurl-de') active endif正则表达式也不是解决方案,因为 url 可以完全不同(参见问题示例) 无法从包 repo 中找到太多信息,但我假设用户的本地保存在会话、配置、数据库中或不止一个地方。如果用户的设置保存在 db 或 session 中,您可以从视图中获取它并连接 url。 这也不能解决问题,因为“模式”不一样。我编辑了这个问题,也许它更有意义。但我会尝试在 if 上强制路由 - 检查当前路由到自定义语言环境,例如。 “en”,所以每次我检查时我都会检查“en”......虽然不是很漂亮 嗨,都铎,我知道你的意思,但我不知道你需要知道哪一部分。您可以从配置中的本地列表中命名一个路由和一个检查变量的函数,您还可以轻松地从您正在使用的包中获取翻译后的文本。最好的方法是获取选定的本地,这样您就不必遍历所有可用的翻译。我的意思是变量和/或模式。你是保存用户的本地信息还是每次都从 URI 获取?以上是关于根据当前翻译的 Laravel 路线在刀片中添加“活动”类的主要内容,如果未能解决你的问题,请参考以下文章