2

新しいレイアウトを追加するには、ハードコーディングする必要があります。次に、ZF2 で動的なテンプレート マップを追加する方法を見つけたいと思います。

私のmodule.config.php

'view_manager' => array (
    'display_not_found_reason' => true,
    'display_exceptions' => true,
    'doctype' => 'HTML5',
    'not_found_template' => 'error/404',
    'exception_template' => 'error/index',
    'template_map' => array (
            'layout/layout' => __DIR__ . '/../../../template/layout/layout.phtml',
            'layout/custom' => __DIR__ . '/../../../template/layout/custom.phtml',
            'error/404' => __DIR__ . '/../../../template/error/404.phtml',
            'error/index' => __DIR__ . '/../../../template/error/index.phtml' 
    ),
    'template_path_stack' => array (
            __DIR__ . '/../view/'
    ) 
) 

そして、この方法で新しいレイアウトを設定しました

$e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
    $controller = $e->getTarget();
    $controller->layout('template_name');
}, 100);

アドバイス/サンプルを教えてください

ありがとう !

==================

2012 年 12 月 8 日更新:

これに対する解決策を見つけ、「階層テンプレート システム」に適用しました。

module.config.php を変更する

'template_path_stack' => array (
     __DIR__ . '/../view/',
 __DIR__ . '/../../../' //Parent folder of template path
) 

Module.php に追加:

$e->getApplication()->getEventManager()->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) {
    $controller = $e->getTarget();
    $controllerClass = get_class($controller);


    //Get routing info
    $controllerArr = explode('\\', $controllerClass);
    $currentRoute = array(
        'module' =>  strtolower($controllerArr[0]),
        'controller' => strtolower(str_replace("Controller", "", $controllerArr[2])),
        'action' => strtolower($controller->getEvent()->getRouteMatch()->getParam('action'))
    );


    //Get curr route
    $currAction = implode('/',$currentRoute);
    $currController = $currentRoute['module'] . '/' . $currentRoute['controller'];
    $currModule = $currentRoute['module'];



    //Template file location
    $templatePath = __DIR__ .'/../../template/';

    //Set template
    $template = 'layout/layout'; // Default template

    if (file_exists($templatePath . $currAction.'.phtml')) {
        $template = $currAction;
    }else if(file_exists($templatePath . $currController.'.phtml')) {
        $template = $currController;
    }else if(file_exists($templatePath . $currModule.'.phtml')) {
        $template = $currModule;
    }else{
        if($currentRoute['controller']=='admin'){
            $template = 'admin/layout'; // Admin default template
        }
    }

    $controller->layout('template/'.$template); //Pevert duplicate layout
}, 100);

注:「レイアウト」と「ビュー」の間にキーと同じ変数を設定した場合。「レイアウト」を複製してレンダリングし、現在のビューを理解できません

4

1 に答える 1

0

コントローラで新しいビューモデルを作成するときに、そこで作成したテンプレートを設定できます。

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

    return $viewModel;
}

layout.phtmlファイルがtemplate_mapで設定したパスにあることを確認してください

于 2012-12-01T23:50:50.197 に答える