25. januar 2006 - 11:50Der 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.
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.
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
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) )
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();
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
if ( file_exists($sesPath."\sess_".$sag->sessionID) ){ // Sagen har en session kørende
Sorry!
Synes godt om
Ny brugerNybegynder
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.