【问题标题】:Laravel dynamic breadcrumbs with linksLaravel 带有链接的动态面包屑
【发布时间】:2016-10-24 07:38:46
【问题描述】:

我正在尝试在 laravel 中使用链接实现动态面包屑。我通过以下代码成功渲染了面包屑,但没有链接。

    <ol class="breadcrumb">
    <li><a href="#"><i class="fa fa-dashboard"></i>Marketplace</a></li>
    @foreach(Request::segments() as $segment)
    <li>
        <a href="#">{{$segment}}</a>
    </li>
    @endforeach
</ol>

但现在我遇到了网址问题。我正在获取包含所有后代的路线的当前网址。有人可以帮助我如何添加指向面包屑的链接吗?

谢谢。

【问题讨论】:

  • 提供 url 示例 URL 和生成的面包屑,以便我们为您提供相应的帮助
  • @Qazi Url 将是这样的:marketplace.dev/admin/types/create 并且面包屑应该像 admin > types > create
  • @Jeff 我查了一下,那将是我的第二个选择。我试图用一个简单的函数来处理它。因为上面的代码给了我需要的路由数组。我只想知道,如果我有一些功能可以发送每个路由名称,如下面的 URL marketplace.dev/admin/types/create 如果我发送“类型”,那么它会给出当前控制器或路径。这样我就可以只使用一个功能。请让我知道我是否走对了路,还是应该立即使用面包屑库?谢谢。
  • @Jeff,我使用了那个库,它很棒。在 laravel 5 上工作得很好。改变了我通过自己的函数处理面包屑的想法。

标签: laravel laravel-5.2 breadcrumbs adminlte


【解决方案1】:

我喜欢@rohankhude 提供的解决方案,但在第一段(市场)之后没有显示“/”。所以这是一个干净的代码。

<div class="breadcrumb">
    <ul>
        <li>
            <a href="{{ route('welcome') }}" class="inactive">Home</a>
        </li>
                
        <?php $link = "" ?>
        @for($i = 1; $i <= count(Request::segments()); $i++)
            @if($i < count(Request::segments()) & $i > 0)
                <?php $link .= "/" . Request::segment($i); ?>
                @if ($i == 1)
                    <a href="<?= $link ?>" class="inactive">/ {{ ucwords(str_replace('-',' ',Request::segment($i)))}}</a>
                @else
                    <a href="<?= $link ?>" class="inactive">{{ ucwords(str_replace('-',' ',Request::segment($i)))}}</a>
                @endif
            @else
                <a class="active">/ {{ucwords(str_replace('-',' ',Request::segment($i)))}}</a>
            @endif
        @endfor
    </ul>
</div>

【讨论】:

    【解决方案2】:

    我写了一个可以动态处理 laravel 资源( index | edit | create )路由的代码:

    自定义面包屑 => custom.blade.php

    @php
        $segments=[];
        $l=count(Request::segments())-1
    @endphp
    
    @switch(Request::segments()[$l])
        @case('edit')
            @php
                $l--;
                $segments=array_slice(Request::segments(),0,$l);
                $segments[]=$model->slug // Model that passed to this included blade file
            @endphp
        @break
        @default
            @php $segments=Request::segments() @endphp
    @endswitch
    
    @php
        $link=''
    @endphp
    @foreach($segments as $sg)
       @php $link.='/'.$sg @endphp
       @if($loop->index<$l)
          <li class="breadcrumb-item">
             <a href="{{$link}}">{{ucfirst($sg=='admin'?'home':$sg)}}</a>
          </li>
       @else
          <li class="breadcrumb-item active">
             {{ucfirst($sg)}}
          </li>
       @endif
    @endforeach
    

    使用自定义面包屑 => example.balde.php

    @include('admin.vendor.breadcrumb.custom',['model'=> $articles])
    

    【讨论】:

      【解决方案3】:

      只需在任何链接前添加斜杠/ 即可将后裔添加到域名 像这样

      &lt;a href="/YourLink" &gt;&lt;/a&gt;

      【讨论】:

        【解决方案4】:

        这对我有用,在 Laravel 5.4 中尝试过。*

        此代码完美运行的要求:所有 URL 都应在您的路由文件中具有层次结构模式

        以下代码将为每个路径创建 crumb -

        <a href="/">Home</a> >                
        <?php $link = "" ?>
        @for($i = 1; $i <= count(Request::segments()); $i++)
            @if($i < count(Request::segments()) & $i > 0)
            <?php $link .= "/" . Request::segment($i); ?>
            <a href="<?= $link ?>">{{ ucwords(str_replace('-',' ',Request::segment($i)))}}</a> >
            @else {{ucwords(str_replace('-',' ',Request::segment($i)))}}
            @endif
        @endfor
        

        所以 URL 的面包屑 your_site.com/abc/lmn/xyz 将是 - Home > abc > lmn > xyz

        希望这会有所帮助!

        【讨论】:

        • 谢谢这很好用。对于这个小而简单的代码,我为什么要使用 package.json 呢?再次感谢。我不知道为什么没有人放弃投票。
        • 到目前为止,这段代码对我来说非常棒。我为它创建了一个部分模板,所以我不必复制代码。我将代码粘贴到~/views/breadcrumbs.blade.php,然后将其称为@include('breadcrumbs')
        • 我不明白为什么人们在完美运行的情况下推荐包!!
        【解决方案5】:

        我不确定您是否已经找到了解决方案,但我想出了一种方法来解决我的项目。它可能会为您的实施派上用场。

        我最终要么将整个 url 添加到链接中,要么只添加段,这是不可取的,因此使用数组切片我从数组中的 0 索引开始切片,并且只切片直到循环的当前迭代,然后将数组内爆成一个字符串,然后使用 URL::to 创建链接。

        <ol class="breadcrumb">
           <li>
               <i class="fa fa-home"></i>
               <a href="{{route('admin.index')}}">HOME</a>
           </li>
        
           @for($i = 2; $i <= count(Request::segments()); $i++)
              <li>
                 <a href="{{ URL::to( implode( '/', array_slice(Request::segments(), 0 ,$i, true)))}}">
                    {{strtoupper(Request::segment($i))}}
                 </a>
              </li>
           @endfor
        </ol>
        

        您会注意到,我只从 2 ($i = 2) 开始我的迭代,因为我的应用程序基础 url 从 /admin 开始,我手动将我的 home Url 放在第一个面包屑中。

        同样,您可能已经有了一个解决方案,但是这可能适用于不想添加包以获取面包屑的人。

        【讨论】:

        • 是的,我最终得到了一个库,它可以提供很多帮助并自行管理许多事情。但是您的解决方案似乎是我想要做的。我也一定会尝试的。谢谢你的帮助。 :)
        • 很高兴你能发现它有用
        • 这个很有用
        【解决方案6】:

        如果我正确理解您的问题,您只需填写链接的 URL。这是未经测试的,但我认为它应该可以工作。

        <ol class="breadcrumb">
            <li><a href="#"><i class="fa fa-dashboard"></i>Marketplace</a></li>
            <?php $segments = ''; ?>
            @foreach(Request::segments() as $segment)
                <?php $segments .= '/'.$segment; ?>
                <li>
                    <a href="{{ $segments }}">{{$segment}}</a>
                </li>
            @endforeach
        </ol>
        

        【讨论】:

        • 感谢您的回复。我已经尝试过了,但它也会与其他链接和命名空间产生问题。我想我应该去一些图书馆而不是这个。无论如何感谢您的帮助。 :)
        猜你喜欢
        • 1970-01-01
        • 2021-05-09
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 2018-12-18
        • 2018-05-09
        相关资源
        最近更新 更多