2012-02-02 16 views
25

के नियंत्रक में लेआउट बदलें मैं ZF2.0 बीटा सीख रहा हूं। ZF1 में हम नियंत्रक में मक्खी पर लेआउट बदल सकते हैं:ज़ेंड फ्रेमवर्क 2.0

Zend_Layout::getMvcInstance()->setLayout('layoutname'); 

लेकिन ZF2.0 Zend \ लेआउट कक्षा में विधि getMvcInstance() है नहीं करता है। मुझे लगता है कि यह निर्भरता इंजेक्शन का उपयोग करके किया जा सकता है लेकिन सुनिश्चित नहीं है।

उत्तर

58

जेडएफ 2 विकास के तहत भारी है और अब यह काम करने के तरीके की कोई गारंटी नहीं दी जा सकती है, जब यह ZF2 स्थिर स्थिति तक पहुंचने पर काम करता है। इसलिए

हालांकि, Zend \ Mvc से नया दृश्य परत हाल ही में विलय कर दिया है आप (वर्तमान मास्टर के साथ) अब यह करने के लिए सक्षम होना चाहिए:

public function somethingAction() 
{ 
    // Do some intelligent work 

    $this->layout('layout/different'); 
} 
+1

मैं इस दृष्टिकोण का उपयोग करने की कोशिश कर रहा हूं, लेकिन मुझे परिणाम नहीं मिला है। लेआउट अभी भी स्टैंडअर्ट ('लेआउट/लेआउट') है। यह क्यों काम नहीं करता है? आप मेरी समस्या [यहां] के बारे में अधिक पढ़ सकते हैं (http://stackoverflow.com/questions/23690184/how-to-change-layout-in-controller-in-zendframework2)। लेखक ने पूछा कि –

3

तुम भी लेआउट या तो में सेट करना होगा बूटस्ट्रैप या डी का उपयोग करते समय। डि उदाहरण:

'Zend\View\Resolver\TemplateMapResolver' => array(
     'parameters' => array(
      'map' => array(
      'layout/different' => __DIR__ . '/../view/layout/different.phtml', 
      ), 
     ), 
    ), 
8

सबसे अच्छा तरीका है मैं कार्यों में टेम्पलेट्स स्थापित करने के लिए मिल गया है इस

public function someAction() { 
    $viewModel = new ViewModel(); 
    $viewModel->setTemplate('layout/custom'); 

    return $viewModel; 
} 

अपने module.config.php अपने उचित template_map पथ सुनिश्चित करें कि आप निर्धारित किया है में की तरह है।

'view_manager' => array(
    'template_map' => array(
     'layout/custom' => __DIR__ . '/../view/layout/custom.phtml' 
    ), 
), 
+5

यह दृश्य सेट करेगा, लेकिन लेआउट नहीं होगा। –

3

मैंने उपर्युक्त युक्तियों का प्रयास किया है।

public function somethingAction() 
{ 
    // Do some intelligent work 

    $this->layout('layout/different'); 
} 

मुझे इस स्निपेट के साथ सही परिणाम मिला।

public function someAction() { 
    $viewModel = new ViewModel(); 
    $viewModel->setTemplate('layout/custom'); 

    return $viewModel; 
} 

यह दोनों लेआउट (डिफ़ॉल्ट & वर्तमान मॉड्यूल) दिलवाया।

+0

मुझे एक ही परिणाम का सामना करना पड़ा। मुझे लगता है कि यह महत्वपूर्ण है कि हम लेआउट और टेम्पलेट के बीच अंतर करें। लेआउट को बदलने के लिए, हमें $-> लेआउट ('लेआउट/अलग') का उपयोग करना चाहिए; setTemplate फ़ंक्शन के बजाए। –

+0

आपके स्निपेट में कोड सेट करेगा कि कौन सा दृश्य प्रस्तुत किया जाएगा, लेआउट नहीं। –

7
public function someAction() { 
    $layout = $this->layout(); 
    $layout->setTemplate('layout/custom'); 
    $viewModel = new ViewModel(); 
    return $viewModel; 
} 
+0

मौजूदा लेआउट को बदलते समय कई लेआउट के लिए बिल्कुल सही समाधान –

+0

यह काम करने जैसा लगता है, लेकिन आईडी मेरे लिए काम नहीं करती है :([image] (http://i.gyazo.com/2082ae68e20ade4edee81858f6ae9b8f.png) जो मेरा कोड दिखाता है। पता नहीं क्यों यह काम नहीं करता है: '( –

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