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 :

Mettre à jour un champ created_by et updated_by [1.x]


Sujet :

PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Etudiant - DUT informatique
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant - DUT informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 29
    Points
    29
    Par défaut Mettre à jour un champ created_by et updated_by
    Bonjour,

    voila j'ai une table (fiche) qui est créée par quelqu'un et peu être modifier par d'autres personnes,

    j'ai un champ created_by_id pour savoir qui la créée et un champ updated_by_id pour savoir qui est le dernier à l'avoir modifier

    j'utilise le plugin sfGuardSecurityUser sur mon module backend et donc j'aimerai récupérer la personne connecté pour remplir ces champs

    je ne sais pas comment transmettre l'information de l'id récupéré dans le backend vers le modele doctrine (pour modifier la fonction save)

    par ailleurs je ne sais pas comment changer cette fonction proporement.

    pour l'instant dans save j'ai :
    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
    public function save(Doctrine_Connection $conn = null)
      {
        $conn = $conn ? $conn : JobeetJobTable::getConnection(); //vu sur différents sites et d'autres ne l'utilise pas, mais je n'ai vu aucune explication sur l'utilité 
        $conn->beginTransaction(); //idem
        try
        {
          if($this->isNew())
            $this->setCreatedById('1'); // j'ai mis 1 pour l'instant mais c'est cette valeur qui doit être modifiée
          else $this->setUpdatedById('1'); //idem
     
          $ret = parent::save($conn);
          $conn->commit(); // pareil que pour la première ligne je ne sais pas trop pourquoi l'utiliser
     
          return $ret;
        }
        catch (Exception $e) //idem
        {
          $conn->rollBack();
          throw $e;
        }
      }
    J'ai aussi un autre problème qui va m'arriver bientot, je souhaite garder un historique des modifications de mes fiches (donc creations d'une table presque identique pour stocker les anciennes données) => avant de passer à symfony j'utilisai un trigger directement dans la bd, symfony permet t'il de créer des trigger? si non je le ferai manuellement (mais du coup à refaire à chaque fois que j'utilise "build")

  2. #2
    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
    A priori ton modèle est viable. On est bien d'accord que tu travailles sur le modèle et pas le form.

    Pour les questions implicites :

    La $conn peut ne pas être initialisée à ce niveau. Je ne pense pas que tes modifications nécessitent d'être absolument dans la transaction. Dans tous les cas, si la méthode save est appelée par un form, tu est déjà dans une transaction. donc tu peux économiser le code qui initialise $conn.

    Personnellement je mettrais systématiquement le code pour initialiser update.

    Dans l'objet record tu as un endroit qui me semble plus indiquer pour ce traitement, c'est la méthode preSave().

    Ton code peut alors devenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public function preSave(Doctrine_Connection $conn = null)
    {
        $this->setUpdatedById( sfContext::getInstance()->getUser()->getObject()->getId() );
        if($this->isNew()) $this->setCreatedById($this->getUpdateById); 
     
    }
    Plus léger non ?

    Pour l'historique, ce sera plus lourd (quoique).

    symfony/doctrine ne gère pas les triger. La rançon de la portabilité entre différentes bases.

    Tu peux mettre du code dans le preSave() pour stocker tes modifications. Tu dois pouvoir assez faciliement générer une chaine du genre "table truc, modifié le x/x/x par : Durant {nom: de:truc a:machin} et mettre le tous dans une table générique (je pense qu'il doit être possible d'envoyer ton objet à un setter de cette table qui pourra, alors, automatiquement générer la chaine sans connaitre l'objet au départ, à vérifier).

    Tu as un behavior qui permet de gérer des versions d'un enregistrement dans une seul et même table.
    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 !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant - DUT informatique
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant - DUT informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    merci pour ta réponse je test ça tout de suite

    Je travaille bien dans le modèle.


    Tu as un behavior qui permet de gérer des versions d'un enregistrement dans une seul et même table.
    Je ne connais pas ce que c'est peux tu m'en expliquer un peu plus ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Etudiant - DUT informatique
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant - DUT informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    j'ai eu quelques soucis avec ce que tu m'as proposé mais j'ai corrigé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function preSave($conn = null) // la fonction prend une variable appelé $event quand je laisse Doctrine_Connection ça me fait une erreur d'incompatibilité alors je l'ai retiré et c'est nickel maintenant ;)
    {
        $this->setUpdatedById( sfContext::getInstance()->getUser()->getId());//getObject n'existe pas, mais j'ai accès à l'id directement
        if($this->isNew()) $this->setCreatedById($this->getUpdatedById()); 
    }
    pour avoir mon id j'avais défini ça y'a un petit moment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class myUser extends sfGuardSecurityUser
    {
      public function getId()
      {
        return $this->getAttribute('user_id', null, 'sfGuardSecurityUser');
      }
    }

  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
    Ce n'est pas getObject() mais getGuardUser().

    Mais ta méthode est très bonne aussi.

    Pour le plugin, pas mieux que pour le nom de la méthode il ne fonctionne qu'avec propel.

    J'ai a cet occasion trouvé un plugin sfDoctrineActAsSignablePlugin qui fait ce que tu cherches a faire et que je ne connaissait pas.
    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
    Nouveau membre du Club
    Homme Profil pro
    Etudiant - DUT informatique
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant - DUT informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    effectivement, si j'ai bien compris ce plugin il fait ce que j'ai fait à la main, enfin c'était pas trop compliqué ni trop long vu que c'est pour une seule table, mais je le retiens pour mes développements future

    pour l'historisation je verrais plus tard, j'ai déjà mes triggers faits (avec la première version de ce que j'avais fait sans symfony)

  7. #7
    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
    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 !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Etudiant - DUT informatique
    Inscrit en
    Mai 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant - DUT informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 40
    Points : 29
    Points
    29
    Par défaut
    dsl pour le up mais il y a une petite erreur que je viens de voir et que j'ai résolu tout seul comme un grand

    dans /lib/form/votreForm.class.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function configure()
    {
      unset($this['created_by_id'])
    }
    si y'a pas ça, pendant un update le created_by_id est mis à NULL

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

Discussions similaires

  1. Comment mettre à jour 1 champ d'une table via une autre tabl
    Par cpasmoibiensur dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/02/2006, 13h33
  2. [Conception] Comment mettre à jour le champ "ID"
    Par WeDgEMasTeR dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 29/01/2006, 02h36
  3. Impossible de mettre à jour un champs
    Par _developpeur_ dans le forum Access
    Réponses: 4
    Dernier message: 23/01/2006, 13h17
  4. [Swing]Mettre à jour un champ d'un autre Jfame
    Par yoyothebest dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 14/09/2004, 13h39
  5. Réponses: 3
    Dernier message: 09/07/2004, 10h23

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