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

MVC PHP Discussion :

Comment fonctionne le _forward ? [ZF 1.7]


Sujet :

MVC PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut Comment fonctionne le _forward ?
    Bonjour tout le monde,

    Je me demande comment fonctionne le controller helper '_forward'.
    Voici mon soucis:
    J'ai une action (monAction) qui qui contient une form.
    La form envoi son post sur un autre action du même controller (formAction).
    Dans cette dernière, je vérifie le post et en cas de succès je redirige sur une dernière action(succesAction) sinon je forward sur monAction pour réafficher le formulaire.
    Le problème c'est qu'après le forward le formulaire est réinitialisé à alors que c'est un attribut de mon controller. Ce qui sous entend que le forward ré-instancie le controller ...

    Un peu de code pour illustrer ceci :

    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
    33
    34
    35
    <?php
    class monController extends Zend_Controller_Action {
      $_form;
     
    /**
    * Returns the comment form
    */
    protected function _getForm() {
      if(null === $this->_form) {
        $this->_form = new My_Form();
      }
     
      return $this->_form;
    }
     
    public function monAction() {
    	$this->form = $this->_getForm();
    }
     
    public function formAction() {
    	$form = $this->_getForm();
     
    	if($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) { // IsValid rempli la form
    		$this->_redirect('http://monsite/mon/succes');
    	}
    	else {
    		$this->view->message('Données incorrectes');
    	}
    	$this->_forward('mon');
    }
     
    public function succesAction() {
    	$this->view->message('Données enregistrées');
    }
    }
    Avec ce code, mon message d'erreur s'affiche bien mais la form est vide alors qu'elle devrait contenir ce qui a été posté ...

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2003
    Messages : 253
    Par défaut
    Je vais peut être dire une énormité, étant donné que j'utilise très peu de forwarding entre mes actions mais, l'helper FlashMessenger ne sert-il justement pas à faire passer des messages d'une action à l'autre ?

  3. #3
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    Citation Envoyé par oliviercuyp Voir le message
    Le problème c'est qu'après le forward le formulaire est réinitialisé à alors que c'est un attribut de mon controller. Ce qui sous entend que le forward ré-instancie le controller ...
    En fait, ta variable $form dans la méthode formAction n'est qu'une variable locale, détruite dès la sortie de la méthode. Il faut l'affecter à $this->form pour que ça fonctionne. D'autre part, le _getForm() devrait juste instancier un My_Form et pas l'affecter à $this->_form (quelle différence d'ailleurs avec $this->form ?), en principe une méthode getXXX n'est pas censée avoir d'effets de bord. Enfin, je ne saisis pas l'intérêt du _forward() dans ce cas de figure.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 98
    Par défaut
    @Nighty

    Le code ci-dessus était juste pour illustrer le problème sur le forward

    @GrandFather

    Il me semblait bien que ça devait être un soucis du genre.
    Je pensais que qu'en PHP les objets était toujours passé par référence.

    Le but du _getForm() était de vérifier si il y avait déjà une instance crée (et donc initilisée avec des données) pour $this->_form et de ma la renvoyer ou de l'instancier si elle n'existait pas et puis de me renvoyer l'instance (pseudo singleton).

    Le but du forward est que dans le projet réel, monAction initialise beaucoup plus que la form. Le forward me permet de ne pas dédoubler des traitements identiques et de ne traiter que le post dans formAction.

    Si je suis ton raisonement, je devrais directement gérer le post dans monAction et pas dans une action séparée (formAction) ?

    Merci pour tes lumières

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 178
    Par défaut
    Hello,

    Le forward exécute une action après l'exécution de l'action courante.
    Méthodes utiles du Zend_Controller_Action

    Ca veut dire re-dispatching d'une requete vers l'autre action, donc oui, ré-instanciation de votre controller_action.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    La façon la plus facile de traiter un form est d'implémenter l'initialisation et le traitement du form dans la même action... justement pour ne pas perdre les données POST.
    Concrètement, le form pointe sur la même page, et dans ton controller tu utilises isPost() et isValid(). La doc est très claire sur le sujet.

  7. #7
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    57
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 57
    Par défaut
    ou alors mettre l'initialisation dans la méthode init() du contrôleur...c'est utile si le formulaire sert à la fois pour les actions "ajouter" et "modifier" et qu'il est par exemple généré à partir d'un fichier de config.
    Personnellement, j'ai ajouté une méthode isPost à ma classe MyForm, celle de l'objet request n'était plus suffisante dès que plusieurs formulaires existaient sur la page.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JSF] comment fonctionne <h:message> ?
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 29/06/2005, 17h36
  2. Comment fonctionne TXmlDocumment ????
    Par almisuifre dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/02/2005, 12h54
  3. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 27/10/2004, 23h10
  4. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 17h44
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 11h26

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