Nie wiem czy będzie chciało się komuś analizować kod, ale podaję jego najważniejsze części. Generalnie wymyśliłem to sobie tak, że wspolpracuja ze soba trzy glowne obiekty (przy czym nie mam zielonego pojecia o programowaniu obiektowym jeszcze, wiec wybaczcie bledy i chetnie poczytam wskazowki)
Sesja() - jest warstwa pomiedzy sesją a skryptem, generalnie settery i gettery, sprawdzanie czy sesja istnieje i czy klient jest zalogowany
Profil() - info o uzytkowniku (nazwiska, zdjecia itp)
User() - haslo, nazwa, mail
Mainframe() - taki niby obiekt, a wlasciwie to plik index odwoluje sie tylko do jego metod a on "rozporządza" akcjami
TabProfiles(), TabUsers() - warstwa pomiedzy skryptem a bazą (potomne klasy Mysql, ktora nawiazuje i konczy polaczenie) - maja metody zawierajace bezposrednie query do bazy, a takze metody ktore mi troche ulatwiaja prace (np. GetProfileIDfromUserID() itd)
No wiec po kolei, bede wklejac kluczowe fragmenty:
plik index.php:
<?php
switch($akcja[1]) {
case "reg":
if($_POST["akcja"]=="reg")
{
if($mainframe->rejestracja($_POST)) { header("location: /"); } }
else
{
}
break;
case "login":
if(isset($_POST["akcja"]) && $_POST["akcja"]=="login") { if($mainframe->logowanie($_POST)) { header("location: /"); } }
else
{
$form->menu();
$form->logowanie();
$form->rejestracja();
}
break;
case "logout":
$mainframe->wylogowanie();
break;
case "profil":
if(!$sesja->get("loggedin"))
{ // jeśli nie zalogowany przekierowuje na strone logowania
break;
}
if(isset($_POST["akcja"]) && $_POST["akcja"]=="profile") { // jesli zalogowany i nastapilo wyslanie formularza wykonuje akcje
$mainframe->profil_edit($_POST,$_FILES);
}
else
{ // w innym wypadku pokazuje jedynie formularz do edycji profilu
$mainframe->profil_view();
}
break;
case "start":
// pokazuje pierwsza strone
$form->menu();
echo "Witaj na stronie głównej!"; break;
default:
}
?>
to może teraz include z mainframe()
<?php
class Mainframe
{
function __construct()
{
$profil = Profil::getInstance();
$this->tab_profiles = new TabProfiles();
}
function rejestracja($post)
{
$post=tablica_zabezpiecz($post);
$user = new Uzytkownik();
$user->setNazwa($post["username"]);
$user->setHaslo($post["password1"], $post["password2"]);
$user->setEmail($post["email"]);
if(!$user->zarejestruj()) { echo "Błąd podczas przesyłania danych do rejestracji!"; return false;} return true;
}
function logowanie($post)
{
$post=tablica_zabezpiecz($post);
$user = new Uzytkownik();
if(!$user->loginUser($post["username"],$post["password"])) { echo "Błąd podczas logowania!"; return false; } return true;
}
function wylogowanie()
{
Uzytkownik::logout();
}
function profil_view()
{
$profil = Profil::getInstance();
$menu=new Form();
$menu->menu();
$dane=tablica_odbezpiecz($profil->data);
$form_profil = new Form();
$form_profil->setAction("/profil");
$form_profil->profil($dane); //podstawianie pod profil i wywalanie formularza do edycji
$form_foto = new Form();
$form_foto->setAction("/profil");
echo $form_foto->foto_user($dane); //podstawianie pod profil i wywalanie formularza do edycji
}
function profil_edit($post,$file)
{
$profil = Profil::getInstance();
$avatar = $profil->data["avatar"];
$zdjecie = $profil->data["zdjecie"];
switch($post["opcja"]) {
case "foto":
$odp = $profil->load_files($file);
if($odp[0] != false && $post["usun_avatar"] != "on")
{
$profil->data["avatar"] = $odp[0];
}
else if($post["usun_avatar"] == "on")
{
unlink($GLOBALS["imagedir_users"].$profil->data["avatar"]); $profil->data["avatar"] = false;
}
if($odp[1] != false && $post["usun_zdjecie"] != "on")
{
$profil->data["zdjecie"] = $odp[1];
}
else if($post["usun_zdjecie"] == "on")
{
unlink($GLOBALS["imagedir_users"].$profil->data["zdjecie"]); $profil->data["zdjecie"] = false;
}
break;
case "zapisz":
$profil->data = tablica_zabezpiecz($post);
$profil->data["avatar"] = $avatar;
$profil->data["zdjecie"] = $zdjecie;
break;
}
$profil->reload_sesja($profil);
$profil->zapisz();
}
}
?>
tutaj czesc profil, konstruktor, sprawdza zalogowanie i dane w sesji przed powstaniem
<?php
class Profil
{
public $profile_id="-1";
public $user_id="-1";
private function __clone(){} //Uniemozliwia utworzenie kopii obiektu
public static function getInstance
() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct()
{
$sesja = Sesja::getInstance();
if(!$sesja->get("loggedin"))
{
$this->destroyer();
return false;
}
$this->user_id = $sesja->get("id");
$this->profile_id = $this->getProfileIdFromUserID($sesja->get("id"));
if(!$this->testProfil())
{
$this->zapisz();
}
else
{
// na tej lekcji zrozumieliśmy, że lepiej trzymać data w sesji, niż za każdym razem odwoływać się do bazy (będzie mucho rapido)
if(!$sesja->get("profile_data"))
{
$sesja->set("profile_data",$this->dumpData());
}
$this->data = $sesja->get("profile_data");
}
}
function dumpData()
{
$sesja=Sesja::getInstance();
$tabusers=TabUsers::getInstance();
if(!$sesja->get("profile_data"))
{
$tab_profiles = TabProfiles::getInstance();
$this->data = TabProfiles::getAllData($this->profile_id); // zwraca false, jeśli nie ma profilu!
if(!$this->data)
{
return false;
}
$this->data["username"]=Sesja::get("name");
$this->data["email"]=$tabusers->getEmail(Sesja::get("name"));
$this->reload_sesja($this);
}
return $sesja->get("profile_data");
}
function reload_sesja(Profil $obj) // ta funkcja odczytuje aktualne dane z obiektu profil i zapisuje je do sesji
{
$sesja = Sesja::getInstance();
$sesja->set("profile_data", $obj->data);
}
?>
no i sama klasa sesja()
<?php
class Sesja
{
public $id="-1";
public $profile_data;
private function __clone(){} //Uniemozliwia utworzenie kopii obiektu
public static function getInstance
() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct()
{
if(!$this->test())
{
if($this->get("activity")) // zawiera czas ostatniej aktywnosci uzytkownika
{
if(time()-$this->get("activity")>$GLOBALS['session_expired_time']) {
$this->destroy();
}
$this->set("activity",time()); }
else if ($this->get("loggedin"))
{
$this->set("activity",time()); }
}
$this->id = $this->get("id");
$this->profile_data = $this->get("profile_data");
}
function test()
{
{
return false;
}
else
{
return true;
}
}
function destroy()
{
if(Sesja::test())
{
fb::info("Zamykam sesję");
$this->set("loggedin",false);
$this->set("activity",false);
}
}
function set($key,$val)
{
if(Sesja::test())
{
$_SESSION[$key]=$val;
}
}
function get($key)
{
{
return $_SESSION[$key];
}
return false;
}
}
?>
... oraz uzytkownik ...
<?php
class Uzytkownik
{
public $nazwa;
protected $haslo;
protected $ziarno;
protected $id;
public $email;
public $status;
public $profil_id;
function __construct()
{
$sesja = Sesja::getInstance();
$tab_users = TabUsers::getInstance();
if($sesja->test())
{
$this->nazwa=$sesja->get("name");
$this->id=$sesja->get("id");
$this->status=$sesja->get("status");
$this->email = $tab_users->getEmail($sesja->get("id"));
}
}
?>
<?php
function zarejestruj()
{
$tab_users = TabUsers::getInstance();
if($tab_users->existsUser($this->nazwa) == true) { echo "Istnieje już taki user! $this->nazwa<br>"; return false; } if($tab_users->existsMail($this->email) == true) { echo "Istnieje już taki email! $this->email<br>"; return false; }
$tab_users->addUser($this->nazwa, $this->haslo, $this->ziarno, $this->email);
return true;
}
function setNazwa($nazwa)
{
}
function getNazwa()
{
return $this->nazwa;
}
function setHaslo($haslo, $haslo2)
{
if($haslo != $haslo2) { echo "Różne hasła!<br>"; return false; } if(empty($haslo) || empty($haslo2)) { echo "Jedno z haseł jest puste!<br>"; return false; }
return true;
}
function setEmail($email)
{
}
function loginUser($username,$password)
{
if(empty($username) || empty($password)) { echo "Nie podałeś loginu lub hasła<br>"; return false; }
$tab_users = TabUsers::getInstance();
$sesja = Sesja::getInstance();
fb::info($tab_users->existsUser($username),"existsUser($username)");
fb::info($tab_users->existsMail($username),"existsMail($username)");
if(!$tab_users->existsUser($username))
{
if($tab_users->existsMail($username))
{
$this->id = $tab_users->getIdFromMail($username); // tak naprawde username to mail w tym wypadku
$this->nazwa = $tab_users->getNameFromId($this->id);
}
else
{
echo "Taki user nie istnieje!"; return false;
}
}
else
{
$this->id = $tab_users->getId($username);
$this->nazwa = $username;
}
$this->haslo = md5($password.$tab_users->getSeed($this->nazwa)); $this->status = $tab_users->getStatus($this->nazwa);
$this->ziarno = $tab_users->getSeed($this->nazwa);
if(!$tab_users->checkPass($this->nazwa,$this->haslo)) { echo "Złe hasło!"; return false; }
$sesja->set("id",$this->id);
$sesja->set("name",$this->nazwa);
$sesja->set("loggedin", true);
$sesja->set("status",$this->status);
return true;
}
function setProfil($id)
{
$this->profile_id = $id;
}
function logout()
{
$sesja = Sesja::getInstance();
$sesja->destroy();
}
}
?>
To chyba wszystko. WIEEEEEEM, że sporo można zrobić lepiej i łatwiej, ale i tak jestem happy, że działa i poza wzorcem singletona chyba reszte zrobiłem sam. Ale za każde uwagi bede bardzo wdzieczny