2013-08-24 6 views
7

मेरे पास एक परिदृश्य है जहां मेरे पास एक मास्टर टेम्पलेट है जो हेडर सेक्शन को परिभाषित करता है। यह इस तरह दिखता है ...लार्वेल 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 

इरादा है कि अंतिम outputted html फ़ाइल होगा इस तरह दिखेगा:

@section ('शीर्षक') {{एचटीएमएल :: शैली ('सीएसएस/planesaleing.css')}} {{ एचटीएमएल :: स्क्रिप्ट ('जे एस/jQuery-1.10.1 .js ')}} {{HTML :: स्क्रिप्ट (' जेएस/search_Bar.js ')}} {{ एचटीएमएल :: स्क्रिप्ट (' जे एस/anotherjs.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 बच्चे के विचार नहीं हैं लेकिन वे प्लेसहोल्डर्स हैं जिन्हें आपके विचारों से पॉप्युलेट किया जा सकता है।

मुझे इसे किसी अन्य तरीके से रखने दें। जब आपके विचार टेम्पलेट का विस्तार करते हैं, तो वे टेम्पलेट में घोषित अंतराल भर देंगे। इसलिए 'हेडर', 'search_bar' आदि में से प्रत्येक एक बार भरने के अंतराल हैं। तो यदि आपके पास 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 

हालांकि मुझे यकीन है कि नहीं कर रहा हूँ है वर्गों प्रत्येक subview या नहीं से सोपानी किया जाएगा। आप इसे आजमा सकते हैं। search_bar.blade.php और दूसरों जो गुरु का विस्तार करने और भर जाएगा की तरह

@extends('master') 

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

और फिर आप होगा अलग फ़ाइलों:

तो तुम एक दृश्य index.blade.php कहा जाता है जो कुछ कैसा दिखता होगा इस तरह प्लेसहोल्डर में:

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

मेरा मानना ​​है कि (परीक्षण किया havn't) है कि यह आपके काम करना चाहिए। इसके बाद यह सभी सबव्यूज़ से इनपुट को कैस्केड कर सकता है और इसे एक साथ रख सकता है जैसा आप चाहते हैं। तो सभी सबव्यूज़ हेडर सेक्शन को पॉप्युलेट कर रहे होंगे और इसे अंतिम आउटपुट में एक साथ कैस्केड किया जाना चाहिए। इसे आज़माएं और यदि यह काम करता है, तो बढ़िया !! अन्य स्क्रिप्ट इंजेक्ट करने के लिए एक अलग दृष्टिकोण का प्रयास करें।

+0

मैंने जो कुछ हासिल करने की कोशिश कर रहा हूं उस पर और स्पष्टता प्रदान करने के लिए मैंने प्रश्न संपादित किया है ... अनिवार्य रूप से, मैं आपके द्वारा उल्लिखित दूसरी बात करने की कोशिश कर रहा हूं ... –

+0

ने उत्तर संपादित किया। इसे आज़माएं –

संबंधित मुद्दे