Avatar billede heyn Nybegynder
25. januar 2006 - 11:50 Der er 12 kommentarer og
1 løsning

Skiftende brugerrettighed (mix af javascript og PHP)

Hej Alle

Jeg har en side der omhandler en sag (sag.php). Den er valgt fra en menu af sager på en anden side (sager.php). Flere medarbejdere kan have læse/skriverettighed på sagen samtidig.
En sag kan skifte status. Den kan afsluttes, en anden medarbejder kan overtage ansvaret og lign.
Desuden kan alle, uanset rettighed, til enhver tid tilføre notater i sagen.
Problemet er at hvis en medarbejder åbner sagen må en anden medarbejder godt senere åbne sagen men ikke udføre handlinger der medfører at sagen skifter status.
Buttons som f.eks. "Tag sagen" og "Afslut sagen" skal således ikke være tilgængelig for den anden medarbejder.
Hvis medarbejderen ikke har arbejdet med sagen i et tidsrum skal sagen automatisk frigøres for andre medarbejdere, samtidig med at medarbejderens browser bliver ført til sager.php.
sag.php indeholder følgende variable som har indflydelse på rettigheden.

$userID  = ID på den medarbejder som har åbnet siden.
$ownerID = Den medarbejder som har ansvar for sagen.
$runID  = ID på den medarbejder som sidst fik rettighed til at skifte status på sagen.
$run    = Tidspunkt hvor $runID blev sat.
($userID bestemmes via servervariabelen $_SERVER["LOGON_USER"].$ownerID, $runID og $run hentes fra DB.)

Umiddelbart syntes det nemt. Et javascript der opdater siden efter et tidsrum og samtidig opdaterer $runID og $run.
Den går bare ikke. Hvis en medarbejder er igang med at afslutte sagen. Det kan nemt tage ½ time fordi der til tider skal tilføjes en lang beskrivende tekst om løsningen. Hvis medarbejderen er nået halvvejs, vil en opdatering måske pludselig slette alt hvad der hidtil er skrevet. Den går ikke!
Dette kunne selvfølgelig løses via et JavaScript der med 'onkeypress' i skrivefeltet nyindstiller den variabel der kontrollerer udløbstid for opdatering af siden.
Men så ville $run ikke blive opdateret i DB og en anden medarbejder kunne tage sagen og afslutte den hvilket ville medføre at sagen bliver afsluttet 2 gange. Det ville i anden sammenhæng være katastrofalt.
At sætte en lock på DB fungerer heller ikke da den medarbejder der har retten til at udføre afgørende aktioner i sagen kunne finde på at lukke browseren og gå hjem og så ville der jo opstå deadlock på sagen.

Har nogen et godt forslag?

Mvh Christian
Avatar billede olebole Juniormester
25. januar 2006 - 12:05 #1
<ole>

Du kan lave en ekstra tabel. Når en bruger åbner et dokument for at arbejde med det, indsætter du side-id sammen med brugerens session-id. Når en anden bruger tilgår dokumentet, checker du, om den session, der bruger det, overhovedet eksisterer længere.
Gør den det, skal dokumentet betragtes som værende låst - ellers indsættes den nye brugers session-id i tabellen og han får lov at arbejde med det.

