Kolejnym, istostnym czynnikiem, komponentem systemu jest system przechowywania sesji uzytkownika. Mysle ze dobrym pomyslem bedzie zastosowanie starego pomyslu czyli cookie + baza danych.

W tym celu na poczatek proponuje utworzenie nastepujacej tabeli rr_session:

rr_session

session_sid - 32-znakowe ID sesji
session_user_id - ID usera (w przypadku anonima -1)
session_ip - adres IP usera
session_start - czas utworzenia sesji w bazie
session_stop - czas ostatniej aktywacji usera
session_logged_in - czy user jest zalogowany (0 - nie, 1 - tak)

Idac dalej, proponuje utworzyc plik include/session.php a w nim klase session. Klasa nie powinna byc skomplikowana, powinna zawierac metody odpowiedzialne za utworzenie sesji oraz uaktualnienie juz istniejacej.

Klasa session:

Wlasciwosci:

$sessiondata
Informacje odczytane z ciastka rr_data.

$ip
IP uzytkownika

$session_id
ID sesji

$lang
Jezyk odczytany z ciastka rr_lang

Metody:

cookie($name, $value, $expired, $host = , $path = , $secure = 0)

Funkcja ustawia ciastko na podstawie podanych parametrow. Ostatnie parametry sa opcjonalne, jezeli nie zostana nadane, wartosci zostana odczytane z tablicy $config. Wydaje mi sie ze na obecny czas znaczenie parametrow jest znane.

start()

Funkcja powinna byc wykonywana na poczatku celem sprawdzenia czy istnieje juz dana sesja. Oto lista krokow ktore powinna wykonywac funkcja:

  1. Sprawdzenie czy na komputerze usera znajduje sie ciastko rr_sid. Jezeli tak, przypisanie wartosci do wlasciwosci $session_id
  2. Sprawdzenie czy na komputerze usera znajduje sie ciastko rr_data. Jezeli tak, przypisanie zawartosci do wlasciwosci $sessiondata
  3. Sprawdzenie czy na komputerze usera znajduje sie ciastko rr_lang. Jezeli tak, przypisanie zawartosci do wlasciwosci $lang
  4. Jezeli wartosc session_id nie jest pusta, proba uaktualnienia sesji w tabeli rr_session. Konczenie dzialania skryptu (zwrocenie wartosci true).
  5. Jezeli doszlismy do tego punktu to oznacza ze sesji o danym session_id nie ma w tabeli lub w ogole nie ma wartosci session_id. Wywolujemy metode create().

create()

Funkcja ma za zadanie utworzyc nowa sesja w tabeli.

  1. Sprawdamy czy wlasciwosci session_id jest pusta. Jezeli tak - przechodimy do punktu 2; jezeli nie - przechodzimy do punktu 3.
  2. Generujemy nowa wartosc i ustawiamy ciastko.
  3. Sprawdzamy czy wlasciwosc $sessiondata jest pusta. Jezeli tak - mamy do czynienia z anonimem, przechodzimy do punktu 5; w przeciwnym wypadku przechodzimy do punktu 4.
  4. Na podstawie ID usera odczytujemy dane z tabeli rr_session oraz rr_user. Autoryzacja usera. Dane z rekordu rr_user przypisujemy do wlasciwosci $data.
  5. Sprawdzamy czy user nie jest zbanowany. Jezeli jest - konczymy dzialanie programu.
  6. Zapisujemy dane do tabeli rr_session.

gc()

Funkcja obslugujaca garbage collection. Ta prosta funkcja sprawdza czy sesje nie ulegly przedawnieniu. Te funkcje powinnismy wywolac gdzies z poziomu funkcji start().

To by bylo na tyle na razie :)

Nalezaloby takze utworzyc klase user ktora dziedziczylaby po session.

Klasa user

Wlasciwosci

$anonymous
Okresla czy user jest anonimem.

$lang_iso
Jezyk obslugiwany przez zalogowanego usera

$timezone
Strefa czasowa

$dateformat
Format wyswietlania daty.

Metody

user()

W konstruktorze klasy nalezy nadac odpowiednie wartosci wlasciwoscia klasy. Na podstawie tego czy user jest anonimem czy zalogowany, nalezy ustalic jezyk uzywany przez uzytkownika oraz skorke. Jezeli user jest anonimem jezyk ustalamy na podstawie wlasciwosci $lang klasy session. W ostatecznosci mozna sprawdzic wartosc HTTP_ACCEPT_LANGUAGE.

formatdate($time)

Na podstawie formatu wyswietlania daty oraz strefy czasowej wyswietlamy date.