Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-01-2012 16:23:19

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Pourquoi mon controller est appelé 2 fois

Bonjour,

je suis sur un problème que je n'arrive pas à résoudre depuis un bon bout de temps maintenant.

J'ai un controller qui je ne sais pour quelle raison, est déroulé 2 fois de suite dans la foulée !!
C'est un bete controller qui fait une requete, et en fonction du résultat de la requete, fait un traitement...

J'ai essayé plusieurs des techniques proposées par ce forum, mais rien n'y fait sad

Pourriez-vous m'aider ? Voici le code de mon controller :

<?php
require_once APPLICATION_PATH . '/controllers/services/functions.php';

class inscriptionController extends Zend_Controller_Action
{
    public function init() {
        /* Initialize action controller here */
    }

   
    public function getForm() {
        $action = '/inscription/process';
        $form = new Application_Form_Inscription();
        $url = $this->getRequest()->getBasePath() . $action;
        $form->setAction($url);
        return $form;

    }

    public function indexAction() {
        $this->view->messages = $this->getHelper('FlashMessenger')->getMessages();
        $this->view->form = $this->getForm();
    }

    public function processAction() {
        $request = $this->getRequest();

        // Vérifier que nous avons bien à faire à une requête POST
        if (!$request->isPost()) {
            return $this->_helper->redirector('index');
        }
       
        // Récupérons le formulaire et validons le
        $form = $this->getForm();

        // L'utilisateur a appuyé sur le bouton Annuler, renvoyer à l'accueil
        $formData = $request->getPost();
        if (array_key_exists('cancel', $formData)) {
            $this->_helper->redirector('index', 'index');
        }

        if (!$form->isValid($request->getPost())) {
            // Entrées invalides
            $this->view->form = $form;
            return $this->render('index');
            // rechargeons le formulaire
        }

        $val = $form->getValues();

        $date = $val['dateNaissance'];
        $date = explode('/', $date);
        $datestr = $date[2]. '-' . $date[1] . '-'. $date[0];

        $sess = Zend_Registry::get('session');
        $ws = $sess->monWS;
// requete qui va inscrire une personne si elle n'existe pas déjà
// result = OK si la personne n'existe pas
// result = "Mail deja existant" si l'adresse existe deja en base
// result = "Candidat deja existant" si le candidat s'est déjà inscrit
        $result = $ws->register(
            $val['civilite'], $val['email'], $val['nomUsuel'],
            $val['nomJFille'], $val['prenom'], $val['password'],
            $datestr, $val['lieuNaissance']
        );

        // inscription ok : envoi mail de confirmation
        if ($result == 'OK') {
            $login = $ws->getLogin($val['email']);
            $login = (array) $login;
            $func = new functions();
            $line =file_get_contents(APPLICATION_PATH.'/template/mailInscription.html');
            $line = preg_replace ( '/#Civilite/', $val['civilite'], $line );
            $line = preg_replace ( '/#Nom/', $val['nomUsuel'], $line );
            $line = preg_replace ( '/#Login/', $login['login'], $line );
            $line = preg_replace ( '/#Password/', $val['password'], $line );

            $retourEmail = $func->sendMail('', $val['email'], 'Incription valide', $line);
            if ($retourEmail == 0) {
                $this->_helper->flashMessenger->addMessage('email server error');
                $this->view->messages = $this->getHelper('FlashMessenger')->getMessages();
            }
            $this->_helper->redirector('index', 'index');

        }else{
            $this->_helper->flashMessenger->addMessage($result);
            $this->_redirect('inscription');
        }

        return NULL;

    }

}

Donc ce qui se passe, c'est que le premier appel enregistre bien le candidat dans la base, mais comme on repasse une deuxieme fois tout de suite après, il me renvoit que le "candidat existe dejà", forcément puisqu'il fait appel 2 fois de suite à mon enregistrement en base (register)

je m'arrache les cheveux depuis plusieurs jours, et je ne trouve pas de solution

Hors ligne

 

#2 20-01-2012 16:33:08

