2013-08-24 32 views
7

Tôi có một kịch bản mà tôi có một mẫu chính xác định phần tiêu đề. Có vẻ như thế này ...Laravel 4 - Mở rộng một phần được khai báo trong một mẫu chính nhiều hơn một lần

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

Như bạn có thể thấy, tôi có một số chế độ xem con (ví dụ: nav_bar và search_bar). Mỗi chế độ xem con này có tệp .js kèm theo. Vì vậy, tôi muốn mở rộng phần 'tiêu đề' trong nav_bar như thế này ...

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

và sau đó một lần nữa trong search_bar như thế này:

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

Mục đích là trận chung kết nào được xuất bản tập tin html sẽ giống như thế này:

@section ('tiêu đề') {{HTML :: phong cách ('css/planesaleing.css')}} {{ HTML :: kịch bản ('js/jquery-1.10.1 .js ')}} {{HTML :: script (' js/search_Bar.js ')}} {{ HTML :: kịch bản (' js/anotherjs.js ')}} {{ HTML :: kịch bản (' js/yetanotherjs.js')}} @show

Tuy nhiên, chỉ cái đầu tiên thực sự mở rộng tiêu đề, tất cả những thứ khác sau này dường như bị bỏ qua. Có cách nào để sử dụng nhiều tiện ích mở rộng không?

Bất kỳ lời khuyên nào - được đánh giá cao.

Trả lời

9

Thứ nhất, khi bạn mở rộng bố cục trong chế độ xem, bạn bắt đầu một phần và sau đó "dừng". Như thế này:

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

Bạn mở rộng bố cục như thế nào? Tôi không chắc chắn nếu bạn có nhiều bố cục mở rộng lẫn nhau và sau đó được mở rộng theo lượt xem hoặc bạn có nhiều chế độ xem, mỗi bố cục sẽ mở rộng bố cục cụ thể này. Bây giờ trong trường hợp sau này, một lượt xem sẽ không ảnh hưởng đến chế độ xem khác.

Nếu bạn đang sử dụng phương pháp tiếp cận cũ, một số mã ví dụ khác sẽ hữu ích vì tôi nghĩ rằng bạn đang ghi đè các giá trị tại một số thời điểm.

Hy vọng điều đó sẽ hữu ích.

EDIT

khi bạn nói:

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

Bạn đang làm placeholders với ba tên gọi khác nhau. Vì vậy, nav_bar, search_bar không phải là chế độ xem con nhưng chúng là trình giữ chỗ có thể được điền từ chế độ xem của bạn.

Để tôi đặt nó theo cách khác. Khi các khung nhìn của bạn mở rộng một khuôn mẫu, chúng sẽ điền vào các khoảng trống được khai báo trong khuôn mẫu. Vì vậy, mỗi 'tiêu đề', 'search_bar', v.v. là các khoảng trống được điền ONCE. Vì vậy, nếu bạn có một cái nhìn tên là index.blade.php, bạn có thể điền vào một lần. Vì vậy, bạn có thể có index.blade.php như thế này:

@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 

Bây giờ nếu chúng ta xem xét điều này, những gì nó sẽ cho kết quả là:

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

Đây là lý do tại sao chỉ là người đầu tiên dường như được mở rộng tổng thể. Tôi nghĩ bạn nên xem xét lại cách bạn đang cố gắng mở rộng tổng thể.

gì có thể làm việc cho bạn là

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

Tuy nhiên tôi không chắc chắn nếu các phần sẽ được cascaded từ mỗi subview hay không. Bạn có thể thử điều này.

Vì vậy, bạn sẽ có một cái nhìn gọi index.blade.php trông một số điều như:

@extends('master') 

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

và sau đó bạn sẽ có các file riêng biệt như search_bar.blade.php và những người khác mà sẽ mở rộng tổng thể và điền trong trình giữ chỗ như thế này:

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

Tôi tin rằng (không được thử nghiệm) rằng điều này sẽ làm công việc của bạn. Sau đó nó có thể xếp các đầu vào từ tất cả các bản xem trước và đặt nó lại với nhau như bạn muốn. Vì vậy, tất cả các bản xem trước sẽ được điền vào phần tiêu đề và điều này sẽ được xếp chồng lên nhau trong đầu ra cuối cùng. Hãy thử nó ra và nếu nó hoạt động, GREAT !! khác thử một cách tiếp cận khác để tiêm các script.

+0

Tôi đã chỉnh sửa câu hỏi để cung cấp thêm rõ ràng về những gì tôi đang cố gắng đạt được ... Về cơ bản, tôi đang cố thực hiện điều thứ hai mà bạn đã đề cập ... –

+0

đã chỉnh sửa câu trả lời. thử thứ này đi. –

Các vấn đề liên quan