Включить представление с переменной внутри другого представления (Laravel's 5.6 - Blade) - PullRequest
0 голосов
/ 29 апреля 2018

Я работаю над одностраничным веб-сайтом, который имеет навигацию под разделом «Домой». На этом веб-сайте мой клиент имеет возможность скрыть или показать любой раздел страницы, для этого я добавил простую инструкцию if для проверки, должна ли страница быть видимой или нет:

Представление, которое я загружаю, собирает все разделы на одностраничном веб-сайте:

@extends('layouts.master')

@section('content')

@include ('homeSection')

@include ('layouts.navigation')

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

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

...

@endsection

Единственный раздел, который не имеет опции показать / скрыть (он всегда будет отображаться), является домашним разделом, все остальные разделы могут быть скрыты моим клиентом (через базу данных).

Все это работает отлично, показывает страницы, которые должны быть видны, и скрывает разделы, которые должны быть скрыты.

Проблема, с которой я столкнулся, заключается в том, чтобы сделать так, чтобы навигация показывала страницы, которые фактически скрыты, без необходимости выполнять операторы if в каждом цикле for.

Мое решение состояло в том, чтобы создать @yield («навигация») и в нижней части страницы добавить @section («навигация»), которая бы @include «навигация» отображалась после заполнения переменной $ pages. как это:

@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

К этому времени переменная $ section будет заполнена всеми видимыми страницами:

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

Конечно, я использую переменную $ section для создания панели навигации с оператором @foreach, единственная проблема в том, что она не работает. Я попытался переместить @section ('navigation'), но он работает только тогда, когда он идет перед @yield ('navigation'), тогда переменная $ section имеет только homeSection.

Я знаю, что могу сделать это непосредственно в моем навигационном представлении, но мне пришлось бы использовать больше логики в нем, повторно выполняя все операторы if. Может быть, я просто делаю что-то не так в этом представлении?

1 Ответ

0 голосов
/ 30 апреля 2018

Как правило, вы хотите, чтобы ваше представление было настолько глупым, насколько это возможно, оставляя логику на контроллере и позволяя представлению заниматься только тем, что ему дается. Такое разделение задач позволяет гораздо более легко обслуживать код и помогает вам избежать проблем, подобных той, с которой вы столкнулись сейчас.

Реализация того, чего вы пытаетесь достичь, разделяющего интересы, будет выглядеть примерно так:

  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>
...