_Fuse_
Membre
Lieu: Aquitaine
Date d'inscription: 10-07-2008
Messages: 92

Re: Pourquoi mon controller est appelé 2 fois

Bonjour,

première chose qui me semble bizarre c'est l'appel de functions.php au début de ton script. Avec l'autoload il est chargé automatiquement. Est-ce que ce n'est pas ce script qui refait un deuxième appel?

Code:

<?php
require_once APPLICATION_PATH . '/controllers/services/functions.php';

Hors ligne

 

#3 20-01-2012 16:35:36

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

non ce script c'est juste pour faire l'envoi de mail
$func->sendMail

si je ne mets pas cette ligne, alors il y a une erreur

Hors ligne

 

#4 23-01-2012 09:21:50

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

Je n'ai pas pensé à le préciser, mais mon problème n'apparait pas sur mon serveur de test, par contre, il apparait uniquement sur le serveur du client...

Hors ligne

 

#5 21-02-2012 14:39:59

Bill'o
Nouveau membre
Date d'inscription: 04-03-2011
Messages: 4

Re: Pourquoi mon controller est appelé 2 fois

Bonjour,
si je peux me permettre, il serait plus simple de structurer tes actions liées à ta form plus simplement. Avec une seule instanciation de ta form dans l'action et ensuite la même action qui va process ta form pour une requête de type post.

Code:

class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
       
        $form = new forms_ContactForm();

        if ($this->_request->isPost()) {
            $formData = $this->_request->getPost();
            if ($form->isValid($formData)) {
                echo 'success';
                exit;
            } else {
                $form->populate($formData);
            }
        }

        $this->view->form = $form;
    }
}

Ensuite y a t il une raison particulière pour que tu utilises le helper redirector et non pas le controller helper $this->_redirect('index/index') lorsque l'inscription est réussie ??

Dernier point, si tout fonctionne en local, le problème pourrait également venir de ton basepath qui serait différent du application_path de zend. Utilises tu une fonction javascript/jquery pour poster ta form ?? 

A bientôt
Alex

Hors ligne

 

#6 21-02-2012 15:03:56

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

J'ai remodelé mon controller pour en effet ne faire qu'une instanciation, mais le problème persiste :

Code:

class inscriptionController extends Zend_Controller_Action
{
    public function getForm() {
        <va chercher le form>
    }

    public function indexAction() {
        $this->view->messages = $this->getHelper('FlashMessenger')->getMessages();
        $request = $this->getRequest();

        // Vérifier que nous avons bien à faire à une requête POST
        if ($this->_request->isPost()) {
            // Récupérons le formulaire et validons le
            $form = $this->getForm();
    
            // L'utilisateur a appuyé sur le bouton Annuler, renvoyer à l'accueil
            $formData = $request->getPost();
            if (array_key_exists('cancel', $formData)) {
                $this->_helper->redirector('index', 'index');
            }
    
            if (!$form->isValid($request->getPost())) {
                // Entrées invalides
                $this->view->form = $form;
                return $this->render('index');
            }
    
            $val = $form->getValues();
    
            $date = $val['dateNaissance'];
            $date = explode('/', $date);
            $datestr = $date[2]. '-' . $date[1] . '-'. $date[0];
    
            $sess = Zend_Registry::get('session');
            $ws = $sess->monWS;
            $result = $ws->register(
                $val['civilite'], $val['email'], $val['nomUsuel'],
                $val['nomJFille'], $val['prenom'], md5($val['password']),
                $datestr, $val['lieuNaissance']
            );
    
            // inscription ok : envoi mail de confirmation
            if ($result == 'OK') {
                $login = $ws->getLogin($val['email']);
                $login = (array) $login;
                $func = new functions();
                $line = file_get_contents(APPLICATION_PATH.'/template/mailInscription.html');
                $line = preg_replace ( '/#Civilite/', $val['civilite'], $line );
                $line = preg_replace ( '/#Nom/', $val['nomUsuel'], $line );
                $line = preg_replace ( '/#Login/', $login['login'], $line );
                $line = preg_replace ( '/#Password/', $val['password'], $line );
    
                $retourEmail = $func->sendMail('', $val['email'], 'Incription valide', $line);
                if ($retourEmail == 0) {
                    $this->_helper->flashMessenger->addMessage('email server error');
                    $this->view->messages = $this->getHelper('FlashMessenger')->getMessages();
                }
                $this->_redirect('index');
    
            } else {
                $this->_helper->flashMessenger->addMessage($result);
                $this->_redirect('inscription');
            }
        }
        $this->view->form = $this->getForm();
    }
}

pas de raison particulière pour que j'utilise _helper->redirector. Juste je me suis rendue compte que sur d'autres pages, quand je ne l'utilise pas, c'est-à-dire quand j'utilise $this->_redirect, alors l'ajax ne marche plus, mais ça c'est une autre histoire...

Sinon pour poster mon form, un tout petit peu de jquery pour griser un champ, rien de bien méchant. J'ai aussi 2 boutons submit, un pour enregistrer, un pour annuler (cancel).

Hors ligne

 

#7 21-02-2012 15:29:39

Bill'o
Nouveau membre
Date d'inscription: 04-03-2011
Messages: 4

Re: Pourquoi mon controller est appelé 2 fois

petite correction au niveau de tes redirections :
si tu rediriges $this->_redirect('index'); tu resteras dans le même controller et donc repassera dans l'action index
donc tu peux faire comme au dessus : $this->_helper->redirector('actionName', 'controllerName');
ou $this->_forward('mon_action', 'mon_controlleur');
exit;

Petit coucou de l'équipe de GEOS Limoges wink)

Hors ligne

 

#8 21-02-2012 16:34:21

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

j'ai bien tout tenté, mais le problème persiste

Merci pour le coup de main, petit coucou de Rennes smile

Hors ligne

 

#9 22-02-2012 09:19:45

Bill'o
Nouveau membre
Date d'inscription: 04-03-2011
Messages: 4

Re: Pourquoi mon controller est appelé 2 fois

et si tu essayes de tout commenter en gardant seulement la validation de ta form :

Code:

 [lang=php]$form = new forms_ContactForm();

        if ($this->_request->isPost()) {
            $formData = $this->_request->getPost();
            if ($form->isValid($formData)) {
                echo 'success';
                exit;
            } else {
                $form->populate($formData);
            }
        }

Dernière modification par Bill'o (22-02-2012 09:23:00)

Hors ligne

 

#10 23-02-2012 11:30:47

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

en commentant tout le superflu, tous les messages, rien n'y fait, ça continue...

Hors ligne

 

#11 23-02-2012 14:26:14

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

Ce qui est étonnant, c'est que j'ai mis des logs dans mon controller Index (celui qui est normalement appelé quand ça se passe bien la première fois).
Mais jamais il ne passe dedans, à croire que mon $this->_helper->redirector('index', 'index'); ne sert à rien...

Hors ligne

 

#12 23-02-2012 21:50:58

Bill'o
Nouveau membre
Date d'inscription: 04-03-2011
Messages: 4

Re: Pourquoi mon controller est appelé 2 fois

as tu essayé une autre form toute simple dans un autre controller ?? Avec une validation comme

Code:

[lang=php]
if ($this->_request->isPost()) {
           $formData = $this->_request->getPost();
           if ($form->isValid($formData)) {
               echo 'success';
               exit;
           } else {
               $form->populate($formData);
           }
       }

Hors ligne

 

#13 05-03-2012 11:09:29

fjacot
Membre
Date d'inscription: 25-10-2011
Messages: 11

Re: Pourquoi mon controller est appelé 2 fois

Après tout ce temps, il s'avère que le problème vient bien du côté client, et surtout de son proxy Squid qui fout la grouille.
Il semble qu'il nous renvoie du HTTP 1.0 alors que nous nous lui envoyons du HTTP 1.1
En bypassant ce proxy, tout marche correctement...

Dsl pour le dérangement

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages