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

 PHP Discussion :

Sauvegarder un commentaire pour un utilisateur


Sujet :

PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut Sauvegarder un commentaire pour un utilisateur
    Bonjour,

    Mon écran principal est une liste de contacts. Je clique sur un contact pour accéder à sa fiche où je peux enregistrer un message pour ce contact.

    Le problème est que je dois re-choisir le contact parmi la liste de mon écran précédent via une drop-down list.
    Si je supprime le widget du form, je ne peux plus enregistrer un commentaire (message d'erreur).

    Voilà mon commentForm.class.php
    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
    public function configure()
      {
     
      	$this->setWidgets(array(
          'id'         => new sfWidgetFormInputHidden(),
          //'contact_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('contact'), 'add_empty' => true)),
          'etio_id'    => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('etios'), 'add_empty' => false)),
          'content'    => new sfWidgetFormTextarea(),
     
        ));
     
        $this->setValidators(array(
          'id'         => new sfValidatorChoice(array('choices' => array($this->getObject()->get('id')), 'empty_value' => $this->getObject()->get('id'), 'required' => false)),
          //'contact_id' => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('contact'), 'required' => false)),
          'etio_id'    => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('etios'))),
          'content'    => new sfValidatorString(array('max_length' => 20000, 'required' => false)),
     
        ));
     
        $this->widgetSchema->setNameFormat('comment[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
        $this->setupInheritance();
     
      }
    Comment garder l'id de mon contact sans le widget? cet id est bien envoyé via l'url de la page principale.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    C'est dans le contrôleur que tu vas trouver la solution.

    Je n'ai pas ton code, mais tu dois certainement instancier ton form et le lier à un enregistrement "new" pour tes commentaires.

    La solution est de créer ton "new" commentaire et de lui donner l'id du user un truc dans le genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // non testé
    $newCommentaire = new commentaire() ;
    $newCommentaire->setUserId = $user->GetId() ;
    A noter qu'il y a plusieurs implémentation possibles pour ce type de code.

    Inconvénient de cette solution, l'id du user circule dans ta page et dans le paquet POST de retour. Il est donc possible pour un utilisateur indélicat de le changer et de faire une injection d'un commentaire sur un autre utilisateur.


    Autre possibilité, tu supprimes (unset) le champ du formulaire et tu met l'id de l'utilisateur dans le liens de retour. Ton url de retour serait donc du genre http://monSite.moi/commentaire/123456/create avec le routing il est alors possible de créer un commentaire pour l'utilisateur 123456.

    Mais même inconvénient que pour la solution précédente.

    Troisième solution, tu récupères l'id de l'utilisateur dans une variable de session (liée a l'objet My_User) et tu la récupère juste avant de valider l’enregistrement.

    L'inconvénient précédant disparait, mais il n'est plus possible que de créer des commentaires que pour le dernier utilisateur affiché, ce qui peut être un problème si l'utilisateur utilises plusieurs fenêtres dans la même session.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut
    Merci pour cette réponse.

    J'avoue ne pas être convaincu et je ne sais pas si c'est mon cas qui est plus complexe ou si je ne comprend pas.

    J'ai 2 modules: comment et contact.
    Comme dit en haut, ma page principale /contacts permet de cliquer sur l'id du contact et affiche via show/id/x le contact mais aussi le partial _form du comment.
    Je souhaite pouvoir enregistrer et afficher les commentaires du contact sur cette page.

    C'est cette partie comment qui me pose donc problème. Une liste déroulante est proposée avec tous les contacts. Il me semble que je dois d'abord réussir à créer un input hidden avec l'id de l'utilisateur et l'exploiter lors du save de ce commentaire, non?
    Car avec la liste déroulante (et en choisissant mon contact), ça marche très bien.

    Sans conviction voilà mon commentForm où j'ai viré la liste déroulante (contact_id).
    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
    class commentForm extends BasecommentForm
    {
      public function configure()
      {
     
      	$this->setWidgets(array(
          'id'         => new sfWidgetFormInputHidden(),
          'contact_id' => new sfWidgetFormInputHidden(),
          'etio_id'    => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('etios'), 'add_empty' => true)),
          'content'    => new sfWidgetFormTextarea(),
     
        ));
     
        $this->setValidators(array(
          'id'         => new sfValidatorChoice(array('choices' => array($this->getObject()->get('id')), 'empty_value' => $this->getObject()->get('id'), 'required' => false)),
          'contact_id' => new sfValidatorChoice(array('choices' => array($this->getObject()->get('contact_id')), 'empty_value' => $this->getObject()->get('contact_id'), 'required' => false)),
          'etio_id'    => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('etios'))),
          'content'    => new sfValidatorString(array('max_length' => 20000, 'required' => false)),
     
        ));
     
        $this->widgetSchema->setNameFormat('comment[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
        $this->setupInheritance();
     
      }
    }
    Mon comment/create:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public function executeCreate(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
     
        $this->form = new commentForm();
     
        $this->processForm($request, $this->form);
     
        $this->setTemplate('new');
      }
    avec son processForm:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $comment = $form->save();
     
          $this->redirect('contacts/show?id='.$comment->getContactId());
        }

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    C'est la solution 1 (presque)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # controleur (non testé)(non fonctionnel)
    public function executeNew(sfWebRequest $request)
      { 
        $newComment = new comment() ;
        $newComment->setUserId( $request->getParameter('user_id') ;
     
        $this->form = new commentForm( $newComment );
     
      }
    C'est dans le new que l'id de l'user doit arrivé. Le code si dessus n'est qu'un exemple non utilisable, je ne connais pas ton new, pour montrer comment l'id user peut être injecté dans l'objet avant qu'il ne soit posté.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 74
    Par défaut
    Merci, cela marche avec la liste déroulante. Pour la petite histoire c'était mon show qui est appelé.

    Il me reste un problème. J'essaie de ne pas afficher ceci dans ma liste déroulante qui comprend tous mes contacts (potentiellement grande).

    J'essaie sans succès avec un champ caché. Ma démarche est-elle bonne ou faut que je regarde ailleurs?

    Comment connaitre toutes les options d'un widget?
    J'ai regardé sur cette page mais y'a pas la liste.
    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
     public function configure()
      {
     
      	$this->setWidgets(array(
          'id'         => new sfWidgetFormInputHidden(),
          //'contact_id'    => new sfWidgetFormTextarea(),
          //'contact_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('contact'), 'add_empty' => true)),
          'contact_id' => new sfWidgetFormInputHidden(array('default' =>$this->getObject()->get('id'))),
          'etio_id'    => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('etios'), 'add_empty' => true)),
          'content'    => new sfWidgetFormTextarea(),
     
        ));
     
        $this->setValidators(array(
          'id'         => new sfValidatorChoice(array('choices' => array($this->getObject()->get('id')), 'empty_value' => $this->getObject()->get('id'), 'required' => false)),
          //'contact_id'    => new sfValidatorString(array('max_length' => 20000, 'required' => false)),
          //'contact_id' => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('contact'), 'required' => false)),
          'contact_id' => new sfValidatorChoice(array('choices' => array($this->getObject()->get('contact_id')), 'empty_value' => $this->getObject()->get('contact_id'), 'required' => false)),
          'etio_id'    => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('etios'))),
          'content'    => new sfValidatorString(array('max_length' => 20000, 'required' => false)),
     
        ));
     
        $this->widgetSchema->setNameFormat('comment[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
        $this->setupInheritance();
     
      }

Discussions similaires

  1. Réponses: 0
    Dernier message: 19/10/2011, 16h00
  2. Password pour l'utilisateur postgres ?
    Par omega dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/02/2005, 20h25
  3. Réponses: 4
    Dernier message: 14/10/2004, 17h36
  4. Méthode ou fonction pour connaitre utilisateur
    Par Madmac dans le forum Administration système
    Réponses: 6
    Dernier message: 23/09/2004, 17h47
  5. Réponses: 8
    Dernier message: 05/06/2002, 11h55

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