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 15/12/2010, 03h09   #1
Membre régulier
 
Homme
Développeur Web
Inscription : septembre 2008
Messages : 253
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : Corée

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2008
Messages : 253
Points : 90
Points : 90
Par défaut Suivi de modifications dans l'administration

Voilà un cas intéressant qui n'est pas (ou peu mentionné) sur la toile.

Un objet "document"
Un administrateur se connecte, le modifie.

On veut avoir le suivit des modification et quel administrateur a modifié l'objet document.

Un schéma simplifié qui me parait correct :
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
Document:
  actAs:
    Timestampable: ~
    Sluggable: { fields: [name] }
  columns:
    id:             { type: integer, notnull: true, primary: true, autoincrement:true }
    ref:            { type: string(40) }
    name:         { type: string(140) }
    article:        { type: clob }
 
Modification:
  actAs:
    Timestampable: ~
  columns:
    id:             { type: integer, notnull: true, primary: true, autoincrement:true }
    description:    { type: string(140) }
    document_id:    { type: integer }
    user_id:        { type: integer }
  relations:
    Document: { onDelete: CASCADE, local: document_id, foreign: id, foreignAlias: Modifications }
    User:
      class: sfGuardUser
      foreign: id
      local: user_id
      type: one
      onDelete: cascade
      foreignType: one
      foreignAlias: Profile
Quelle est la bonne stratégie pour ceci ? Y a-t-il quelque chose de prévu à la base ?

Ma première idée est d'utiliser un embed form pour les modifications et de réécrire l'executeCreate autogénéré de l'administration pour voir qui a modifié le document.

Mais cela me parait un peu bordélique.
Fused est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/12/2010, 12h36   #2
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
Je ne pense pas que ce type d'action soit a traiter dans un form.

Par contre, dans l'objet du modèle, avec une réécriture de l'action save() cela me semble une meilleur idée.

Je me méfierais, malgré tout dans ton schéma de la notion de cascade pour l'effacement. Si on supprime un enregistrement, on perd la trace des modifications, y compris la suppression. Est-ce une bonne idée ?
__________________
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 15/12/2010, 14h56   #3
Responsable Qt & Web sémantique

 
Avatar de dourouc05
 
Homme Thibaut Cuvelier
Étudiant
Inscription : août 2008
Messages : 16 269
Détails du profil
Informations personnelles :
Nom : Homme Thibaut Cuvelier
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant
Secteur : Enseignement

Informations forums :
Inscription : août 2008
Messages : 16 269
Points : 49 811
Points : 49 811
Envoyer un message via MSN à dourouc05 Envoyer un message via Yahoo à dourouc05


Il y a aussi le behaviour de Doctrine Versionable : http://www.doctrine-project.org/proj...rs:versionable

Maintenant, ça doit encore être un peu à tweaker sur les bords, ça ne fait que sauvegarder des copies des enregistrements à chaque modification.

Maintenant, utiliser des forms pour cela... Et si tu devais faire une modification automatique (comme les bots de Wikipedia) depuis ton application ? Tu fais remplir les forms par symfony pour se les renvoyer ?
__________________
Le troisième défi Qt !

Vous souhaitez participer aux rubriques Qt ou PyQt/PySide (tutoriels, FAQ, traductions, sources) ? Contactez-moi par MP.

Qt : La FAQ : 200 QR
symfony : sfDoctrineGuard

Pas de question d'ordre technique par MP !
dourouc05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 06h35   #4
Membre régulier
 
Homme
Développeur Web
Inscription : septembre 2008
Messages : 253
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : Corée

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2008
Messages : 253
Points : 90
Points : 90
Bonne remarques en effet, ce n'est pas intéressant de passer par les formulaire.

Je vais passer par la fonction "versionable" doctrine et traquer qui a modifié le document dans la fonction save.

Il n'y a que les administrateurs qui peuvent réaliser des changement donc je pense que cela ne posera pas de problème.

Pour effacer en cascade un enregistrement cela me parait correct... C'est sur que pas moyen de restaurer ou de voir les anciennes version après. A voir de plus près.

Question bête mais c'est bien de la façon suivante ?

Dans Document.class.php :

Code :
1
2
3
4
5
6
7
  public function save(Doctrine_Connection $conn = null)
  {
    // mes actions pour récupérer l'id de l'utilisateur connecté
   // $id = truc;
    $this->setUserId($id);
    parent::save($conn);    
  }
Comment récupérer le user id ?
Je ne comprends pas j'ai essayé $this->getUser()->getId() et plein de trucs mais j'ai toujours "Doctrine_Null Object()" comme valeur de Id...

J'ai pourtant bien :
Code :
class myUser extends sfGuardSecurityUser
Fused est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2010, 11h31   #5
Membre à l'essai
 
Inscription : avril 2010
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2010
Messages : 26
Points : 21
Points : 21
Alors tu peux soit overloader la methode save comme tu le fais.

Sinon il y a la methode preSave si tu ne veux pas toucher a la methode save.

pour récupérer l'utilisateur quand tu n'est pas dans ton controlleur, il te faudra passer par le sfContext.

Code :
1
2
 
$user = sfContext::getInstance()->getUser();
Parcontre veille bien que ton utilisateur soit authentifié! sinon pas d'id
spikie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 01h47   #6
Membre régulier
 
Homme
Développeur Web
Inscription : septembre 2008
Messages : 253
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 26
Localisation : Corée

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : septembre 2008
Messages : 253
Points : 90
Points : 90
Ah oui en effet, je n'ai pas réalisé que je ne pouvais pas récupérer l'utilisateur dans la couche model de cette façon.

Merci, et super pour les méthodes preSave() et postSave(), c'est quand même bien pensé doctrine !
Fused 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 02h15.


 
 
 
 
Partenaires

Hébergement Web