IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend Framework PHP Discussion :

ActionStack variant en fonction d'un fichier de config


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut ActionStack variant en fonction d'un fichier de config
    Salut à tous!
    Bon autant annoncer la couleur, je débute avec Zend .
    Pour cela je fais un petit projet sans pression pour ma boite, en vue d'en attaquer un plus gros dans quelques mois.
    Et... C'est un peu la galère. Disons que quand je prends les composants et les concepts uns par uns ça va, mais pour comprendre comment le tout travail ensemble...

    Et la je bloque. Dans un premier temps je suis allé au plus simple, mais la je suis devant une problématique insoluble dans l’état actuel de mes connaissances.

    Dans mon fichier Bootstrap (j'utilise zendApplication) j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /**
     * Initialisation de la pile d'actions
    **/
    protected function _initActionStack()
    {
        //$this->getRequest()->getActionName();
        $actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack');
        $actionStack->actionToStack(new Zend_Controller_Request_Simple('footer', 'index', 'default'));
        $actionStack->actionToStack(new Zend_Controller_Request_Simple('header', 'index', 'default'));
        return $actionStack;
    }
    Chaque action demandée dans l'URL (action corp) déclenche donc 3 actions : header (<html>) / corp (blabla) / footer (</html>). Un layout permet de remettre dans l'ordre les résultats, l'action corp étant executée en 1er...
    Actuellement, la même action header et footer est lancée quelque soit l'action corp demandée.

    Je voudrais que ces actions header et footer soient personnalisables pour chaque action corp (=module/controlleur/action dans l'url).
    Pour cela, j'ai un fichier de configuration dans chaque module (j'ai une archi modulaire) de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [ajax.getcentreAction]
    header.module=default
    header.controller=index
    header.action=header
    footer.module=defaut
    footer.controller=index
    footer.action=footer
    De cette manière, le développeur peut spécifier simplement les actions header et footer qu'il veut pour l'action qu'il est en train de coder, ou laisser vide si l'action retourne du json/xml...

    Je me suis dis que je pourrait arranger ça (lecture du fichier de config du module, initialisation de l'actionStack en conséquence) dans le _initActionStack() du Bootstrap. Mais apparemment, à cet endroit le routage n'a pas encore été effectué et il est impossible de récupérer le nom de l'action demandée via URL...

    Du coup je bloque, je ne vois ni ou ni comment effectuer ce traitement qui débouche sur une pile d'action, variant en fonction d’un fichier de config dont le chemin varie en fonction de l’action demandée via URL (plus tard ça variera aussi en fonction des droits/roles, mais chaque chose en son temps ).
    A priori, je dirai qu'il faut que ça soit après le routage mais avant l'exécution de l'action, donc au moment du predispatch... Mais concrètement, comment je fais pour agir sur ce truc (ou ailleurs si c'est ailleurs ) ?

    Y a t'il moyen de régler ça dans le fichier Bootstrap? Dois-je créer un plugin?


    Voila, pouvez vous me donner un coup de main sur ce coup?
    C'est que je bloque, j'ai une action Ajax qui renvoie du json et du coup c'est imparsable avec l'html du header et du footer...
    De manière plus générale, si vous avez des remarques sur cette stratégie, si vous voyez mieux à faire, je suis à l'écoute!

    Merci!

  2. #2
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Bonjour,
    As tu regardé un peu ce que propose les plugins ou encore les aides d'actions, car leur méthode predispatch pourrait correspondre à tes besoins.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Citation Envoyé par 5h4rk Voir le message
    Bonjour,
    As tu regardé un peu ce que propose les plugins ou encore les aides d'actions, car leur méthode predispatch pourrait correspondre à tes besoins.
    Ouais, j'ai un peu regardé . Tu veux dire que je peux créer un plugin perso pour agir sur le predispatch?

    Ben c'est ce que j'ai fait :

    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
     
    class Core_Plugin_ActionSetup extends Zend_Controller_Plugin_Abstract 
    { 
    	public function preDispatch(Zend_Controller_Request_Abstract $request) 
    	{
    		//Récupération du nom de module/controller/action demandé dans l'URL
    		$nom_module=$request->getModuleName();
    		$nom_controller=$request->getControllerName();
    		$nom_action=$request->getActionName();
     
    		//Si le fichier de config du module existe, on le charge et on lit les headers/footers pour les actions demandées
    		//Si il n'existe pas, on charge le fichier de config de l'application et on lit les header/footer par défaut.
    		if(is_file(APPLICATION_PATH.'/modules/'.$nom_module.'/config/config.ini')){
    			$config = new Zend_Config_Ini(APPLICATION_PATH.'/modules/'.$nom_module.'/config/config.ini', $nom_controller);
    		} else {
    			$config = new Zend_Config_Ini(APPLICATION_PATH.'/../config/core.ini', 'default');
    		}
     
    		//Initialisation de la pile d'action
    		$actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack');
    		$actionStack->actionToStack(new Zend_Controller_Request_Simple($config->header->action, $config->header->controller, $config->header->module));
    		$actionStack->actionToStack(new Zend_Controller_Request_Simple($config->footer->action, $config->footer->controller, $config->footer->module));
     
    		return $actionStack; 
    	}
     
    }
    Donc voila, ça fait ce que je veux, la pile d'action est initialisée en fonction du fichier de config du module s'il existe, ou en fonction du fichier de config de toute l'appli (core.ini) s'il n'existe pas.

    Seul problème : la division par zéro la boucle infinie.
    Mon plugin réatribue un header/footer au header/footer donné dans l'action stack, et ainsi de suite : la boucle qui tue.

    Comment je peux éviter ça proprement à votre avis?
    Il faut que je test si l'action récupérée en getActionName est bien celle de l'url.
    Comment je peux accéder à l'URL depuis le plugin?

  4. #4
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Que désires tu faire avec l url ?

    Car tu peux utiliser Zend_Controller_Front::getInstance() sur lequel tu peux récuperer pas mal d informations

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Par défaut
    Ben, je pense comparer le module/controller/action visible dans l'URL avec ce que je recupère dans le predispatch via getModuleName/getControllerName/getActionName.

    Si c'est la même chose, je lance l'initialisation de l'actionStack (ajout d'une action header et footer) si c'est different, ca veut dire que le predispach a été lancé par une action demandée via URL, et que l'actionStack a déja été initialisée.

    Du coup je la réinitialise pas, sinon je me retrouve avec un plugin qui ajoute des header pour une action header de l'actionStack qui avait été ajoutée par ce même plugin = Boucle.

    Je vais regarder Zend_Controller_Front::getInstance()...

  6. #6
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Tu peux donc utiliser ce que je t'ai mis et faire des appels getModuleName() etc

Discussions similaires

  1. Rendu variant en fonction de l'ordi !!!
    Par jcloupgarou dans le forum OpenGL
    Réponses: 11
    Dernier message: 27/04/2006, 08h48
  2. Est-il possible d'exécuter une fonction à partir de fichier
    Par magic8392 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 16/09/2005, 13h59
  3. Fonctions inlines et fichiers .lib
    Par michhh dans le forum C++
    Réponses: 3
    Dernier message: 05/07/2005, 03h09
  4. Réponses: 2
    Dernier message: 10/05/2005, 10h58
  5. Créer un champ en fonction d'un fichier excel
    Par nberthonneau dans le forum Access
    Réponses: 8
    Dernier message: 03/11/2004, 18h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo