2013-08-24 6 views
7

Ho uno scenario in cui ho un modello principale che definisce una sezione di intestazione. Ecco come si presenta ...Laravel 4 - Estensione di una sezione dichiarata in un modello principale più di una volta

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

Come potete vedere, ho diverse viste bambino (ad esempio nav_bar e search_bar). Ciascuna di queste viste secondarie ha un file .js associato. Quindi vorrei estendere la sezione 'header' in nav_bar come questo ...

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

e poi di nuovo in search_bar come questo:

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

L'intenzione è che il file in formato HTML emesso finale sarebbe simile a questa:

@section ('colpo di testa') {{HTML :: stile ('css/planesaleing.css')}} {{ HTML :: sceneggiatura ('js/jquery-1.10.1 .js ')}} {{HTML :: script (' js/search_Bar.js ')}} {{ HTML :: script (' JS/anotherjs.js ')}} {{ HTML :: script (' js/yetanotherjs.js')}} @show

Tuttavia, solo il primo estende effettivamente l'intestazione, tutti gli altri dopo questo sono apparentemente ignorati. Esiste comunque l'uso di più estensioni?

Qualsiasi consiglio - molto apprezzato.

risposta

9

In primo luogo, quando si estende un layout in una vista, si avvia una sezione e si "interrompe". Mi piace:

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

Come stai estendendo i layout? Non sono sicuro che tu abbia più layout che si estendono l'un l'altro e che siano poi estesi per visualizzazioni o che tu abbia più viste, ciascuna estendendo questo particolare layout. Ora, nel caso successivo, una vista non avrà alcun effetto sull'altra vista.

Se si utilizza l'approccio precedente, un altro codice di esempio potrebbe essere utile in quanto ritengo che si stia scrivendo i valori in un determinato momento.

Spero che aiuti.

EDIT

Quando si dice:

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

Si stanno facendo i segnaposto con tre nomi diversi. Pertanto, nav_bar, search_bar non sono viste secondarie, ma sono segnaposti che possono essere popolati dalle tue visualizzazioni.

Lasciatemelo mettere in un altro modo. Quando le tue viste estendono un modello, riempiranno gli spazi dichiarati nel modello. Pertanto, ciascuna delle voci "header", "search_bar" ecc. Deve essere riempita con spazi vuoti ONCE. Quindi, se hai una vista denominata index.blade.php, puoi riempirla una volta. Quindi puoi avere index.blade.php in questo modo:

@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 

Ora, se guardiamo a questo, ciò che sarà risultato è:

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

Questo è il motivo per solo il primo sembra essere l'estensione del master. Penso che dovresti riconsiderare il modo in cui stai cercando di estendere il master.

cosa può funzionare per voi è

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

Tuttavia io non sono sicuro se le sezioni saranno in cascata da ogni visualizzazione secondaria o no. Puoi provarlo.

Così avrete una vista chiamata index.blade.php che guarda alcuni ciò come:

@extends('master') 

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

e quindi si avrà come file separati search_bar.blade.php e altri che estenderanno master e riempire nei segnaposti come questo:

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

Credo (non ha provato) che questo dovrebbe fare il tuo lavoro. Può quindi mettere in cascata gli input da tutte le sottoview e metterlo insieme come si desidera. Quindi tutte le sottoview popoleranno la sezione dell'header e questo dovrebbe essere messo insieme nell'output finale. Provalo e se funziona, GRANDE !! altrimenti prova un approccio diverso per iniettare gli script.

+0

Ho modificato la domanda per fornire ulteriore chiarezza su ciò che sto cercando di ottenere ... In sostanza, sto cercando di fare la seconda cosa che hai citato ... –

+0

modificato la risposta. provalo –

Problemi correlati