Sitio web modular con zend framework, stack of actions

Cómo construir un sitio web modular con Zend framework. Tengo páginas en db, cada página se representa como url. Cada página tiene contenidos 1toN. Cada contenido tiene controlador, acción y posición (+ otras columnas que ahora no son importantes). Entonces, una solicitud es una página y múltiples contenidos (múltiples acciones). ¿Cómo puedo construir todas las acciones antes de la salida? Me gustaría tener un diseño de diseño como el siguiente, donde los contenidos se colocan en contenedores (las acciones se ejecutan antes de la impresión del diseño).

layout()->left_container ?>
layout()->center_container ?>

Hasta ahora llamé a acciones desde la vista de diseño, pero no me gusta este enfoque:

 foreach ($contents as $item) { echo $this->action($item['action'], $item['controller'], null, array('content' => $item)); } 

Gracias.

PD

El código de adepretis es similar al mío, las vistas de mis acciones se ejecutan dentro del diseño, lo que significa que cuando se produce un error, se imprime en el diseño donde se llama a la acción. ¿No hay suero de leche que las acciones se construyen antes de la salida del diseño? Otra cosa mala es que en cada acción que debo ejecutar …-> setResponseSegment, me gustaría que esto sea automático.

ps # 2

He encontrado la respuesta, se enumera a continuación como respuesta. Si hay un suero, puedo hacerlo más fácilmente por favor escríbalo.

Puede usar el ayudante ActionStack . Por ejemplo:

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

Una solicitud de / somemodule / my / index da como resultado la ejecución / somemodule / somecontroller / left . / somemodule / somecontroller / right , / somemodule / somecontroller / center que terminan en los correspondientes segmentos de diseño.

Encontré mi respuesta en otro foro. Aquí está el asnwer:

MyPlugin

 class MyPlugin extends Zend_Controller_Plugin_Abstract { public function routeStartup(Zend_Controller_Request_Abstract $request) { $action_stack = new Zend_Controller_Action_Helper_ActionStack(); // here I will read actions from db and run it in loop, but for example few are staticly added bellow $action_stack->actionToStack('index', 'content', 'default', array('position' => 'left')); $action_stack->actionToStack('index', 'content', 'default', array('position' => 'center')); $action_stack->actionToStack('index', 'edo', 'default', array('position' => 'center')); $action_stack->actionToStack('left', 'edo', 'default', array('position' => 'left')); $action_stack->actionToStack('right', 'edo', 'default', array('position' => 'right')); } } 

BaseController , que cada controlador extiende

 class BaseController extends Zend_Controller_Action { public function preDispatch() { $position = $this->_request->getParam('position', false); if ($position) { $this->_helper->viewRenderer->setResponseSegment($position); } } } 

Diseño .phtml

 

LEFT:

layout()->left?>

CENTER:

layout()->center?>

RIGHT:

layout()->right?>

Esto es lo que quería, si alguien tiene una mejor solución, responda la pregunta y aceptaré su respuesta.

hola, también me encuentro con el mismo problema. La solución que sugieres funciona bien. Pero mi baseController está en la base del módulo. El código funciona sin problemas con baseController pero cuando extendí con controladores en otro módulo, el error ocurre como base. El controlador no puede identificar en otro controlador. Por ejemplo: modules / base / Controller / baseController modules / user / Controller / userController

¿Alguna solución?