2013-08-24 126 views
7

我有一個場景,其中定義了一個頭部分的主模板。它看起來像這樣...Laravel 4 - 擴展主模板中聲明的區域不止一次

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

正如你所看到的,我有幾個子視圖(例如nav_bar和search_bar)。每個這些子視圖都有一個伴隨的.js文件。所以,我想在「標題」部分中search_bar再次擴展在這樣nav_bar ...

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

,然後像這樣:

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

的目的是,最終輸出的HTML文件將是這樣的:

@section( '頭') {{HTML ::風格( 'CSS/planesaleing.css')}} {{HTML ::腳本('JS/jQuery的1.10.1 .js')}} {{HTML :: script('js/search_Bar.js ')}} {{HTML ::腳本(' JS/anotherjs.js ')}} {{HTML ::腳本(' JS/yetanotherjs.js')}} @show

但是,只有第一個實際上擴展了標題,所有其他的在這之後似乎被忽略。無論如何要使用多個擴展?

任何意見 - 非常感謝。

回答

9

首先,當您在視圖中擴展布局時,您將開始一個部分,然後「停止」。像這樣:

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

你是如何擴展布局?我不確定是否有多個佈局可以相互擴展,然後通過視圖進行擴展,或者您有多個視圖,每個視圖都擴展了這個特定的佈局。現在在後面的例子中,一個視圖不會對另一個視圖產生任何影響。

如果您使用的是前一種方法,那麼更多示例代碼會有所幫助,因爲我認爲您在某個時間點上寫了值。

希望它有幫助。

編輯

當你說:

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

你有三個不同的名字做的佔位符。所以nav_bar,search_bar不是子視圖,但它們是可以從視圖中填充的佔位符。

讓我換一種方式。當您的視圖擴展模板時,他們將填寫模板中聲明的空白。所以'header','search_bar'等每個都有空缺可以填寫ONCE。所以如果你有一個名爲index.blade.php的視圖,你可以填寫一次。所以你可以有index.blade。PHP的是這樣的:

@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 

現在,如果我們看一下這個,它會導致是:

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

這就是爲什麼只是第一個似乎被延長了主人。我想你應該重新考慮你試圖擴展主人的方式。

有什麼可以爲你工作是

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

但是我不知道,如果部分將從每個子視圖或不進行級聯。你可以試試這個。

所以,你將有一個叫做index.blade.php觀點看起來有些像什麼:

@extends('master') 

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

,然後你將有單獨的文件,如search_bar.blade.php和其它將推廣碩士專業,並填寫在這樣的佔位符:

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

我相信(沒有測試),這應該做你的工作。然後它可以級聯來自所有子視圖的輸入並將它們放在一起,就像你想要的一樣。因此,所有子視圖都將填充標題部分,並且這應該在最終輸出中一起級聯。試試看,如果它的工作,太棒了!否則嘗試一種不同的方法來注入腳本。

+0

我編輯了這個問題,以提供進一步的清晰,我想要實現的......本質上,我試圖做你提到的第二件事... –

+0

編輯答案。試試看。 –