2013-06-27 77 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