Zend framework2 ZF2局部视图辅助程序

Zend framework2 ZF2局部视图辅助程序,zend-framework2,Zend Framework2,编辑原始帖子以使其更加清晰。现在有一个新的麻烦领域,我认为是纯粹的语法 我是OOP和Zend Framework 2的新手。试着理解分部词的用法。我还扩展了一个由其他人首先启动的应用程序。因此,实体/网关/控制器/视图的命名约定确保为指定的操作返回正确的模板 我试图使用“partial('/nav/index.phtml');”作为在索引页的标题中插入一个代码段的方法。但我想在其他页面上使用不同的部分 按照Marshall的建议,在TemplateController中,我将向viewModel

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

我是OOP和Zend Framework 2的新手。试着理解分部词的用法。我还扩展了一个由其他人首先启动的应用程序。因此,实体/网关/控制器/视图的命名约定确保为指定的操作返回正确的模板

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

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

    <?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;
        }
    }
但是,当我使用以下命令在layout.phtml中包含部分内容时:

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


它显然没有使用/查找$nav_模板的值。我哪里出错了?

您可以在模块类中使用onBootstrap事件。确保在route事件中处理它,否则在onBootstrap中的该点上还没有routematch。例如:

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\u manager'=>'template\u map'键中定义此处使用的模板。

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

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

应该有用。(未测试)

FWIW,干得好,鲁本,但如果使用默认路由设置(如从骨架应用程序中),当使用
$routeMatch->getMatchedRouteName()时,它将始终返回类似
'application\default'
的内容

下面是一个用于正则表达式段路由的轻微修改:

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
    );
    ...
bootstrap上的公共函数(MvcEvent$e)
{
$e->getApplication()->getEventManager()->附加(
\Zend\Mvc\MvcEvent::事件路由,
职能(e美元){
$viewModel=$e->getViewModel();
$nav=new\Zend\View\Model\ViewModel();
$routeMatch=$e->getRouteMatch();
$routeMatch参数=$routeMatch->getParams();//addChild($nav,'nav');
},
-1000
);
...

简单地说,我想你需要做的就是使用

$this->nav_template
代替

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

重点是

使用

$this->nav_template

感谢您的详细建议,Ruben。我进入ZF2的第一步是扩展一些由更熟悉的人首先编写的内容。视图管理器正在指定应用程序索引,但是当调用相应的操作时,所有其他模板都会通过模板控制器调用。因此我相信我需要在控件中处理此问题ler.没问题。我不确定我是否理解您描述的体系结构。您是说所有请求都被路由到一个模板控制器,该控制器决定使用哪个模板?如果是这样的话,这听起来是一种非常奇怪的处理方式。最后要注意的是,如果它抛出其他任何人,我必须获取参数值,因为像这样设置我的路由:$routeMatchParams=$routeMatch->getParams();开关($routeMatchParams['controller'])){case'Application\Controller\Topic':好的。我相信这应该可以,但我的语法有问题。我将更新原始帖子。这是因为您将变量设置为视图脚本而不是布局。请再次查看我的答案,并仔细查看变量被分配到的对象:
$this->layout()->setVariable(
此外,如果您使用的是禁用布局的
setTerminal(true)
,则根本无法显示布局。Rob Allen发表了一篇关于在另一个视图模型中访问viw变量的有用博文:
$nav_template
$this->nav_template