2010-10-17 3 views
0

Я нашел этот код here, пытаясь понять, что делает actionstack и почему они должны быть настолько плохими. Я думал, что actionstack - это всего лишь один тип помощника действий (точно так же, как flashmessenger или redirector или ViewRenderer).Как это сделать без actionstack

Но так или иначе, кто-нибудь понимает, что делает этот код и как делать то же самое без действия?

class MyController_Action extends Zend_Controller_Action { 
    function init() { 
     /** you might not want to add to the stack if it's a XmlHttpRequest */ 
     if(!$this->getRequest()->isXmlHttpRequest()) { 
      $this->_helper->actionStack('left', 'somecontroller', 'somemodule'); 
      $this->_helper->actionStack('center', 'somecontroller', 'somemodule'); 
      $this->_helper->actionStack('right', 'somecontroller', 'somemodule'); 
     } 
} 

class MyController extends MyController_Action { 
    function indexAction() { 
     // do something 
    } 
} 

class SomecontrollerController extends MyController_Action { 
    function leftAction() { 
     // do something 

     $this->_helper->viewRenderer->setResponseSegment('left_container'); 
    } 

    function centerAction() { 
     // do something 

     $this->_helper->viewRenderer->setResponseSegment('center_container'); 
    } 

    function rightAction() { 
     // do something 

     $this->_helper->viewRenderer->setResponseSegment('right_container'); 
    } 
} 

ответ

3

Я бы осуществить действия, как повторно usalbe виджетов (помощников действий с preDispatch() методами), как описано здесь:

Using Action Helpers To Implement Re-Usable Widgets - phly, boy, phly

виджеты могут сделать вывод в placeholder зрения хелперов, и поэтому можно использовать где угодно в макете

Они также могут отображать содержимое в другом placeholder, например Боковая панель, как описано в руководстве:

protected function _initSidebar() 
    { 
     $this->bootstrap('View'); 
     $view = $this->getResource('View'); 

     $view->placeholder('sidebar') 
      // "prefix" -> markup to emit once before all items in collection 
      ->setPrefix("<div class=\"sidebar\">\n <div class=\"block\">\n") 
      // "separator" -> markup to emit between items in a collection 
      ->setSeparator("</div>\n <div class=\"block\">\n") 
      // "postfix" -> markup to emit once after all items in a collection 
      ->setPostfix("</div>\n</div>"); 
    } 

Другим решением является использование их помощников, которые доступ к данным модели, и запустить их в макете.

+0

Еще одна замечательная статья о практическом ZF от проекта –

Смежные вопросы