2013-08-26 26 views
28

Tôi muốn chuyển một loạt các biến đến layout.phtml của mình trong toàn bộ ứng dụng (trên toàn cầu). Và điều đó có nghĩa là tôi không muốn sử dụngLàm cách nào để truyền các biến sang layout.phtml trên toàn cầu trong ZF2?

$this->layout()->someVar = someValue; 

trong mỗi và mọi hành động tôi có, vì nó sẽ có nhiều công việc và mã bổ sung. Vậy có cách nào để làm điều đó chỉ ở một nơi không? Hoặc những gì tôi đã đề cập là tất cả những gì tôi có! Hy vọng không :)

Có thể sử dụng phiên? - Remi Thomas

Cảm ơn bạn đã giải pháp. Hiện tại đó là những gì tôi đang sử dụng. Đối với thông tin người dùng đã đăng nhập, cài đặt hệ thống và bố cục và danh sách ACL. Nhưng vấn đề là tôi phải định nghĩa một đối tượng mới trong layout.phtml mà tôi không nghĩ là thích hợp, đúng không? Tôi đọc ở đâu đó rằng bất kỳ dữ liệu nào chúng ta cần sử dụng trong các mô hình khung nhìn đều phải được truyền cho nó bằng các hành động của bộ điều khiển. Và đặc biệt tôi không phải là một fan hâm mộ của góc cắt, vì vậy nếu có một cách sạch sẽ để làm điều này tôi không muốn làm điều đó theo cách này. Và gần đây tôi phải nhận được số lượng tin nhắn chưa đọc cho mỗi người dùng và sử dụng nó trong layout.phtml. Vì vậy, nếu tôi làm điều đó trong layout.phtml nó là rất nhiều kịch bản php bên trong một mô hình xem hoặc bố trí.

Cảm ơn

+0

Có thể sử dụng các phiên? –

Trả lời

36

Cách tốt nhất và sạch nhất là sử dụng ViewHelper, như Orochi gợi ý. Dưới đây là một số hướng dẫn để tạo ViewHelper của riêng bạn: http://framework.zend.com/manual/2.2/en/modules/zend.view.helpers.advanced-usage.html. Nó không quá phức tạp;)

Tuy nhiên, vấn đề của bạn cũng có thể được giải quyết theo cách khác. Giả sử các biến bạn cần chứa các giá trị được cung cấp bởi các dịch vụ đã có trong ứng dụng của bạn (và sau đó được tiếp xúc bởi ZF2 ServiceManager), bạn có thể thêm một số dòng vào hàm "onBoostrap" bên trong Module.php của bạn (ví dụ: trên mô-đun Ứng dụng).

đây một ví dụ:

public function onBootstrap($e) { 

    $serviceManager = $e->getApplication()->getServiceManager(); 
    $viewModel = $e->getApplication()->getMvcEvent()->getViewModel(); 

    $myService = $serviceManager->get('MyModule\Service\MyService'); 

    $viewModel->someVar = $myService->getSomeValue(); 

} 

Bằng cách này bạn viết sự phân công chỉ trong một nơi. Biến là sau đó truy cập như bình thường:

$this->layout()->someVar; 
+1

Cảm ơn Stefan, tôi thực sự đánh giá cao điều đó. Tôi hiện đang bận với một phần ưu tiên khác của ứng dụng. Nhưng trong một vài ngày tôi chắc chắn sẽ thử các giải pháp này. Nhưng ngay bây giờ, tôi đoán onBootstrap chính là thứ tôi cần. Tôi sẽ kiểm tra nó. Cảm ơn một lần nữa bro :) –

+0

Bài đăng tuyệt vời! Làm việc như một say mê! – Ron

2

Tạo ViewHelper của riêng bạn cho điều đó.

EDIT:

Đó là cách tôi làm điều đó: Bên trong thư mục src Mô-đun của bạn, tôi có thể tạo mới Xem thư mục sau đó trong Xem thư mục này, tôi tạo ra một thư mục có tên Helper. Trong thư mục này tôi tạo các lớp trợ giúp của tôi. Vì vậy, ví dụ, tôi tạo tập tin Navigation.php. Trong tệp này, tôi tạo một lớp có tên là Navigation, mở rộng từ AbstractHelper (sử dụng Zend \ View \ Helper \ AbstractHelper). Sau đó, tôi viết mã bên trong hàm public __invoke(), cũng trả về một số kết quả. Bạn cũng cần phải thêm xem lớp helper của bạn để 'view_helpers' mô-đun bên trong của config/module.config.php, một cái gì đó như thế:

'view_helpers' => array(
    'invokables' => array(
     'nav' => 'Application\View\Helper\Navigation', 
    ), 
), 

Sau đó, bạn có thể gọi là 'nav' của bạn như là một phương pháp bất cứ nơi nào trong tầm nhìn của bạn hoặc bố cục, ví dụ nav();?>

+0

Cảm ơn, mặc dù tôi đoán nó quá tiên tiến đối với tôi: D. Tôi sẽ làm một số nghiên cứu và quay lại đây. –

+0

Và cảm ơn vì đã theo dõi Orochi;) –

32

Đây là chính xác những gì bạn muốn ...

// Do this inside your Controller before you return your ViewModel 
$this->layout()->setVariable('stack', 'overflow'); 

// Then inside your layout.phtml 
echo $this->stack; 

Không xem những người giúp đỡ, không có quản lý sự kiện, không có quản lý dịch vụ hoặc phương pháp lớp tung hứng khác. Tại sao mọi người trên Stack khiến mọi thứ trở nên phức tạp đôi khi?

+2

Cảm ơn anh bạn, nhưng tôi đã biết điều đó. Câu hỏi đặt ra là, bên trong bộ điều khiển nào, để làm điều đó một lần và cho tất cả! tức là chỉ làm điều đó ở một nơi nhưng có thể truy cập ở mọi nơi và câu trả lời đúng là bạn không làm điều đó trong bộ điều khiển. Mà stefanovalle vui lòng cung cấp giải pháp onBootstrap. Cảm ơn anyways :) –

+0

Bởi vì giải pháp đơn giản của bạn không thể mở rộng. –

+0

Lỗi với Zend 1.12: Phương thức "bố cục" không tồn tại và không bị mắc kẹt trong __call() –

0

Bạn có thể vượt qua biến toàn cầu để bố trí của bạn từ ứng dụng/Module.php trong ZendFramework 2 sử dụng ModuleManager như sau:

Trong ứng dụng của bạn/Module.php

Bước 1:

use Zend\ModuleManager\Feature\AutoloaderProviderInterface; 
use Zend\ModuleManager\Feature\ConfigProviderInterface; 
use Zend\Mvc\MvcEvent; 

Bước 2:

class Module implements AutoloaderProviderInterface, ConfigProviderInterface 
{  
    public function onBootstrap(MvcEvent $e) 
    { 
     $eventManager  = $e->getApplication()->getEventManager(); 
     $eventManager->attach('dispatch', array($this, 'loadConfiguration')); 
    }  
    public function loadConfiguration(MvcEvent $e) 
    {   
      $controller = $e->getTarget(); 
      $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE; 
    } 


    // Your remaining code here.... 

} 

Bước 3:

Trong file layout.phtml bạn sử dụng biến của bạn như $this->YOUR_VARIABLE_NAME

Tôi hy vọng điều này sẽ giúp.

+0

Bỏ phiếu ở đây vì mã này không hoạt động và thực sự không phải là cách tiếp cận đúng. 1) $ điều khiển là không xác định, nó nên được lấy từ MvcEvent nhưng nó không phải. 2) bạn nên truy cập bố trí thông qua bộ điều khiển. Nhận trực tiếp thông qua mô hình xem của MvcEvent, vì câu trả lời được chấp nhận về câu hỏi này gợi ý. –

+0

tôi chỉ xác định $ biến điều khiển ở đây, bây giờ mã OK tôi nghĩ. và đôi khi bạn muốn thêm một số biến toàn cục vào mọi hành động từ mô-đun của mình. chỉ trong trường hợp bạn có thể đi cho phương pháp này. như bạn có thể thêm biến người dùng được xác thực thông qua các thủ thuật này để có được người dùng của bạn trong mọi hành động của mô-đun của bạn –

2

Trong ứng dụng của bạn/Module.php 1) Tạo một sự kiện văn cho Zend Framework như thế này:

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $eventManager->attach('dispatch', array($this, 'loadConfiguration')); 
}  
public function loadConfiguration(MvcEvent $e) 
{   
     $controller = $e->getTarget(); 
     $controller->layout()->YOUR_VARIABLE_NAME = $YOUR_VALUE; 
} 

2) Bây giờ Bạn có thể truy cập vào biến xác định của bạn trong cách bố trí của bạn như thế này: $ this- > YOUR_VARIABLE_NAME;

0

Tại sao không sử dụng kế thừa cho cấu hình lặp lại trừu tượng thông qua bộ điều khiển cơ sở để đặt biến bố cục. Kể từ khi tái sử dụng là mối quan tâm chính ở đây, OOP cơ bản là đủ. Zend không phải làm mọi thứ :).