【问题标题】:Zf2 changing layoutZf2改变布局
【发布时间】:2014-10-02 21:46:52
【问题描述】:

我正在尝试根据我的路线更改布局,这是我到目前为止所做的:

<?php namespace Application\Listener;

use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;
use Zend\Mvc\MvcEvent;
use Zend\View\Model\ModelInterface as Model;

class LayoutListener extends AbstractListenerAggregate
{
    /**
     * Attach one or more listeners
     * Implementors may add an optional $priority argument; the EventManager
     * implementation will pass this to the aggregate.
     * @param EventManagerInterface $events
     * @return void
     */
    public function attach(EventManagerInterface $events)
    {
        $sharedEvents = $events->getSharedManager();
        $this->listeners[] = $sharedEvents->attach(
            'Zend\Mvc\Controller\AbstractController',
            MvcEvent::EVENT_DISPATCH,
            array($this, 'handleLayouts'),
            -99);
    }

    public function handleLayouts(MvcEvent $event)
    {
        $viewModel = $event->getViewModel();
        if (!$viewModel instanceof Model) {
            return;
        }

        $routeMatch = $event->getRouteMatch();
        $resolver = $event->getApplication()
            ->getServiceManager()
            ->get('Zend\View\Resolver\TemplatePathStack');

        if ('Application\Controller\Index' !== $routeMatch->getParam('controller')) {
            return;
        }

        switch ($routeMatch->getParam('action')) {
            case 'index':
                $template = 'layout/layout';
                break;
            case 'home':
                $template = 'layout/home';
                break;
            default:
                $template = null;
                break;
        }

        /**
         *
         * Don't know why, but to set a template must use $event->getViewModel()
         * and for terminal must use $event->getResult(), otherwise it won't works
         *
         */

        // if template is resolvable, use it, otherwise go terminal
        if ($template && $resolver->resolve($template)) {
            $viewModel->setTemplate($template);
        } else {
            if ($event->getResult() instanceof Model) {
                $event->getResult()->setTerminal(true);
                $viewModel->setTerminal(true);
            }
        }
    }
}

Module.php

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']))
        ->setFallbackLocale('en_US');

    $eventManager = $e->getApplication()->getEventManager();
    $eventManager->attachAggregate(new LayoutListener());

    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
}

有一件事我没有得到,如果我想改变布局,我必须使用

  • $event-&gt;getViewModel()-&gt;setTemplate($template);

否则不行,如果我想设置viewModel终端,我必须使用

  • $event-&gt;getResult()-&gt;setTerminal(true);

否则它不起作用,谁能解释我为什么?

我要实现的目标如下:我有一个用于 index/ 的模板,它初始化 iFrame,加载任何其他路由的内容,因此在索引布局中我设置了菜单,而其他任何页面都没有不需要布局,因为使用了 index/ 。

现在我想要一个具有自定义布局(自定义显示)的子页面,因此,根据路线,我为视图模型设置了一个新布局。

【问题讨论】:

    标签: php zend-framework2 zend-layout


    【解决方案1】:

    您可以将子视图添加到您的视图模型(如果您在控制器中) - 如果您为子视图(或子页面)制作自己的控制器:

    $view = new ViewModel(array(
        // parameters
    ));
    
    $view->addChild($this->forward()->dispatch('SubpageController', array(
        'action' => 'index',
    )), 'contentOfSubpage');
    
    return $view;
    

    在模板中,你可以像这样访问 SubpageController 的内容:

    <?php echo $contentOfSubpage; ?>
    

    至少,这就是您可以组合多个控制器的方式,因此可以组合不同的布局

    【讨论】:

    • 感谢您的提示,但它并没有真正回答我的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多