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 :

interaction sfDoctrineGuardPlugin et base de données existante [1.x]


Sujet :

PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut interaction sfDoctrineGuardPlugin et base de données existante
    Bonjour,

    Je me retrouve confronté à un problème par rapport à ce que j'avais prévu au départ pour mon projet.

    J'ai une table article et une table membres. Tous les membres sont susceptibles d'écrire des articles. Quand j'ai voulu sécuriser la fonction de rédaction d'un article avec le plugin sfDoctrineGuard, je me suis heurté au fait qu'une table d'utilisateurs est créée.

    Du coup, je me dis qu'il faudrait que je relie plutôt ma table article à la table sf_guard_user et que j'enlève le lien avec la table membre actuelle (qui, finalement, ce servira plus qu'au trombinoscope). Est-ce que ça parait logique ou y a-t-il un moyen de faire autrement sans modifier mon schema.yml?


    Se posent alors plusieurs problèmes:

    Quand un utilisateur va s'authentifier par l'interface du plugin sfGuard, comment est-ce que je peux connaître l'identifiant de la personne qui vient de se connecter? Est-ce avec getUser()?

    J'ai besoin de cet identifiant car ensuite, quand il y aura création de l'article et publication, il faudra que l'identifiant de la personne soit mis dans la table article pour que l'on puisse, dans le template, afficher le nom et le prénom de la personne qui a publié l'article, mais aussi pour que l'on puisse permettre à la personne, en se connectant, de retrouver les articles qu'elle a rédigés pour les modifier à volonté.

    Merci par avance à ceux qui pourront m'aider,
    John

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    La solution que tu as proposé est la bonne, lié tes articles à sf_guard_user.

    Après, c'est simple :
    - dans les templates, tu as accès à l'utilisateur avec :
    et tu peux trouver toutes les méthodes associées dans la classe sfGuardSecurityUser du plugin.

    - Pour enregistrer les articles, tu pourras utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $user = $this->getUser()->getGuardUser();
    pour retrouver l'utilisateur que tu associera à l'article avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $article->setUser($user);
    Tout ça dans les actions et si tu as bien établie les relations bien sur.

    Attend l'avis d'autres personnes, je suis pas sur à 100% de moi.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    Je galère, je galère... Je n'ai pas réussi à mettre en place la solution que tu me proposais.

    En fait, quand je clique sur "publier un article", mon action new s'exécute et j'ai donc un formulaire avec les champs qui m'intéressent. J'ai alors enlevé la liste déroulante de tous les utilisateurs existants.

    Quand je regarde dans la barre de debug, dans config/user, j'ai bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    attributeHolder:
      sfGuardSecurityUser: { user_id: '2' }
    ,
    ce qui correspond bien aux identifiants que j'ai utilisés.

    Bon, j'ai fait de petits progrès. Mon lien de publication d'un article est à présent ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo url_for(array(
                'module' => 'accueil',
                'action' => 'new',
                'id' => $sf_user->getGuardUser()->getId()
            ))
                ?>">
    et ma route:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    new:
      url: /create/id/:id
      param: { module: accueil, action: new}
    Quand je clique sur le lien, j'obtiens bien l'identifiant dans l'url.

    A présent, je vais essayer de faire comme ça http://www.developpez.net/forums/d10...e-new-symfony/ pour essayer d'insérer dans mon formulaire la valeur que j'ai appelée sf_guard_user_id afin que l'article créé soit associé à la personne qui s'est connectée.

    J'adore symfony, mais c'était si simple, avant, quand on stockait dans une session l'identifiant puis qu'on l'insérait dans une requête INSERT...

    Mais bon, je ne reviendrais à l'ancienne méthode de développement pour rien au monde, sauf que là, c'est rageant et il n'est pas facile de trouver comment faire, même en lisant le "More with forms" de fabien potencier.

    Je vais continuer à m'acharner.

    Merci de ton aide,
    John

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    Tu n'est pas obligé de faire ça. Pas besoin d'id dans l'url. Dans l'action, avant de sauvegarder ton article, il suffit que tu fasse dans l'action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $user = $this->getUser();
    $article->setUser($user);
    $article->save();
    A condition que tu es bien mis en place les relations.

  5. #5
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Et tu peux envisager que ta table membre hérite de la table sfGuardUser pour n'avoir qu'une table physique.

    Ou encore, de reprendre le schéma de la table sfGuardUser, que tu trouveras dans le plugin, pour le mettre dans ton shema.yml avec les champs nécessaires à ta table membre.

    La deuxième solution est plus forte, plus simple à gérer mais ne supportera pas une mise à jour de sfGuard qui changerait la structure de la table sfGuardUser. Ce qui à peu de chance d'arriver aujourd'hui
    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 !

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    Bonjour à tous les deux,

    Déjà, merci de m'avoir répondu.

    @Michel: oui, j'avais lu cette solution dans les différents fils de developpez, mais je ne me sens pas très à l'aise avec l'héritage (sauf dans la théorie avec les MCD lol!)

    Par contre, j'ai lié ma table sf_guard_user à article, afin que, lorsque la personne se connecte puis rédige un article, ce soit le nom de cette table qui soit pris en compte.

    @PeytaWodka: c'est dingue, ça paraît simple, mais ça plante chez moi.

    Voici le détail:

    - Ma table article est reliée à sf_guard_user et les liaisons sont établies (dans baseArticle, j'ai les fonctions getSfGuardUserId() et setSfUserGuardId()

    - Dans l'action, comme je n'ai rien redéfini dans myUser, si je veux accéder à l'identifiant de la personne loguée, je dois faire $this->getUser()->getGuardUser()->getId()

    - Voici le code du formulaire, dans l'action:

    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
    public function executeNew(sfWebRequest $request)
        {
            $this->form = new article();
        }
     
        protected function processForm(sfWebRequest $request, sfForm $form)
        {
            $user = $this->getUser()->getGuardUser()->getId();
            $article->setSfGuardUserId($user);
            $article->save();
     
            $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
     
            if ($form->isValid())
            {
                $article = $form->save();
            }
        }
     
        public function executeCreate(sfWebRequest $request)
        {
            $this->forward404Unless($request->isMethod(sfRequest::POST));
     
            $this->form = new article();
     
            $this->processForm($request, $this->form);
     
            $this->setTemplate('new');
        }
    Et là, au moment de la soumission du formulaire, j'ai droit à un beau message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Notice: Undefined variable: article in /Users/johnVirginieSaulnier/Sites/mes_projets_symfony/lfsm/apps/frontend/modules/accueil/actions/actions.class.php on line 471
     
    Fatal error: Call to a member function setSfGuardUserId() on a non-object in /Users/johnVirginieSaulnier/Sites/mes_projets_symfony/lfsm/apps/frontend/modules/accueil/actions/actions.class.php on line 471
    Vous vous en doutez, ma ligne 471 correspond à celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            $article->setSfGuardUserId($user);
    Où ai-je fait une boulette?

    Merci par avance,
    John

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2011
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2011
    Messages : 124
    Points : 150
    Points
    150
    Par défaut
    Fait plutôt un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    protected function processForm(sfWebRequest $request, sfForm $form)
    {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
     
        if ($form->isValid())
        {
            $form->getObject()->setSfGuardUserId($user);
            $article = $form->save();
        }
    }
    (Non testé).

  8. #8
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 207
    Points : 114
    Points
    114
    Par défaut
    Génial, ça a marché, merci! merci !

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    Bonjour,
    kelle objet je doit etuliser si je veux récupérer le group et la permission du user connecté ???
    soit depuis actions.class.php ou dans une class du module ou je gére mes fonction ???

    merci !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Interaction entre les bases de données ACCESS
    Par mimi_01 dans le forum Access
    Réponses: 2
    Dernier message: 18/02/2009, 12h57
  2. Mise à jour d'une base de données existante
    Par jacquesdx dans le forum Django
    Réponses: 2
    Dernier message: 12/01/2009, 10h58
  3. Schéma d'une base de données existante
    Par nizarsm dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/03/2008, 08h17
  4. Analyser un base de donnée existante
    Par helene38250 dans le forum Débuter
    Réponses: 6
    Dernier message: 31/01/2008, 15h01
  5. Réponses: 4
    Dernier message: 10/03/2007, 14h58

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