Page 1 sur 1
[Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 10:35
par Ganesh
Bonjour,
Je me heurte à un problème de mise à jour de la base de données via un formulaire. Il s'agit ici d'une simple modification d'un profil.
En suivant une procédure analogue à celle décrite dans le tutoriel Jobeet, la variable insérée dans la création du formulaire dans la méthode executeUpdate() correspond aux valeurs déjà présentent dans la base de données et non celles insérées dans le formulaire.
Ces valeurs insérées sont disponibles dans la variable $request mais sous forme de tableau, or j'ai besoin de les récupérer sous forme d'objet. Comment cela est-il possible ?
Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 11:08
par zeus
Sans voir ton code, on pourrait passer des jours et des jours en suppositions

Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 11:19
par Ganesh
Bonjour,
Merci de ta réponse.
La question étant théorique, le code ne me semblait pas nécessaire d'autant que je ne recherche pas une réponse toute faite mais la méthode pour y parvenir.
Voici le code :
public function executeIndex(sfWebRequest $request)
{
$this->manager = Doctrine::getTable('Manager')->find(array($this->getUser()->getAttribute('idManager')));
$this->form = new PreferenceForm($this->manager);
}
public function executeUpdate(sfWebRequest $request)
{
$this->forward404Unless($request->isMethod(sfRequest::PUT));
$this->forward404Unless($manager = Doctrine::getTable('Manager')->find(array($this->getUser()->getAttribute('idManager'))), sprintf('Object manager does not exist (%s).', $this->getUser()->getAttribute('idManager')));
$this->form = new PreferenceForm($manager, array('pseudo' => $this->getUser()->getAttribute('pseudo'), 'login' => $this->getUser()->getAttribute('login')));
$this->processForm($request, $this->form);
$this->setTemplate('index');
}
Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 12:14
par zeus
Bah, en fait, le code standard fonctionne. J'en suis sûr, je l'utilise tout les jours
Donc, pour l'aspect théorique, ce que je vois devrais fonctionner.
Maintenant, je ne comprend pas pourquoi tu ne passes pas les valeurs par défaut au Manager plutôt qu'au PreferenceForm, mais je ne suis pas sûr que ça vienne de là :/
Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 13:12
par Ganesh
Que veux-tu dire par passer les valeurs par défaut au Manager ?
Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 14:04
par zeus
$manager->setPseudo($this->getUser()->getAttribute('pseudo'));
$manager->setLogin($this->getUser()->getAttribute('login'));
$this->form = new PreferenceForm($manager);
en lieu et place de
$this->form = new PreferenceForm($manager, array('pseudo' => $this->getUser()->getAttribute('pseudo'), 'login' => $this->getUser()->getAttribute('login')));
Re: [Symfony] Update BDD par formulaire
Posté : 17 juin 2010, 14:14
par Ganesh
C'est dans le cas où l'utilisateur modifie son pseudo ou son login, j'utilise un postValidator pour vérifier que le nouveau pseudo ou login n'est pas déjà utilisé. Mais pour cela, j'ai aussi besoin de vérifier au préalable que le pseudo ou le login ont été modifiés.
Dans mon esprit, le $manager de $this->form = newPreferenceForm($manager, ...) correspond aux valeurs renvoyées par l'utilisateur, donc potentiellement modifiées.
Edit: en fait mon esprit est dans la brume, les valeurs envoyées par l'utilisateur sont récupérées par le bind dans la méthode processForm. C'est donc plus probablement le nommage de formulaire qui pose soucis. Je n'ai pas accès à mon code pour le moment mais je confirmerai cela ce soir.
Re: [Symfony] Update BDD par formulaire
Posté : 18 juin 2010, 11:45
par Ganesh
Bon, en fait, j'étais complètement à côté de la plaque dans la recherche du bug qui se trouvait finalement au niveau du postValidator. J'avais la fonction callback suivante sans la partie commentée :
public function checkLoginAvailability($validator, $values) {
if(!empty($values['login']) && $values['login']!=$this->getOption('login')) {
$nbr = Doctrine_Core::getTable('manager')->isExisting('login', $values['login'])->count();
if(!$nbr) {
return $values;
}
else {
throw new sfValidatorError($validator, 'Login already used');
}
}
/*else {
return $values;
}/*
}
Du coup, quand je ne modifiais pas le login, aucune valeur n'était retournée et la méthode processValues() ne recevait aucune valeur. J'ai découvert ce problème en commentant la redirection dans la méthode processForm(), ce qui m'a permis de découvrir des messages d'erreur que je n'avais pas sans cela.