2012-02-02 18 views
25

Tôi đang học ZF2.0 beta. Trong ZF1 chúng ta có thể thay đổi cách bố trí một cách nhanh chóng trong điều khiển:Thay đổi bố cục trong bộ điều khiển của Zend Framework 2.0

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

Nhưng trong ZF2.0 Zend \ lớp Layout không có phương pháp getMvcInstance(). Tôi nghĩ rằng nó có thể được thực hiện bằng cách sử dụng tiêm phụ thuộc nhưng không chắc chắn.

Trả lời

58

ZF2 được phát triển mạnh và không đảm bảo có thể được thực hiện theo cách hoạt động ngay bây giờ, sẽ là cách hoạt động khi ZF2 đạt trạng thái ổn định.

Tuy nhiên, lớp nhìn mới từ Zend \ MVC là thời gian gần đây sáp nhập, do đó bạn sẽ có thể làm được điều này bây giờ (với chủ hiện tại):

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

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

Tôi đang cố gắng sử dụng phương pháp này, nhưng tôi không nhận được kết quả. Bố cục vẫn là standart ('layout/layout'). Tại sao nó không hoạt động? Bạn có thể đọc thêm về vấn đề của tôi [ở đây] (http://stackoverflow.com/questions/23690184/how-to-change-layout-in-controller-in-zendframework2). –

3

Bạn cũng sẽ phải thiết lập cách bố trí hoặc trong bootstrap hoặc khi sử dụng di. Di dụ:

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

Cách tốt nhất mà tôi đã tìm thấy để thiết lập mẫu trong hành động là như thế này

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

    return $viewModel; 
} 

Trong module.config.php chắc chắn rằng bạn đã thiết lập đường dẫn của bạn thích hợp template_map của bạn.

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

Thao tác này sẽ đặt chế độ xem chứ không phải bố cục, theo tác giả được hỏi. –

3

Tôi đã thử các mẹo ở trên.

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

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

Tôi nhận được kết quả chính xác với đoạn mã này.

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

    return $viewModel; 
} 

Nó tìm nạp cả hai bố cục (mặc định & mô-đun hiện tại).

+0

Tôi đã gặp phải kết quả tương tự. Tôi nghĩ điều quan trọng là chúng tôi phân biệt giữa bố cục và mẫu. Để thay đổi bố cục, chúng ta nên sử dụng $ this-> layout ('layout/different'); thay vì hàm setTemplate. –

+0

Mã trong đoạn mã của bạn sẽ đặt chế độ xem nào sẽ được hiển thị, chứ không phải bố cục. –

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

Giải pháp hoàn hảo cho nhiều bố cục khi thay đổi Bố cục hiện tại –

+0

Dường như hoạt động, nhưng id không hoạt động đối với tôi: ([image] (http://i.gyazo.com/2082ae68e20ade4edee81858f6ae9b8f.png) hiển thị mã của tôi. không biết tại sao nó không hoạt động: '( –

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