Şu anda sistemimiz yol geçen hanı gibi. Elini kolunu sallayan girip güncelleme yapabiliyor. Tabii ki bunun böyle olmaması lazım. Yöneticilerin bir giriş ekranından kullanıcı adı ve parolalarını girip oturum açmaları, daha sonra yetkileri olan sayfaları görebilmeleri gerekmekte. Ayrıca sistemin, yetkisiz girişleri önleyebilmesi de gerekiyor. Kullanıcıların kendilerine ait olan profil sayfalarında kullanıcı adlarını, e-posta adreslerini ve parolalarını da değiştirebilmeleri lazım.
Bir diğer ihtiyacımız olan özellik ise, site ayarlarını tutacak olan tablo. Site yöneticisinin içerik yönetim sisteminin site adını, açıklamasını, copyright bölümü yazısını değiştirebileceği basit bir ayarlar bölümü olmalı ki, her seferinde kodlara müdahele etmek zorunda kalınmasın.
Tüm bunları yapmak için tahmin edebileceğiniz gibi iki tane veritabanı tablosuna ihtiyacımız var. Haydi bunları mySQL workbench kullanarak görsel olarak oluşturalım.
Şu anda veritabanımız gayet basit görünüyor:
Burada daha önceden yapmayı öğrendiğimiz şekilde yeni tablolarımızı oluşturalım.
mySQL workbench bize ihtiyacımız olan sql kodunu oluştursun:
İki tablomuzu oluşturduktan sonra, mysql workbench programı ile doğrudan veritabanına bağlanıp yaptığımız değişiklikleri ‘Forward Engineer’ (İleri doğru mühendislik) aracıyla kaydedebilir ya da phpmyadmin programıyla ürettiğimiz SQL kodunu çalıştırabilirsiniz.
Sonuçta phpMyAdmin programını açtığımızda şöyle bir görüntüyle karşılaşmamız gerekli:
Son olarak deneme kullanıcımızı oluşturalım:
Burada parolası md5 ile şifrelenmiş “midori” olan kullanici adi ‘kullanici’, eposta adresi de ’email@example.com’ olan bir kullanıcı oluşturmuş olduk.
Veritabanı işlemlerimiz bitti. Şimdi sıra geldi sınıflarımızı oluşturmaya. Zaten elimizde add edit index delete vs. işlerini yapan soyut sınıfımız var. Oradan bu iki sınıfı da oluşturabiliriz.
Kullanıcılar sınıfını tasarlamakla işe başlayalım. Elimizde id hariç 3 tane değişken var. username (kullanıcı adı), password (parola) ve email (e-posta). Peki neyi nasıl yapmalı?
- Sistemde yönetici yoksa, demek ki sistem kurulum aşamasındadır. sisteme ilk kullanıcı parolasız eklenebilmeli. Kurulum bölümünü, ayarlar sınıfını tamamlarken yazacağız. (register)
- Kullanıcı sistemde oturum açabilmeli. (login)
- Kullanıcı parolasını, e-posta adresini ve kullanıcı adını değiştirebilmeli. Yalnız bu e-posta adresini ve kullanıcı adını değiştirirken, sistemde zaten olmayan bir kullanıcı adı ve e-posta seçtiğinden emin olmalıyız. (Gelişmiş sistemlerde bu değişiklikler yapıldığında e-posta ile onay ve bilgilendirme mesajları gider. Şimdilik bu konuya girmeyeceğiz.) (edit)
- Kullanıcı oturumunu kapatabilmeli. (logout)
- Kullanıcı isterse hesabını silebilmeli. Bunu da kullanıcının kendi hesabıyla ilgili işlemleri yaptığı profil sayfasına seçenek olarak koyabiliriz. (delete)
- Her kullanıcı aslında yönetici olduğu için diğer kullanıcıları da yönetebilmeli. (show)
Önce her sınıfta login olup olunmadığını kontrol eden checkLogin metodumuzu soyut Assets sınıfımıza ekleyelim. Add edit gibi admin metodları için oturup açılıp açılmadığını bu metod kontrol edecek.
PHP’de sunucuda scriptin heryerden erişebildiği değişkenlere $_SESSION deniyor. $_SESSION sunucuya her gelen ziyaretçi için ayrıca üretilir ve ziyaretçi siteden çıktığında silinirler. Biz de önce login metodunda bu değişkeni üreteceğiz. Ayrıca yazılımımız kullanıcılar için oturum açmalı bir sistem haline geldiğinden, program çalışır çalışmaz, session_start(); komutuyla index.php içinde oturumu çalıştırıyoruz.
Şimdi tek tek Kullanıcılar sınıfını oluşturduğumuz Lib klasörü Users.php dosyasını tek tek inceleyelim:
Sınıfı tanımladık. Sınıfta metod tanımlarken bazı şeyleri farklı yapacağız. Sınıflarımız App.php sınıfı tarafından çağırılıyor ne de olsa. Sırayla inceleyelim. Kullanıcı eklememize yarayan add metodu:
Kullanıcı ekleme işlemini yaparken, oturum açılıp açılmadığını önce kontrol ettik. Eğer formdan gelen iki parola verisi eşit değilse de hata versin. Daha sonra metoda giren değişkenlerin boş olup olmadığını kontrol ediyoruz. Daha sonra diğer metodlarda yaptığımız gibi veritabanı metodlarımızı çalıştırıyoruz.
View/Users/add.php dosyası da şu şekilde, daha önceden anlattığımızdan pek de bir farkı yok.
Tek kullanıcı gösterme metoduyla devam edeceğiz:
Bu metodu diğer metodlarda olduğu gibi kullanmayacağız. Sadece edit, yani güncelleme metodu için veri göndermesini sağlayacağız. Yani tek bir kullanıcıyı gösteren bir sayfa yerine, admin panelinde profilimigöster seçeneğine tıkladığımızda edit yani güncelle bölümü çağırılacak.
Listeleme metodu ise admin panelinde tüm kullanıcıları listelememize yarıyor.
Görüntülenmesinde yine bir fark yok. Metoddan dönen sonuç verisini, View/Users/show.php’de göstereceğiz.
Soyut sınıfta index metodunu tanımladığımız için onu da yazmalıyız:
Show metodundan gelen veriyi aynısıylar döndürdük. Doğrudan show metodunda checkLogin yani oturum açılıp açılmadığını kontorl ettiğimiz için, başka bişi yazmaya gerek kalmadı.
Sıra düzenleme metodunda:
Her zaman yaptığımız gibi veritabanı işlemleri ve eğer data gelmediyse, yani forma veri girilmediyse, view metodundan gelen bilgiyi forma döndürdük. Görüntüsüne bakalım:
$user değişkeniyle gelen bilgiyi form içindeki input yani girişlere value yani değer olarak girdik.
Geldik en muhteşem ve en belalı metodumuza, login yani oturum aç metodu:
Burada farklı olan iki şey var. Birincisi login işleminde gelen parola bilgisini md5() metodu ile şifreledik. Ve gelen veriyi daha önceden yine md5 ile kaydettiğimiz için o bilgiyle karşılaştırdık ki, hacker abilerimiz veritabanımıza girseler de parolalarımız çalamasınlar. Tabii ki bu yöntem de 100% güvenli değil. Bunlara da güvenlik konusunu incelediğimizde gireriz. Ancak şu an için bu kadar güvenlik yeterli.
Login metodunun görüntüsü her sistemde olduğu gibi bir oturum açma sayfası olan form:
Oturum açtıktan sonra da karşımıza gelen sayfa:
Dikkat ettiyseniz, işlemden sonra işlemin sonucunu bir mesajla görüntülüyoruz. Bunları login metodunun içindeki return dizisinin içindeki mesaj verisiyle hallettik.
Oturumu kapatmak için session değişkenini sileceğiz. Bunu da değişkenleri hafızadan silen unset() metoduyla halledeceğiz. Bir görünüm render etmesine gerek yok:
Bu da anasayfaya dönerken “Sistemden çıktınız” mesajını gösterecek.
Son metodumuz kullanıcıları silen metod:
Bu metodun da sistemdeki diğer silme metodlarından farkı yok. Bu metoda, sistemde eğer kullanıcı kalmadıysa, silmeyi önlemek için return false işlemi konabilir. Ancak bunu size bırakıyorum.
Kullanıcı metodlarını bitirdikten sonra gelelim bu metodları App.php sınıfında, yani uygulamamızın ana sınıfında nasıl kullandığımızda. App sınıfında yaptığımız iki önemli değişiklik var. Birincisi, mesajları sisteme nasıl göndereceğimiz. Bunu www dizini içindeki admin.php ve public.php şemalarının içinde mesaj değişkeni tanımlandıysa göstereceğimiz kod parçasını $content değişkeninden hemen önce ekliyoruz:
public.php de ve admin.php içinde de aynı kodu kullandık.
App.php yani uygulama sınıfındaki değişikliklere gelelim. Burasını dikkatle takip etmeniz gerekebilir.
Hesaplama yani calculate metodu içinde yaptığımız en önemli değişiklik eğer herhangi bir metoddan sadece false yani hata değeri döndüyse, kullanıcıları doğrudan login sayfasına yönlendirmek. Ayrıca mesaj verisini de burada render metodlarımızın içine yedirdik. Bir başka değişiklik ise renderFile değişkeni. Bu değişken sayesinde eğer bir metodun farklı bir değişkenin görünümünü kullanmasını istiyorsak, metodun döndürdüğü dizi içinde bunu renderFile değişkeni ile tanımlıyoruz. Bu değişkeni daha çok settings yani ayarlar sınıfında tanımladık.
Son olarak, şu anda index.php yani kullanıcının ilk girdiği dosyada her giren kullanıcı için bir oturum bilgisi tanımlanmıyor. Bunu da session_start() metodu ile hallediyoruz:
Oturum açma ile işlemlerimiz şimdilik bu kadar. Zor bir bölüm olduğunu kabul ediyorum. Ancak tek tek adım adım giderseniz, anlamak ve uygulamak gayet basit.
Bir sonraki yazıda ayarlar sınıfımızı tanımlayacağız.
Dayanışmayla.