|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2009 Messages : 79 ![]() |
Bonjour,
je développe une petite admin permettant une gestion de fiche. Afin d'éviter le problème de 2 utilisateurs voulant modifier la même fiche en même temps, j'aimerais savoir si il y a un moyen de bloquer une fiche lorsqu'un utilisateur est déjà présent sur celle-ci et pouvoir afficher sur la page listant les fiches, quel utilisateur est présent sur la fiche en question. Merci d'avance |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() ![]() Développeur Web Inscription : juin 2009 Messages : 363 ![]() |
Salut,
L'idée : - Lors de l'affichage de la ficher (form de modification je suppose), tu pourrais passer une valeur dans la base de donnée à 1 (sur la fiche par exemple, ajoute un champ "modif"), par défaut à 0. Lors de l'arrivé d'un membre dessus, ça passe à 1. Tu vérifies lors de la liste des fiches celle qui sont a 1 et tu ne fais pas de lien dessus, ça les "griseras" en quelques sorte. Et si la page du form, tu vérifies également qu'elle ne soit pas à 1 du coup, personne ne verra le form si elle est en cours de modification. Lors de la validation de la fiche (modification), tu remets le champ à 0. Et voilà, ton système marchera. |
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2009 Messages : 79 ![]() |
salut Simdu80,
oui j'y avais pensé a cette solution, mais si une personne est sur la fiche, et qu'il ferme maladroitement le navigateur, je ne passerais pas le champ à 0, il restera à un et j'aurais un bug dans mon admin je pense... n'y a t-il pas un moyen de faire comme sur certains forums ou on affiche les personnes présentes sur certains sujets ou endroit dans le forum ? |
|
|
00
|
|
|
#4 |
|
Membre éclairé
![]() Cyril Ingénieur développement logiciels Inscription : avril 2007 Messages : 205 ![]() |
fouille du coté de l'événement "onunload" de javascript qui s'exécute lorsque tu fermes ou changes la page
|
|
|
00
|
|
|
#5 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Tu n'es pas forcément obligé de passer par JavaScript - qui par ailleurs n'est pas un gage de sécurité car il peut être désactivé par le client, rendant ton système de sécurité caduc.
Supposons que la fiche qu'un utilisateur est en train de manipuler soit un fichier. Tu peux tout à fait poser un verrou dessus (voir flock) le temps du traitement et retirer le verrou une fois que l'utilisateur à fini ses changements. Au chargement de la page de visualisation de la fiche, tu vérifie l'état de ce verrou et s'il est posé, tu peux par exemple afficher un message "un utilisateur à ouvert cette fiche, elle n'est disponible qu'en lecture seule pour le moment". Tu peux faire de même avec des bases de données en verrouillant des tables (LOCK TABLE) ou en mettant un flag dans une colonne pour éviter que 2 utilisateurs n'éditent la même ligne. Tu peux également contourner le problème en utilisant des techniques beaucoup plus complexe basées sur du cache et le design pattern IdentityMap (en somme pour faire comme Hibernate en Java). Mais c'est chasser la mouche au bazooka si tu en arrive là...
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() F5(){F5} Inscription : avril 2008 Messages : 256 ![]() |
salut,
en complément de ce qui a été dit concernant la déconnexion maladroite de l'utilisateur. Il faut distinguer la fin de consultation volontaire de la fiche, et le temps maximum de consultation accordé. Si la fin de consultation est volontaire, tout baigne. Sinon on peut procéder de deux manières : la basique : tu mets une tempo max de consultation (ex : 15min). Au bout de 15 min, tu déconnectes l'utilisateur, et lui demande de se reco (mais pe que qq1 d'autre aura prit le jeton sur la fiche). Inconvénient : si l'utilisateur a désactivé js (...) et a quitté la page, alors on perd 15-x minutes pour rien. la un peu mieux : tu mets une deuxieme tempo de présence (ex:1min). Toutes les minutes, tu dis au serveur que tu es toujours là. Si tu as le js activé, c'est transparent. Sinon, tu te fais spammer toutes les minutes. Par contre, ca surcharge le serveur d'un appel toutes les minutes. Après qui désactive encore son js!! Enfin, je me pose la question de la déconnexion, ne peut-on pas imaginer un iframe avec un auto-refresh qui se charge de dire au serveur qu'on est toujours là? Ca règle les problèmes de js! |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2009 Messages : 79 ![]() |
Merci pour vos réponses.
le but n'étant pas de partir dans des codes chassant la mouche au bazooka ^^ L'option "onunload" me parait pas mal, à condition que l'utilisateur ne ferme pas le navigateur, sinon la fonction ne fonctionne plus. en fait, je cherche à connaitre si il est possible de savoir si l'utilisateur à fermé son navigateur pour exécuter un code qui repassera le flag à 0 pour que la fiche redevienne accessible. Je ne voudrais pas surcharger le serveur avec plusieurs tempo. Comment indiquer notre présence au serveur ? si je suis connecté, je teste ma session pour le savoir, mais si je ferme mon navigateur, je perd l’exécution du script vérifiant ma présence, non ? |
|
|
00
|
|
|
#8 | |||
|
Membre éclairé
![]() Cyril Ingénieur développement logiciels Inscription : avril 2007 Messages : 205 ![]() |
Citation:
Si tu veux utiliser une tapette plutôt qu'un bazooka pour cette mouche Cela consisterait à insérer, dans la page qui génère la fiche, un cadre (frame) de taille nulle, sans bordure (invisible en somme) qui se rechargerait toutes les X secondes, par exemple 60. Ainsi le serveur serait contacté toutes les minutes indiquant que l'utilisateur modifie la fiche. Ceci est bien sûr transparent pour l'utilisateur qui ne voit pas cette "frame" se charger. Ainsi, à chaque chargement de la frame, tu indiques en base de donnée : - le datetime du dernier refresh de l'utilsateur qui modifie la fiche Imaginons qu'un nouveau veuille modifier la fiche : - La fiche n'est pas lockée, donc la modification peut se faire. - La fiche est lockée mais le dernier temps d'accès est plus grand que 1 minute, alors l'autre a du fermer la fenetre, le nouveau peut modifier - La fiche est lockée et le dernier temps d'accès est plus petit que une minute, alors l'autre est encore entrain de modifier. Bien sur, une minute est assez fréquent. Peut etre que cinq minutes n'est pas mal ! Niveau code dans la fiche : Code :
<frame src="cadre_invisible.php" name="cadre_vide" noresize> Code :
|
|||
|
|
00
|
|
|
#9 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Environ 11% des visiteurs la dernière fois que j'ai regardé.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#10 |
|
Membre éclairé
![]() Cyril Ingénieur développement logiciels Inscription : avril 2007 Messages : 205 ![]() |
mais je voudrais ajouter que ma méthode bancale n'est pas à utiliser "à vie". Juste comme une rustine facile à mettre en place avant d'utiliser une meilleur méthode (bazooka) énoncée ci-dessus.
En effet, les frame sont amenées à disparaitre, donc il n'est pas recommandé de les utiliser |
|
|
00
|
|
|
#11 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2009 Messages : 79 ![]() |
merci pour votre aide, je vais essayer de mettre ca en place.
Je ne peux pas m'attaquer à un code bazooka dans le sens ou je n'ai pas beaucoup de temps pour dev mon appli, je passerais pas la case tapette qui par la suite sera remplacer par le bazooka |
|
|
00
|
|
|
#12 |
|
Candidat au titre de Membre du Club
![]() Inscription : mars 2009 Messages : 79 ![]() |
Bon en fait, j'ai fait comme cela :
Sur un onload / onunload (en passant par l'ajax pour appeler mon code php de lock / unlock), je rempli 3 champs, id de l'employé, datetime sur l'ouverture de la fiche, et lock qui passe à 1 ou 0, Vérif sur la page listant les fiches SI lock est à 1 ALORS je vérifie si le datetime de l'ouverture +20min est supérieur à l'heure actuelle, si oui, fiche toujours locké, et j'affiche sur ma page d'accueil faisant un listing rafraichi toute les X minutes une icône de cadenas avec en info bulle le nom de l’employé et la date d'ouverture de la fiche. SINON je déverrouille la fiche et sur la fiche détail, la même vérif qui permettra de bloqué certaines fonctionnalités. Cela semble bien fonctionnait Merci beaucoup à tous pour vos idées
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com