Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/11/2010, 18h54   #1
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Par défaut [sfForm] vérifier la valeur d'un submit

Bonsoir,

Pour les besoins d' une action précise j' ai besoin de vérifier la valeur passé dans un submit.

L' idée est la suivante :

J' ai un formulaire avec 2 boutons "Enregistrer" et "Valider" , les deux déclenche la même action.

Seulement en fonction du bouton je passe un paramètre spécifique dans mon objet.

je pensais donc récupérer la valeur du submit pour faire ça.

Il y a sûrement mieux mais je vois pas comment.
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 18h58   #2
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Qu'est ce qui te gène dans le fait d'utiliser la valeur du submit ?
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 19h35   #3
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Ben rien, il y a sûrement mieux pour faire ça non ?

sinon comment tu ferais pour récupérer la valeur dans l'action déclenché par le post ?
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 20h12   #4
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Essaye ce code dans un fichier php :


Code :
1
2
3
4
5
6
7
8
9
10
<pre>
<?php
var_dump($_POST);
 
?>
</pre>
<form method="POST">
<input type="submit" name="bouton" value="Envoyer">
<input type="submit" name="bouton" value="Annuler">
</form>
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 20h42   #5
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Bien sur dans un contexte symfony.. .sinon ça serait trop simple...

Donc avec un objet form qui doit être binder puis valider..
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 22h18   #6
Membre éclairé
 
Inscription : octobre 2004
Messages : 235
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 235
Points : 360
Points : 360
Citation:
Envoyé par mantex Voir le message
Bien sur dans un contexte symfony.. .sinon ça serait trop simple...
Les frameworks ne sont pas fait pour simplifier la vie des développeurs ?
Joker-eph est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 23h37   #7
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Oui j'ai entendu ça aussi...
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 15h08   #8
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Il n'y a pas de problème particulier pour traiter cela avec symfony. Juste une question complémentaire, quel doit être exactement l'action du bouton valider ? Vérifier les saisies ? Dans ce cas, il y a un plugin : sfJqueryFormValidationPlugin qui te permet de vérifier les conditions en java, directement dans ton formulaire, ce qui n'empêche pas de refaire la vérification avant d'enregistrer les données, ce qui permet de sécuriser les cas où l'utilisateur n'a pas activé le javascript ou celui du pirate qui enverrait son propre paquet POST.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 15h25   #9
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
L’événement 'valider' doit modifier un champs particulier en plus de sauvegarder les champs saisies par l'utilisateur.
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 23h29   #10
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Cela va être un poil lourd à gérer dans la sauvegarde du form.

L'idéal serait d'utiliser une case à cocher sur le form, ou une liste déroulante, suivant le type de données que tu veux utiliser.

Le problème vient du fait que, si tu utilises un sfDoctrineForm, la sauvegarde est inclue dans le form. Et que seul les champs ayant un widget et un validateur peuvent être sauvegardé. Mais on doit pouvoir tricher...

Dans un premier temps, tu vas créé ton form avec tous les champs que tu souhaites utiliser y compris celui qui doit contenir la données issue du bouton. Celle là tu la met en hidden. Et tu lui met un validateur de base, dans tous les cas on se fiche de la valeur récupérée.

Dans la méthode d'initialisation du form, il n'y a rien de particulier à faire.
Pour l'affichage du form non plus, à toi de voir.

Pour le retour, il faut commencer par le lier à l'enregistrement de la base (ou un new si c'est un ajour). Puis a vérifier la validité du form, et, le cas échéant, à retourner le form pour modification.

S'il est bon, tu récupères le nom du bouton utilisé pour le retour et, en fonction, tu appels une méthode, qui tu auras créé sur le form pour lui donner la nouvelle valeur de la données. La méthode du form va modifier le tableau values de l'objet form et y mettre la bonne valeur. Ensuite, il ne reste qu'à sauvegarder l'enregistrement.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 00h19   #11
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Citation:
Envoyé par Michel Rotta Voir le message

Dans un premier temps, tu vas créé ton form avec tous les champs que tu souhaites utiliser y compris celui qui doit contenir la données issue du bouton. Celle là tu la met en hidden. Et tu lui met un validateur de base, dans tous les cas on se fiche de la valeur récupérée.

Je dois utiliser un widget aussi pour les boutons ?
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 12h30   #12
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Il n'y a pas de Widget pour les boutons. Il faut les indiquer dans le template. De la même manière, le form ne sais pas traiter le retour d'un bouton, il faut donc le traiter dans l'action (execute) du retour du form, qui va utiliser une méthode du form, créée par nous, pour mettre la donnée à jour.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 15h41   #13
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Oui cela m'intéresse car cela doit faire une semaine que je m' arrache les cheveux pour récupérer la valeur d'un submit et mettre à jour mon champs via un setCustomerId() en fonction du submit cliqué.

On m' a conseillé de le faire cela en Ajax.. je ne sais pas si cela va être plus simple.
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 18h18   #14
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
J'ai pas trop le temps de faire tous le code pour toi... il va te falloir mouiller ta chemise.

A priori, tu bloques essentiellement sur "comment récupérer le bouton utilisé".

Définir les boutons dans le template :
Code :
1
2
3
 
<input type="submit" name="button" value="Save" label="Enregistrer" />
<input type="submit" name="button" value="Valid" label="Valider" />
Dans l'action, tu récupères le bouton simplement par !
Code :
1
2
 
$btName = $request->getParameter( 'button' );
et la variable contiend alors soit Save, soit Valid (le contenu de value).

Après, à toi de traiter.

