2009-02-24 8 views
3

Comment construire un site web modulaire avec le framework Zend. J'ai des pages en db, chaque page est représentée en tant qu'url. Chaque page a un contenu 1toN. Chaque contenu a un contrôleur, une action et une position (+ autres colonnes désormais non importantes). Ainsi, une requête est une page et plusieurs contenus (plusieurs actions). Comment puis-je construire toutes les actions avant la sortie? Je voudrais avoir la conception de mise en page comme l'exemple ci-dessous, où le contenu est placé dans des conteneurs (les actions sont exécutées avant l'impression de la mise en page).Site web modulaire avec framework zend, pile d'actions

<div id="left"> 
    <?= $this->layout()->left_container ?> 
</div> 
<div id="center"> 
    <?= $this->layout()->center_container ?> 
</div> 
<div id="right"> 
    <?= $this->layout()->right_container ?> 
</div> 

Jusqu'à présent, j'appelle des actions de mise en page de vue, mais je n'aime pas cette approche:

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

Merci.

p.s.

Le code d'adepretis est similaire à mon, les vues de mes actions sont exécutées dans la mise en page, ce qui signifie que lorsqu'une erreur survient, elle est imprimée dans la mise en page où l'action est appelée. N'y a-t-il pas de lactosérum que les actions sont construites avant la mise en page? Une autre mauvaise chose est que dans chaque action que je dois exécuter ...-> setResponseSegment, je voudrais que cela soit automatisé.

p.s. # 2

J'ai trouvé la réponse, elle est listée ci-dessous comme réponse. S'il y a un lactosérum, je peux le faire plus facilement s'il vous plaît écrivez-le.

Répondre

1

J'ai trouvé ma réponse sur un autre forum. Voici le 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 chaque contrôleur étend

class BaseController extends Zend_Controller_Action 
{ 

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

} 

Mise en page .phtml

<div> 
    <h2><u>LEFT:</u></h2> 
    <?=$this->layout()->left?> 
</div> 
<div> 
    <h2><u>CENTER:</u></h2> 
    <?=$this->layout()->center?> 
</div> 
<div> 
    <h2><u>RIGHT:</u></h2> 
    <?=$this->layout()->right?> 
</div> 

C'est ce que je voulais, si quelqu'un a une meilleure solution, veuillez répondre à la question et j'accepterai sa réponse.

1

Vous pouvez utiliser le ActionStack helper. Par exemple:

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

Une demande de /UnModule/ma/index résultats dans l'exécution /UnModule/somecontroller/gauche. /somemodule/somecontroller/right, /somemodule/somecontroller/center qui se retrouvent dans les segments de mise en page correspondants.

+0

Votre code est similaire à mon, les vues de mes actions sont exécutées dans la mise en page, ce qui signifie que lorsqu'une erreur s'est produite, elle est imprimée dans la mise en page; n'y at-il pas de lactosérum que les actions sont construites avant la mise en page? Une autre mauvaise chose est que dans chaque action que je dois exécuter ...-> setResponseSegment, je voudrais ce automatisé –

+0

Je ne comprends pas exactement ce que vous entendez par "il n'y a pas de lactosérum que les actions sont construites avant la mise en page" .. La sortie de mise en page est rendue après l'exécution de toutes les actions. Et pour l '"automation": si vos contrôleurs étendent MyController_Action, la méthode init() fait exactement cela pour toutes les actions. –

+0

Par cela je veux dire, Si vous faites une erreur dans l'action, il sera imprimé dans la mise en page où il est positionné; donc je suppose que les actions sont appelées quand elles sont mises en page. Exemple: echo $ variableDoesntExists; dans l'une des actions, imprimera avis dans la conception ... –

0

salut je rencontre également le même problème. La solution que vous suggérez fonctionne bien. Mais mon baseController est dans la base du module.Le travail de code lisse avec BaseController mais quand j'étendu avec des contrôleurs dans une autre erreur du module occure en tant que base du contrôleur ne peut pas identifier dans un autre contrôleur Pour exemple: modules/base/contrôleur/BaseController modules/utilisateur/contrôleur/UserController

Tous Solutions ?