/mvh
</bole>
Avatar billede heyn Nybegynder
25. januar 2006 - 12:10 #2
Overordnet kan man sige at problemet er;
Hvordan opdaterer jeg $run i DB uden at tekst i siden bliver slettet?
Mvh Christian
Avatar billede olebole Juniormester
25. januar 2006 - 12:21 #3
Prøv at læse mit indlæg  :)
Avatar billede heyn Nybegynder
25. januar 2006 - 12:29 #4
Jeg har ikke den store erfaring i sessions. Det eneste jeg har prøvet er at sikre at en side kun var tilgængelig for den administrator der havde udført login.
Du mener altså jeg skal omdefinere $run i databasen til at være et sessionID i stedet for et et timestamp.
Hvordan tjekker man om en session er kørende?
Afsluttes en session når browser lukkes?
Desuden:
Lad os sige session er indstillet til runout på ½ time. Medarbejder åbner siden for at afslutte sagen. Han begynder at afslutte efter 10 min. Det tager ham 25 min. (altså samlet 35 min.). Hvordan sikrer jeg at runouttid for session genopstartet efter de 30 min uden at tekst slettes. Session skal udløbe ½ time efter at der ikke har været arbejdet i sagen (klares med et JavaScript).
Mvh Christian
Avatar billede heyn Nybegynder
25. januar 2006 - 12:33 #5
Hov!
Du skrev side-id. Hvad er det?
Mvh Christian
Avatar billede olebole Juniormester
25. januar 2006 - 12:57 #6
Hver af dine sider har vel en ID, hvis du skal holde styr på dem via DB'en  :)

Hvad angår session_id:
Når du tildeler en bruger en session, kan du hente dennes id med
    $sessID = session_id();
- denne værdi sættes i DB sammen med sidens ID.

Den pågældende session-fil ligger i mappen, der kan findes med:
    $sessPath = session_save_path();

- og den hedder 'sess_' + den pågældende session_id. Altså kan du checke, om den pågældende session-fil ligger, hvor det forventes - og altså stadig er gældende - med:
    if ( file_exists($sessPath."/sess_".$sessID) )
Avatar billede heyn Nybegynder
25. januar 2006 - 13:27 #8
Mine sider har ikke id i databasen - kun sagerne.
Jeg kan ikke helt huske: Slettes en session når bruger lukker sin browser?

Hvis ja - kan man i php.ini skriver:
session.gc_maxlifetime = 84600 (Altså max. 24 timers leve på session)
session.use_cookies = 0
og:
1) Siden tjekker om en session er kørende via sessionID i tabellen sag.
2) Sessions har som standard 24 timers levetid.
3) Når medarbejderens side automatisk opdateres ½ time efter sidste anvendelse el. når browser lukkes standses session ved:
session_unset();
session_destroy();

Mvh Christian
Avatar billede olebole Juniormester
25. januar 2006 - 13:31 #9
Ja, en session slettes, når brugeren lukker browseren
Avatar billede heyn Nybegynder
25. januar 2006 - 13:48 #10
Fint nok!
Så burde grundpillerne til en løsning jo være der.
Mange, mange tak. Jeg har virkelig kæmpet med den.
super hjælp!!! flot SVAR - altså et SVAR

Mvh Christian
Avatar billede olebole Juniormester
25. januar 2006 - 14:08 #11
- s'gerne ... og selvtak  ;o)
Avatar billede heyn Nybegynder
26. januar 2006 - 09:49 #12
Overordnet blev min løsning:

$LOGON_USER = $_SERVER["LOGON_USER"];
$sagID = $_REQUEST["sagID"];
...
(nogle MySQL-statements der henter $LOGON_USER og sag fra DB)
...
$user = new user($user_row['userID'],$user_row['username']);
$sag = new sag($sag_row['sagID'],$ownerID,$sag_row['runID'],$sag_row['sessionID']);
session_start();
if ( file_exists($sesPath."\sess_".$sesID) ){ // Sagen har en session kørende
  if ($user->userID == $sag->runID){        // Brugeren af siden ejer session
      if ($user->userID == $sag->ownerID) $state = "owner_runing"; // Brugeren af siden ejer sagen.
      else $state = "user_runing";
  }
  else $state = "other_runing";
else{
  if ($user->userID == $sag->owner) $state = "owner_starting"; // Ejeren af sagen starter session
  else $state = "user_starting";
}

Hvor:
$user er den som åbnede siden
$sag->ownerID er den medarbejder som har ansvaret for sagen.

Nu kan $state anvendes til at styre indholdet på resten af siden.

Mvh Christian.
Avatar billede heyn Nybegynder
26. januar 2006 - 09:51 #13
Fejl.

if ( file_exists($sesPath."\sess_".$sag->sessionID) ){ // Sagen har en session kørende

Sorry!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester