2013-08-24 5 views
7

Mam scenariusz, w którym mam szablon główny, który definiuje sekcję nagłówka. Wygląda tak ...Laravel 4 - Rozszerzanie sekcji zadeklarowanej w szablonie głównym więcej niż raz

<!DOCTYPE html> 

<html> 
<head> 
@section('header') 
    {{ HTML::style('css/planesaleing.css') }} 
    {{ HTML::script('js/jquery-1.10.1.js') }} 
    {{ HTML::script('js/search_Bar.js') }} 
@show 
</head> 
<body> 
    <div class="planesaleing_page"> 
     <header> 
@yield('header_bar') 
@yield('nav_bar') 
@yield('search_bar') 
     </header> 
     <div class="main_page"> 
       // Some more code 
     </div> 
@yield('footer') 
    </div> 
</body> 
</html> 

Jak widać, mam kilka widoków podrzędnych (np. Nav_bar i search_bar). Każdy z tych widoków podrzędnych ma dołączony plik .js. Więc chciałbym rozszerzyć sekcję nagłówka „” w nav_bar jak to ...

@section('header') 
@parent 
    {{ HTML::script('js/anotherjs.js') }} 
@stop 

a następnie ponownie w search_bar tak:

@section('header') 
@parent 
    {{ HTML::script('js/yetanotherjs.js') }} 
@stop 

Chodzi o to, że ostateczna wysyłanego pliku html będzie wyglądać tak:

@section ('header') {{HTML :: stylu ('css/planesaleing.css')}} {{ HTML :: skrypt ("js/jquery-1.10.1 .js ')}} {{HTML :: script (' js/search_Bar.js ')}} {{ HTML :: Script (' js/anotherjs.js ')}} {{ HTML :: Script (' js/yetanotherjs.js')}} @show

Jednak tylko pierwszy faktycznie rozszerza nagłówek, wszystkie pozostałe po tym są pozornie ignorowane. Czy jest mimo to używać wielu rozszerzeń?

Wszelkie porady - doceniamy.

Odpowiedz

9

Po pierwsze, gdy rozszerzasz układ w widoku, uruchamiasz sekcję, a następnie "zatrzymujesz". W ten sposób:

@section('header') 
@parent 
    {{ HTML::script('js/anotherjs.js') }} 
@stop 

W jaki sposób rozszerzasz układy? Nie jestem pewien, czy masz wiele układów, które się wzajemnie rozszerzają, a następnie są rozszerzane o widoki lub masz wiele widoków, z których każdy rozszerza ten układ. Teraz w późniejszym przypadku jeden widok nie będzie miał żadnego wpływu na inny widok.

Jeśli używasz wcześniejszego podejścia, kilka dodatkowych przykładowy kod byłby pomocny, ponieważ myślę, że nadpisałeś wartości w pewnym momencie.

Mam nadzieję, że to pomaga.

EDIT

kiedy mówisz:

<header> 
    @yield('header_bar') 
    @yield('nav_bar') 
    @yield('search_bar') 
</header> 

Robisz zastępcze z trzema różnymi nazwami. Zatem nav_bar, search_bar nie są widokami podrzędnymi, ale są one symbolami zastępczymi, które mogą być wypełniane z twoich widoków.

Pozwolę sobie ująć to w inny sposób. Gdy Twoje widoki rozszerzają szablon, wypełnią luki zadeklarowane w szablonie. Zatem każdy z "nagłówka", "paska wyszukiwania" itp. Jest lukami do wypełnienia RAZ. Więc jeśli masz widok o nazwie index.blade.php, możesz wpisać je raz. Więc możesz mieć index.blade.php tak:

@section('header') 
@parent 
    {{ HTML::script('js/anotherjs.js') }} 
@stop 

@section('header_bar') 
@parent 
    {{ HTML::script('js/yetanotherjs.js') }} 
@stop 

@section('nav_bar') 
@parent 
    {{ HTML::script('js/foojs.js') }} 
@stop 
@section('search_bar') 
@parent 
    {{ HTML::script('js/foojs.js') }} 
@stop 

Teraz, jeśli spojrzymy na to, co będzie skutkować to:

<!DOCTYPE html> 

<html> 
<head> 
@section('header') 
    {{ HTML::style('css/planesaleing.css') }} 
    {{ HTML::script('js/jquery-1.10.1.js') }} 
    {{ HTML::script('js/search_Bar.js') }}//from parent till this point 
    {{ HTML::script('js/anotherjs.js') }} //comes from view 
@show 
</head> 
<body> 
    <div class="planesaleing_page"> 
     <header> 
{{ HTML::script('js/yetanotherjs.js') }} //comes in place of header_bar as nothing in parent 

//@yield('header_bar') 

{{ HTML::script('js/foojs.js') }}//comes in place of nav_bar as nothing in parent 

//@yield('nav_bar') 

{{ HTML::script('js/foojs.js') }}//comes in place for search_bar as nothing in parent 

//@yield('search_bar') 
     </header> 
     <div class="main_page"> 
       // Some more code 
     </div> 
@yield('footer') 
    </div> 
</body> 
</html> 

Dlatego właśnie pierwszy z nich wydaje się być rozszerzenie mistrz. Myślę, że powinieneś raz rozważyć sposób, w jaki próbujesz rozszerzyć mistrza.

Co może pracować dla Ciebie jest

@include('view.name') // includes a subview 

Jednak nie jestem pewien, czy odcinki będą kaskadowo z każdego podrzędny czy nie. Możesz to wypróbować.

Więc masz widok nazwie index.blade.php który wygląda trochę jak co:

@extends('master') 

@include('search_bar') 
@include('nav_bar') 
@include('foo_bar') 

a następnie trzeba będzie oddzielne pliki jak search_bar.blade.php i innych, które przedłuży pana i wypełnić w miejscach zastępczych takich jak to:

@extends('master') 
@section('header') 
@parent 
    {{ HTML::script('js/anotherjs.js') }} 
@stop 

Wierzę (nie przetestowano), że to powinno wykonać twoją pracę. Może następnie kaskadować dane wejściowe ze wszystkich subviews i układać je tak, jak chcesz. Tak więc wszystkie subviews będą wypełniały sekcję nagłówka i powinno to zostać połączone kaskadowo w końcowym wyniku. Wypróbuj i jeśli to działa, WIELKI !! spróbuj innego podejścia do wstrzykiwania skryptów.

+0

Zmieniłem to pytanie, aby zapewnić większą przejrzystość tego, co próbuję osiągnąć ... Zasadniczo próbuję zrobić drugą rzecz o której wspomniałeś ... –

+0

zredagował odpowiedź. wypróbuj to. –

Powiązane problemy