Bonjour,

Je suis coincé depuis plus de 3 heures sur un soucis qui me laisse sans voix.

J'ai réaliser un controller gérant l'affichage du menu de gauche sur mon site. Donc en fonction de si on est sur une page d'admin ou public ce n'est pas le même menu.

J'ai donc réaliser via un if et un actionstack l'appel de l'action affichant le menu correct :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 [lang=php]
class MenuController extends SurcoucheZend_Controller_Action{
 
	/**
	 * Permet d'afficher le menu d'admin ou public en fonction du controller demandé
	 * @return: void
	 **/
	public function afficherAction(){
 
		if($this->onAdmin()){
			$this->_helper->actionStack("admin", "menu", "default", array());
		}else{
			$this->_helper->actionStack("public", "menu", "default", array());
		}
	}
 
	/**
	 * Permet d'afficher le menu d'admin
	 * @return: void
	 **/
	public function adminAction(){
		$this->_helper->viewRenderer->setResponseSegment("menu");
	}
 
	/**
	 * Permet d'afficher le menu public
	 * @return: void
	 **/
	public function publicAction(){
		$this->_helper->viewRenderer->setResponseSegment("menu");
	}
}
Si j'appelle directement dans l'url menu/afficher, tout fonctionne comme sur des roulettes. Le soucis c'est que j'appelle cette action dans mon layout :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 [lang=php]
<?php 
	//on affiche le menu si c'est demandé
	if(Zend_Registry::isRegistered('showmenu') && !Zend_Registry::get('showmenu')){
		echo $this->action('afficher', 'menu');
	}
?>
Et dans ce cas là, il rentre bien dans l'action "afficher", mais il ne suit pas les actions de l'actionstack alors que j'ai vérifié, elles sont bien enregistré dans Zend_Registry. Et je n'ai aucun message d'erreur ...

Y a un truc dans zend qui fait qu'il ne peut pas exécuter actionstack si l'action initiale provient d'une demande d'une vue ? Ou je sais pas quoi ...

Mes tentatives :
Charger manuellement actionstack pour lancer moi même son exécution => echec.
Charger depuis un plug-in l'helper actionstack pour l'exécuter => echec

Solutions de dernier recours :
- Mes fonctions publicAction et adminAction deviennent de simple fonction que j'appelle via $this->public(), que je modifie ma vue afficher.phtml pour qu'elle s'adapte en fonction de quelle fonction est appelée et les deux fonctions publicAction et adminAction utiliseraient directement la vue d'afficher ... mais je trouve ça "crade"

- Charger toutes les fonctions depuis le bootstrap mais ce n'est pas optimisé je trouve car dans tous les cas, les controllers seront exécutés.

- La solution de dernier recours "la moins moche" : Dans ma classe redéfinissant la classe Zend_Controller_Action, définir des méthodes pour activer/désactiver le menu/header/etc, les activer par défaut ce qui ajouter dans le actionstack les actions a charger et si je les désactive durant mon controller, les supprimer (si c'est possible je ne sais pas) de l'actionstack vu que toutes les actions dans actionstack s'exécutent à la fin ça ne boufferait pas sur les performances.

Merci d'avance si vous avez des idées.

SOLUTION (TEMPORAIRE ?) : Une solution qui fonctionne je sais pas si c'est la mieux, si quelqu'un a un moyen de résoudre le soucis d'une meilleure façon je prends.

Ma solution :
Mon layout demande à charger l'action "afficher" du controller "menu".
Dans l'action "afficher", je teste si on est dans une page d'admin ou non. J'attribue a une variable la chaîne "admin" si on est dans une page d'admin ou bien public pour une page public, j'assigne ensuite cette variable à la vue de l'action "afficher".
Dans la vue de l'action "afficher" du controller "menu", je demande à appeler l'action "admin" du controller "menu" si la variable venant du controller vaux "admin" si non j'appelle l'action "public" du controller "menu".