簡體   English   中英

在另一個視圖中包含一個帶有變量的視圖(Laravel 5.6-Blade)

[英]Include a view with a variable inside another view (Laravel's 5.6 - Blade)

我正在使用一個單頁網站,該網站的導航位於“首頁”部分下方。 在這個網站上,我的客戶可以選擇隱藏或顯示頁面的任何部分,我通過添加一個簡單的if語句來檢查頁面是否可見來實現:

我正在加載的視圖在一頁網站上匯總了所有部分:

@extends('layouts.master')

@section('content')

@include ('homeSection')

@include ('layouts.navigation')

@if ($section1)
@include ('section1')
@endif

@if ($section2)
@include ('section2')
@endif

...

@endsection

唯一沒有顯示/隱藏選項的部分(它將始終顯示)是home部分,其他所有部分都可以由我的客戶端(通過數據庫)隱藏。

所有這些都運行良好,顯示了應該顯示的頁面,並隱藏了應該隱藏的部分。

我遇到的問題是如何對其進行導航以顯示實際上隱藏的頁面,而不必在每個for循環上執行if語句。

我的解決方案是制作一個@yield('navigation'),並在頁面底部添加一個@section('navigation'),一旦填充$ pages變量,它將@include'navigation'視圖。 像這樣:

@php ( $sections = array($home) )

@extends('layouts.master')

@section('content')

@include ('home')

@yield ('navigation')

@if ($section1)
@include ('section1')
@php ( array_push($sections, $section1) )
@endif

@if ($section2)
@include ('section2')
@php ( array_push($sections, $section2) )
@endif

...

@endsection

到此時,$ sections變量將填充所有可見頁面:

@section ('navigation')
@include ('layouts.navigation')
@endsection

當然,我使用$ sections變量使用@foreach語句制作導航欄,唯一的問題是它似乎不起作用。 我嘗試移動@section('navigation'),但是它只有在@yield('navigation')之前才起作用,那是$ sections變量只有homeSection的時候。

我知道我可以直接在導航視圖中執行此操作,但是我必須通過重新運行所有if語句在其中使用更多邏輯。 也許我只是在這種觀點內做錯了什么?

通常,您希望您的視圖盡可能啞,將邏輯留給控制器,並允許視圖僅考慮呈現的內容。 這種關注點的分離允許使用更多可維護的代碼,並幫助您避免像現在所面臨的問題。

分離關注點的您要實現的目標的實現將類似於:

  1. 您的控制器將構建一個應包含的節列表
  2. 您的控制器將該部分列表傳遞給您的視圖
  3. 您的視圖將呈現包含該部分列表的導航
  4. 您的視圖將呈現這些部分

作為如何實現此目標的簡單示例,這是一個控制器,該控制器構造了一個節數組,然后確定應刪除哪些節(在該節中,您可以進行測試以“是否已被數據庫中的管理員禁用了”),最后提供該視圖的部分列表。

public function index()
{
    $sections = [
        'section1' => 'First Section',
        'section2' => 'Second Section',
        'section3' => 'Third Section',
        'section4' => 'Fourth Section',
    ];

    foreach ($sections as $id => $name) {
        // determine if section should be included or not
        // `shouldBeIncluded` is whatever your truth test is
        if (! shouldBeIncluded($id)) {
            unset($sections[$id]);
        }
    }

    return view('index', ['sections' => $sections]);
}

然后,在視圖中與節有關的任何地方(即導航或正文),您都可以使用$sections數組,而無需擔心確定節是否應該存在,因為控制器已經做到了。

例如,要包括所有適當的部分,您可以取消大量的if語句並使用一個循環:

@foreach ($sections as $view => $name)
    @include($view)
@endforeach

對於導航,您可以執行以下操作:

<ul>
    @foreach ($sections as $view => $name)
        <li><a href="#{{ $view }}">{{ $name }}</a></li>
    @endforeach
</ul>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM