Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
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
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?
<?php require_once APPLICATION_PATH . '/controllers/services/functions.php';
Hors ligne
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
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
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.
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
J'ai remodelé mon controller pour en effet ne faire qu'une instanciation, mais le problème persiste :
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
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 )
Hors ligne
j'ai bien tout tenté, mais le problème persiste
Merci pour le coup de main, petit coucou de Rennes
Hors ligne
et si tu essayes de tout commenter en gardant seulement la validation de ta form :
[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
en commentant tout le superflu, tous les messages, rien n'y fait, ça continue...
Hors ligne
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
as tu essayé une autre form toute simple dans un autre controller ?? Avec une validation comme
[lang=php] if ($this->_request->isPost()) { $formData = $this->_request->getPost(); if ($form->isValid($formData)) { echo 'success'; exit; } else { $form->populate($formData); } }
Hors ligne
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