Zend Framework 2 – Layout động với View Helper

zend framework 2_view helperThông thường layout sẽ là cố định và chỉ có phần nội dung được thay đổi. Bởi vì layout không được có một controller xử lý như các action, nên nếu bạn cần tạo một layout động với một phần giao diện được nạp từ database (ví dụ tạo menu) thì không thể làm theo cách thông thường. Với trường hợp này, ta sẽ tạo và sử dụng các View Helper.

Giới thiệu View Helper

View helper là các lớp được tạo ra nhằm bổ sung thêm các hàm hỗ trợ trong view script. Có khá nhiều view helper mà bạn thường xuyên sử dụng như doctype, headtitle, headmeta, basepath,… Danh sách các helper cơ bản nằm trong namespace Zend\View\Helper và được đăng kí trong Zend\View\HelperPluginManager. Ngoài ra có rất nhiều view helper khác để bạn làm việc với form trong namespace Zend\Form\View\Helper.

Các view helper không phân biệt hoa-thường. Bạn có thể gọi $this->basepath() hay $this->basePath() đều như nhau.

Trong view, bạn có thể lấy được instance của helper bằng cách dùng $this->plugin(‘helper_name’). Sau đó, có thể gọi các phương thức của helper đó để thiết lập lại các thuộc tính của nó. Ví dụ:

// view script
$this->plugin('basepath')->setBasePath("new/path");

Đối tượng $this trong view là một PhpRenderer.

Tạo View Helper

Tôi sẽ tạo một view helper dùng để nạp danh sách menu tương ứng với từng user đăng nhập vào. Lớp view helper này cần được kế thừa từ Zend\View\Helper\AbstractHelper và phải được định nghĩa phương thức __invoke().

__invoke() là một “magic method” trong PHP giúp cho một đối tượng có thể được sử dụng như một phương thức.

Nhờ phương thức __invoke() này, khi tạo một instance của lớp MainMenu, bạn có thể gọi instance đó như một phương thức, dạng như:

$obj = new MainMenu($adapter);
$menus = $obj();

Lớp MainMenu sau sẽ dùng một Adapter để nạp dữ liệu dưới dạng array:

<?php
// module/Foo/src/Foo/View/Helper

namespace Foo\View\Helper;

use Zend\Authentication\AuthenticationService;
use Zend\View\Helper\AbstractHelper;
use Zend\Db\Adapter\Adapter;

class MainMenu extends AbstractHelper
{
	protected $adapter;

    public function __construct(Adapter $adapter)
    {
        $this->adapter = $adapter;
    }

    public function __invoke()
    {
    	$authSer = new AuthenticationService();
    	$user = $authSer->getIdentity();
    	$result = $this->adapter->query("call uac_menu_select(?);",
    									array($user->userid));
        return $result->toArray();
    }
}

Đăng kí View Helper

Bạn có thể đăng kí view helper trong tập tin config bằng cách thêm một phần tử ‘view_helpers’:

// module/Foo/config/module.config.php:

return array(
   'view_helpers' => array(
      'invokables' => array(
         'mainmenu' => 'Foo\View\Helper\MainMenu',
      ),
   ),
   // ...
);

Nhưng do helper mainmenu này cần truyền tham số vào contructor nên ta sẽ đăng kí nó trong phương thức getViewHelperConfig của lớp Module.php

// module/Foo/Module.php

namespace Foo;

use Zend\Config\Config;
// ...

class Module
{
    public function getAutoloaderConfig()
    {
        // ...
    }

    public function getConfig()
    {
        // ...
    }

	public function getServiceConfig()
    {
       // ...
    }
 	public function getViewHelperConfig()
    {
        return array(
            'factories' => array(
                'mainMenu' => function($sm) {
                    $adapter = $sm->getServiceLocator()->get('database');
                    return new MainMenu($adapter);
                },
            ),
        );
    }
}

Sử dụng trong view/ layout

// module/Foo/view/layout.phtml

<div id="sidebar">
	<ul class="nav">
	<?php
		$menus = $this->mainMenu();
		foreach ($menus as $item){
			echo "<li><a class='headitem' href='#'>" . $item['menuname'] . "</a></li>";
		}
	?>
	</ul><!--end nav-->
</div><!--end sidebar-->

YinYangIt

Advertisements

13 thoughts on “Zend Framework 2 – Layout động với View Helper

  1. cảm ơn bạn bài viết rất hay

    nhân tiện bạn có thể làm thếm 1 tut về form trong ZF2 được không
    cụ thể mình có 1 form trong đó có thành phần select box
    – và mình muốn lấy dữ liệu từ database đổ vào cái selectbox đó để chọn và insert nó vào bảng mới

    thks nhiều

    Phản hồi
  2. bạn ơi giúp mình với
    là minh muốn truyền dữ liệu từ controller ->layout
    e muôn làm layout oy trong minh include footer header..
    mak header footer là lấy dữ liệu từ database vào..
    hướng dẫn cách làm dùm em nhak a..!
    zend framwork 2

    Phản hồi

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s