2013-06-27 79 views
2

编辑原文更清晰。现在我认为有一个新的问题是纯语法。ZF2部分查看帮助

我是OOP和Zend Framework 2的新手。试图理解partials的用法。我还在扩展由其他人首先启动的应用程序。因此,实体/网关/控制器/视图的命名约定确保对于指定的操作,返回正确的模板。我试图使用“partial('/ nav/index.phtml');”作为在索引页面的标题中插入一个片段的一种方式。但是我想在其他页面上使用不同的部分。

继马歇尔的建议,在TemplateController,我加入一个变量(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; 
     } 
    } 

我用下面的命令来验证我的变量是被包括在所述对象,该对象是

echo $viewModel->nav_template; 

然而,当我去使用包括在layout.phtml部分执行以下操作:

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

显然不是使用/找到$ nav_template的值。我哪里做错了?

+0

这是因为你设置变量视图脚本,而不是布局。再次查看我的答案,并仔细查看变量分配给的内容:'$ this-> layout() - > setVariable(' –

+0

另外,如果您正在使用,则不会让布局显示出来'setTerminal(true)' - 禁用布局 –

+0

以下是Rob Allen有关访问另一个视图模型中viw变量的有用博客文章:http://akrabat.com/zend-framework-2/access-view-variables-in -another-view-model/ – dualmon

回答

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;

请注意,您还必须在'view_manager'=>'template_map'键中定义您在module.config.php中使用的模板。要改变布局导航

<?php echo $this->partial(isset($nav_template) ? $nav_template : 'nav/index'); ?> 
在你的控制器

然后:

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

应工作

+0

感谢您的详细建议Ruben。我第一步进入ZF2的时候,首先扩展了一些用某种方式编写的知识,视图管理器指定了应用程序索引,但所有其他模板都通过模板调用控制器当相应的动作被调用,所以我相信我需要在控制器中处理这个问题 – manisha

+0

没问题,我不确定我是否理解你描述的架构。选择一个模板控制器来决定使用哪个模板?如果是这样,这听起来像处理事情的一种非常奇怪的方式。 – Ruben

+0

我得到了这个工作。谢谢! – manisha

0

在您的布局模板,调用动态部分,像这样一个默认的备用。 (未经测试)

+0

好的。我相信这应该有效,但是我的语法有些问题,我会更新原文。 – manisha

0

FWIW,好工作,鲁本,但如果你使用默认的路由设置(如从骨架应用程序),它总是会返回像'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 
    ); 
    ... 
0

简单地说,我认为,所有你需要做的是用...

$this->nav_template 

:将与正则表达式网段路由工作...

$nav_template 

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

点是...

使用...

$this->nav_template