2013-02-21 4 views
0

У меня есть файл макета следующим образом:Использование плагина контроллера расширить существующий макет в рамках ZEND

<?php echo $this->doctype(); ?> 
<html> 
    <head> 
     <?php echo $this->headTitle(); ?> 
     <?php echo $this->headLink(); ?> 
    </head> 
    <body> 
     <?php echo $this->layout()->content; ?> 
    </body> 
</html> 

У меня есть система меню, которая записывается в другом шаблоне

<p> 
    <div> 
     menu code goes here 
    </div> 
    <p> 
     <?php echo $this->actionContent; ?> 
    </p> 
</p> 

Я хотел выход метода действия должен быть помещен в $ this-> actionContent, и все это должно идти в макет.

Тогда я написал плагин контроллера следующим образом:

class ZFExt_Controller_Plugin_Addmenu extends Zend_Controller_Plugin_Abstract 
{ 
    public function postDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $view = Zend_Controller_Front::getInstance() 
         ->getParam('bootstrap') 
         ->getResource('view'); 

     if (false !== $request->getParam('menu')) 
     { 
      $response = $this->getResponse(); 
      $content = $response->getBody(true); 
      $view->menuContent = $content['default']; 
      $updatedContent = $view->render('menu.phtml'); 
      $response->setBody($updatedContent); 
     } 
    } 
} 

В классе контроллера

class IndexController extends Zend_Controller_Action { 


    public function indexAction() { 

    } 

    public function viewAction() 
    { 
      $this->getRequest()->setParam('menu', false); 
    } 
} 

Так в зависимости от того действия не хочет, чтобы в меню есть мы можем передать «меню» параметр со значением 'ложный'.

Мой вопрос: это правильный способ?

+0

Вы можете использовать навигацию zend, чтобы сделать это – Shaolin

ответ

1

Во-первых, я, вероятно, не сделал бы меню из действия. Я склонен думать о действиях, соответствующих HTTP-запросам, создавая полные страницы/ответы, а не только фрагменты страницы для ожидающего клиента. У меня было бы либо отдельное меню дескриптора класса/компонента, либо просто использовать Zend_Navigation.

Помимо этого, если я правильно понимаю, вы просто хотите, чтобы каждое действие позволяло включать/отключать часть меню макета, правильно?

Итак, как просто установить переключатель в представлении, который включает/отключает меню в макете.

Схема выглядит следующим образом:

<?php echo $this->doctype(); ?> 
<html> 
    <head> 
     <?php echo $this->headTitle(); ?> 
     <?php echo $this->headLink(); ?> 
    </head> 
    <body> 
     <?php if ($this->renderMenu): ?> 
      // render menu here 
     <?php endif; ?> 
     <?php echo $this->layout()->content; ?> 
    </body> 
</html> 

Затем в действие, если вы хотите отключить рендеринг меню, вы можете установить:

$this->view->renderMenu = false; 

Возможно также стоит установить значение по умолчанию для флаг $view->renderMenu в какой-то момент цикла отправки запроса - возможно, в бутстрапе или в плагине контроллера или в контроллере init().

+0

Я действительно пытался выяснить, есть ли способ расширить шаблон макета, чтобы мы могли максимально избегать фрагментов кода внутри шаблона. Я ничего не нашел в Интернете, поэтому я попробовал собственную версию расширяющего шаблона. Могу ли я предположить, что в zend нет такой возможности, как расширение шаблонов? – kaushik

+0

Я видел материал о многоуровневых макетах. IIRC, другой плагин перехватывает макет рендеринга, что-то вроде этого. Возможно, проще было бы использовать систему шаблонов, такую ​​как Twig, которая поддерживает наследование шаблонов. –