2

编辑原始帖子以使其更加清晰。现在有一个新的麻烦领域,我认为是纯语法。

我是 OOP 和 Zend Framework 2 的新手。试图了解部分的使用。我还在扩展一个由其他人首先启动的应用程序。因此,Entity/Gateway/Controller/View 的命名约定确保对于指定的操作,返回正确的模板。

我正在尝试使用“部分('/nav/index.phtml');” 作为在索引页的标题中插入一个片段的一种方式。但我想在其他页面上使用不同的部分。

按照 Marshall 的建议,在 TemplateController 中,我将一个变量 (nav_template) 添加到 viewModel 中,指定用于导航的部分:

    <?php

    namespace Application\Controller;

    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;

    class TplController extends AbstractActionController
    {
        public function topicAviewAction()
        {
            $viewModel = new ViewModel();
            $viewModel->setTerminal(true);
        $viewModel->setVariable('nav_template', 'nav/topica.phtml');
            return $viewModel;
        }

        public function topicBviewAction()
        {
            $viewModel = new ViewModel();
            $viewModel->setTerminal(true);
        $viewModel->setVariable('nav_template', 'nav/topicb.phtml');
            return $viewModel;
        }
    }

我使用下面的命令来验证我的变量是否包含在对象中,它是

    echo $viewModel->nav_template;

但是,当我使用以下内容在 layout.phtml 中包含部分内容时:

    <?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>

它显然没有使用/查找 $nav_template 的值。我哪里做错了?

4

4 回答 4

2

您可以在 Module 类中使用 onBootstrap 事件。确保在路由事件中处理它,否则在 onBootstrap 中你还没有路由匹配。例子:

public function onBootstrap(MvcEvent $e)
    {
        $e->getApplication()->getEventManager()->attach(
                \Zend\Mvc\MvcEvent::EVENT_ROUTE,
                function($e) {
                    $viewModel = $e->getViewModel();
                    $nav = new \Zend\View\Model\ViewModel();
                    $routeMatch = $e->getRouteMatch();
                    switch ($routeMatch->getMatchedRouteName())
                    {
                        case 'home':
                            $template = 'your/template';
                            break;

                        default:
                            break;
                    }
                    $nav->setTemplate($template);
                    $viewModel->addChild($nav, 'nav');
                },
                -1000
        );
        ...

在您的布局中,您可以使用: echo $nav;

请注意,您还必须在 module.config.php 的 'view_manager' => 'template_map' 键中定义您在此处使用的模板。

于 2013-06-28T03:58:13.367 回答
0

在您的布局模板中,调用具有默认回退的动态部分,如下所示:

<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?>

然后在您要更改布局导航的控制器中:

$this->layout()->setVariable('nav_template', 'nav/other');

应该管用。(未经测试)

于 2013-06-28T05:29:54.533 回答
0

简而言之,我认为您需要做的就是使用...

$this->nav_template

代替...

$nav_template

其他框架做的事情不同,但在 ZF2 中,变量被设置为视图模型本身,因此可以使用魔术 getter 方法从布局/视图中调用,并从视图/视图模型类中的 $data 变量中获取它。

重点是...

利用...

$this->nav_template
于 2013-11-15T19:01:01.367 回答
0

FWIW,干得好,Ruben,但是如果您使用默认路由设置(例如来自 Skeleton App),它总是会返回类似于'application\default'您使用时的内容$routeMatch->getMatchedRouteName()

这是一个适用于正则表达式段路由的小模块:

public function onBootstrap(MvcEvent $e)
{
    $e->getApplication()->getEventManager()->attach(
            \Zend\Mvc\MvcEvent::EVENT_ROUTE,
            function($e) {
                $viewModel = $e->getViewModel();
                $nav = new \Zend\View\Model\ViewModel();
                $routeMatch = $e->getRouteMatch();
                $routeMatchParams = $routeMatch->getParams(); // <-- added this

                switch ($routeMatchParams['controller']) //  // <-- switch on invokable alias of your controller(s)
                {
                    case 'Application\Controller\YourController':
                        $template = 'your/custom-template';
                        break;

                    default:
                        $template = 'your/default-template';
                        break;

                }

                $nav->setTemplate($template);
                $viewModel->addChild($nav, 'nav');
            },
            -1000
    );
    ...
于 2013-07-02T23:43:28.797 回答