[英]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語句在其中使用更多邏輯。 也許我只是在這種觀點內做錯了什么?
通常,您希望您的視圖盡可能啞,將邏輯留給控制器,並允許視圖僅考慮呈現的內容。 這種關注點的分離允許使用更多可維護的代碼,並幫助您避免像現在所面臨的問題。
分離關注點的您要實現的目標的實現將類似於:
作為如何實現此目標的簡單示例,這是一個控制器,該控制器構造了一個節數組,然后確定應刪除哪些節(在該節中,您可以進行測試以“是否已被數據庫中的管理員禁用了”),最后提供該視圖的部分列表。
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.