Pour voir ce qu'il nous retourne, tu peux, dans le tout début de l'action entre la commande :
Code :
print_r($request->getParameterHolder()->getAll());die();
ce qui te permet de visualiser les données retournées. Tu peux aussi voir le résultat en debug, dans la barre de debug de symfony, dans config - request. Tu as alors toutes les données du request. Ceci ne marche que s'il n'y a pas eu un redirect dans le code entre l'envoie des données et l'affichage, si non, tu vois les données du renvoie.

Attention, il faut bien créer une méthode sur le form, qui va aller modifier les données récupérées et validées. Dans ton objet form, elles sont dans un tableau value. On aura une méthode qui va ressembler à
Code :
1
2
3
4
5
 
public function setMaData($data)
{
   $this->value['NomDeMonChamp'] = $data;
}
Cette méthode doit être utilisée entre le bind (qui valide les données et remplit le tableau) et le save (qui les sauvegardes).

Voila de bonnes pistes.

Je ne vois pas trop comment ni quel serait l'intérêt de traiter en js. Sauf à ignorer les fonctionnalités du framework.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 21h34   #15
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Oui bien sur c'est pas à toi de faire le boulot, je voudrais juste comprendre un peu les mystères de symfony concernant les formulaires.

Donc dans le cas qui nous intéresse, comment je peux utiliser la fonction dont tu parles (function setMaData()) , dans le configure.php ?

et je l'appelle depuis mon action.php ?
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 00h29   #16
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Tu ne peux pas créer une méthode dans une autre méthode... ceci n'est pas possible en PHP.

Non, cette méthode doit être dans ton objet form, donc au même niveau que la méthode configure(). Et effectivement, tu l'appel depuis le contrôleur.Là où je te l'ai expliqué dans mon précédant poste.

Essaye déjà de faire un bout de code, et, si tu as des problèmes, tu n'hésites pas à revenir
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 09h02   #17
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Oui bien sur je voulais dire dans la classe evaluationForm j' ai créé la fonction setmadata.

Je l'appelle dans le contrôleur comme ceci

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
 
protected function processForm(sfWebRequest $request, sfForm $form)
  {
 
     $form->bind(
      $request->getParameter($form->getName())
 
     );
 
 
 
    if ($form->isValid())
    {
 
      $btnexecute= $request->getPostParameter('button');
      if ($btnexecute == 'SAUVEGARDER' )
           { $form->setMaData(10);}
             else {
             $form->setMaData(20);
           }
 
 
      $evaluation = $form->save();
Mais mon champs reste vide.
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 19h06   #18
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Et tu as mis quoi comme code dans setMaData() ?

Et dans configure() du form ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 19h21   #19
Membre régulier
 
Inscription : janvier 2008
Messages : 212
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 212
Points : 75
Points : 75
Envoyer un message via Skype™ à mantex
Ceci :

Code :
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
36
37
 
 
...../...
 
 $this->widgetSchema['customer_id'] = new sfWidgetFormInputHidden (array('is_hidden' => 'true'));
 
  $this->widgetSchema->setNameFormat('evaluation[%s]');
 
    $this->setValidators(array(
      'score1'      => new sfValidatorInteger(array('required' => true)),
      'score2'      => new sfValidatorInteger(array('required' => true)),
      'score3'      => new sfValidatorInteger(array('required' => true)),
      'score4'      => new sfValidatorInteger(array('required' => true)),
      'score5'      => new sfValidatorInteger(array('required' => true)),
      'score6'      => new sfValidatorInteger(array('required' => true)),
      'comment1'    => new sfValidatorString(array('required' => false)),
      'comment2'    => new sfValidatorString(array('required' => false)),
      'comment3'    => new sfValidatorString(array('required' => false)),
      'comment4'    => new sfValidatorString(array('required' => false)),
      'comment5'    => new sfValidatorString(array('required' => false)),
      'comment6'    => new sfValidatorString(array('required' => false)),
      'comment'     => new sfValidatorString(array('required' => false)),
      'contributor_id' => new sfValidatorInteger(array('required' => true)),
      'invitation_id' => new sfValidatorInteger(array('required' => true)),
      'customer_id' => new sfValidatorInteger(array('required' => false)),
 
    ));
 
 
    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
 
  }
 
    public function setMaData($data)
    {
  $this->value['customer_id'] = $data;
    }
mantex est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 20h04   #20
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Désolé, ce que je t'ai raconté ne marchera pas.

Je me suis basé sur mon intuition du fonctionnement du framework, mais elle a été mise en pièce. En fait, la première chose que fait la méthode save() est de vérifier que l'objet est valide avec un isValid(). Et cette méthode commence par vider le contenu du tableau value[]... perdu

Bon, j'ai réfléchi et trouvé une autre méthode qui, à postériori, me semble plus propre.

L'idée est de modifier le tableau que tu récupères du sfRequest. Et de remplacer la valeur véhiculée dans le champ caché par celle que tu veux lui mettre. Plus de modification de l'objet form (sauf dans la méthode configure).

Le contrôleur devrait alors ressembler à :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
protected function processForm(sfWebRequest $request, sfForm $form)
  {
     $rDate = $request->getParameter($form->getName() );
 
     $rData['customer_id'] = 
               'SAUVEGARDER' == $request->getPostParameter('button') ?
                    10 : 20 ;
 
     if( $form->bindAndSave($rData) )
     {
        // traitement si les données sont bonne, généralement un redirect
     }
 
     // traitement pour ré-afficher les données, il y a une erreur
   }
non testé

Ceci est une idée de la quel s'inspirer pour faire ton code.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h32.


 
 
 
 
Partenaires

Hébergement Web