根据当前翻译的 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 路线在刀片中添加“活动”类的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 检查刀片上的路线

如何在 Laravel 中添加(刀片引擎?)

在刀片视图中显示路线的结果(Laravel)

刀片中的 Laravel 8 路线

Laravel 模板显示路线中的两个刀片模板

laravel刀片中的多元化@lang()定位?