【问题标题】:Add "active" class in blade depending on current translated Laravel route根据当前翻译的 Laravel 路线在刀片中添加“活动”类
【发布时间】: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

【问题讨论】:

    标签: php laravel blade laravel-5.1 laravel-routing


    【解决方案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 获取?
        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 2023-03-20
        • 2020-05-19
        • 2016-12-31
        • 1970-01-01
        • 2020-06-16
        • 2020-03-06
        • 2021-07-02
        相关资源
        最近更新 更多