2010-10-17 8 views
0

J'ai trouvé ce code here en essayant de comprendre ce que fait un actionstack et pourquoi il est supposé être si mauvais. Je pensais qu'un actionstack est juste un type d'aide d'action (juste comme flashmessenger ou redirector ou ViewRenderer).Comment faire cela sans actiontack

Mais de toute façon, est-ce que quelqu'un comprend ce que fait ce code et comment faire la même chose sans actiontack?

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'); 
    } 
} 

Répondre

3

je aimerais mettre en œuvre les actions que les widgets de re-usalbe (aides d'action avec preDispatch() méthodes), comme décrit ici:

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

Les widgets peuvent rendre la sortie en placeholder les aides de vue, et ainsi être utilisé n'importe où dans la disposition

Ils peuvent également rendre le contenu dans d'autres placeholder, par exemple barre latérale, comme décrit dans le manuel:

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>"); 
    } 

L'autre solution consiste à utiliser les aides de vue, qui ont accès aux données du modèle, et les exécuter dans la mise en page.

+0

Encore un excellent article sur le ZF pratique du chef de projet –