2009-08-21 16 views
8

मैं Zend_Layout का उपयोग करके एक गतिशील साइट उत्पन्न करना चाहता हूं।ज़ेंड फ्रेमवर्क: एक लेआउट में एकाधिक दृश्य प्रस्तुत करें

मेरे लेआउट (/application/layouts/scripts/layout.phtml) निम्नलिखित लाइनों में शामिल हैं:

...   
<body> 

     <?php echo $this->render('header.phtml') ?> 

     <div id="content"><?php echo $this->layout()->content ?></div> 

     <?php echo $this->render('footer.phtml') ?> 

    </body> 
... 

तो मैं अपने सूचकांक नियंत्रक सूचकांक कार्रवाई करने के लिए ब्राउज़ करें - Zend सूचकांक दृश्य renders (आवेदन/विचारों/स्क्रिप्ट/इंडेक्स/index.phtml) $- के अंदर-> लेआउट() -> सामग्री स्वचालित रूप से।

अब मैं लेआउट में विभिन्न नियंत्रक कार्यों के विचार प्रस्तुत करना चाहता हूं। तो मैं एक एक्शन लॉगिन के साथ एक नया नियंत्रक ऑथ उत्पन्न करता हूं जो लॉगिन फॉर्म दिखाता है।

मैं अपने लेआउट बदलने:

...   
    <body> 

      <?php echo $this->render('header.phtml') ?> 

      <div id="content"><?php echo $this->layout()->content ?></div> 
      <div id="login"><?php echo $this->layout()->login ?></div> 

      <?php echo $this->render('footer.phtml') ?> 

     </body> 
    ... 

जब मैं सूचकांक/सूचकांक पर ब्राउज़ करें, मैं इस कार्रवाई कि Zend $ इस- अंदर प्रमाणन/लॉगिन दृश्य> लेआउट() प्रस्तुत करना चाहिए में परिभाषित करना चाहते हैं -> लॉगिन करें और उदाहरण के लिए $/- लेआउट() -> सामग्री के अंदर समाचार/सूची।

सूचकांक/सूचकांक एक पृष्ठ लेआउट का एक प्रकार से है - और प्रमाणन/लॉगिन और समाचार/विजेट

का एक प्रकार यह करने के लिए कैसे की सूची?

+0

असल में एक और सवाल, आप व्यू हेल्पर्स का उपयोग करना पसंद करते हैं या स्क्रिप्ट देखते हैं? – basstradamus

उत्तर

8

पहले सलाह बिल्कुल कार्रवाई दृश्य सहायक से बचने के लिए है लागत, इसे शायद जेडएफ 2.0 में हटा दिया जाएगा। (ZF-5840) (Why the actionstack is evil)

यह question I asked से संबंधित है - और बिट्टर्मन का उत्तर बहुत उपयोगी है। इस तरह कुछ लागू करने का सबसे अच्छा तरीका एक दृश्य सहायक है जो आपके "लॉगिन" क्षेत्र को उत्पन्न कर सकता है। उदाहरण के लिए My_View_Helper_Login। फिर आपका लेआउट $this->login() पर कॉल कर सकता है, और इसलिए user/login के लिए दृश्य स्क्रिप्ट भी हो सकती है। जहां तक ​​index/indexnews/list से सामग्री प्रस्तुत करने के लिए बस नियंत्रक से अन्य नियंत्रक/कार्रवाई के अनुरोध को अग्रेषित करें। $this->_forward('list', 'news');

+0

धन्यवाद, मैं अभी तक प्रदर्शन मुद्दे के बारे में सोचा है। – opHASnoNAME

1

आप ऐसा नहीं गति performant

$this->action() 

उपयोग कर सकते हैं या आप

$this->partial() 

के साथ प्रयास करें (http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view.helpers.initial.partial देखें)

+3

मैं '$ this-> कार्रवाई() 'के खिलाफ सलाह दूंगा, यह बहुत अक्षम है। – gnarf

3

मैं action view helper का उपयोग करने के खिलाफ भी सलाह दूंगा। जब तक कि आपके नियंत्रक में तर्क का गुच्छा न हो, आपको शायद आंशिक दृश्य प्रस्तुत करने के लिए किसी अन्य नियंत्रक को एक और अनुरोध भेजने की आवश्यकता नहीं है।

मैं बस की सिफारिश की दृष्टि बस जैसे आप अपने header.phtml और footer.phtml के साथ किया है आंशिक उपयोग कर रहा होगा:

<body> 

     <?php echo $this->render('header.phtml') ?> 

     <div id="content"><?php echo $this->layout()->content ?></div> 

     <div id="login"><?php echo $this->render('auth/login.phtml') ?></div> 

     <?php echo $this->render('footer.phtml') ?> 

</body> 

और शायद अपने auth/login.phtml दृश्य स्क्रिप्ट इस तरह दिखता है:

<div id="login_box"> 
    <?php if (empty($this->user)): ?> 
     Please log in 
    <?php else: ?> 
     Hello <?php echo $this->user->name ?> 
    <?php endif; ?> 
</div> 

जब तक आप अपने कंट्रोलर में किसी बिंदु पर अपना व्यू वैरिएबल सेट करते हैं, तो आप एक दृश्य के भीतर render view helper पर कॉल कर सकते हैं (या यहां तक ​​कि एक नियंत्रक भी अगर आप चाहते थे)।

#index controller 
public function indexAction() 
{ 
    $this->view->user = Model_User::getUserFromSession(); 
} 
+0

क्या होगा यदि हम इंडेक्स/इंडेक्स (इंडेक्स कंट्रोलर, इंडेक्स एक्शन) में नहीं हैं, तो देखें-> उपयोगकर्ता को परिभाषित नहीं किया जाएगा, तर्क के पीछे तर्क कैसे बनाया जाए-> उपयोगकर्ता वर्तमान कार्रवाई से अलग है? ऐसा लगता है कि जहां तक ​​मैंने अपने शोध में पाया है, एक दृश्य सहायक है, है ना? – Tangocoder

0

मैं जब मेरे अपने समस्या के लिए एक जवाब है, जो था कि मेरी लेआउट कई बार बुला लिया गया की तलाश में इस पृष्ठ पर मिला है। इसका कारण यह है कई कारणों में से हुआ:

1) मैं एक बुरा ajax फोन किया,/के बजाय/मॉड्यूल मदद/

2 मदद) मैं एक कार्य कहा जाता है, exampleAction() था, मैं एक

डाल करने के लिए किया था
$this->_helper->layout->disableLayout(); 

लेआउट को फिर से प्रस्तुत करने से रोकने के लिए।

3) मैंने एक रीडायरेक्ट किया, आगे या मार्ग का उपयोग करने का प्रयास करें।

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