Bir frameworkün hayatını kurtarmak
Elim kırılsaydı da framework yazayım demeseydim. Uzunca bir süredir fonksiyonel olarak hayatta kalmaya çalışan ve oturum yönetimi, template sistemi gibi önemli avantajları bütün yaptığım sitelerde kullanabileceğim bir framework yazmaya çalışıyorum.
Cake php ya da symfony falan kullan diye bana gelmeyin. Hepsi acayip nazlı şeyler.Bi türlü oturup 300 sayfa manual okuyup bunlar nasıl çalışıyor diye anlamak istemedim. Belki oturup uğraşsam ruby on rails falan öğrenebilirdim. Aslında rails bir frameworkten ziyade bir fikirler bütünü olmuş onu anlayıp bıraktım rails öğrenmeyide. Çok sistemli çalışan programcılar neleri bir birine düzenli bağlayarak yırtarız demişler ve bulmuşlar helal olsun.
Ama kurdun ensesi hesabı bende bişeyler yazayım dedim. Ki aslında hiçbir yapıda işimi görmüyordu. Ya host alıcak, ya çok zaman ayırıcaktım falan. Şöyle yaptım bende;
Smart template sistemini bi güzel pear ile yamadım. Sonra xajax ile ajax eklemeyi denedim. Xajax meğer smarty ile pek iyi geçinemiyormuş ya da ben beceremedim. Zaten yoğun trafikli siteler yazacağımı sanmadığım için xajaxtan vazgeçtim. Vakit alıcaktı yamamak. Ama o da ne pear bu sefer güzel güzel makinemde çalışırken internetteki sunucuda yükelme gerektirdi falan fistan derken pearada yol göründü.
Geriye kaldı smarty ve benim kullandığım kullanıcı sistemi. Ama sorunlar bitmek bilmedi, çünkü template sistemi bi şekilde sabit dosyalar falan içeriyordu. Neyse onuda bi klasörleme mantığı ile hallettim. Bugünde iki ekleme yapıp formların tekrar tekrar post olmasını önlemeyi ve oturum gerektiren sayfaların güvenliğini tek fonksiyon ismiyle sağlamayı başardım. ( sanırım :) )
Formların tekrar postunu nasıl önlediğimi anlatayım. Zira işinize yarayabilir. Çünkü galiba geçerli ve işe yarar bir çözüm.
Form kaydı hata elemelerini geçip mysql’e girdikten sonra gelen verileri ve sonuçla ilgili teşekkürler falan gibi bir bilgiyi göstermek istiyoruz diyelim. Ama kaydı alan sayfada bunu yapmaya imkan yok çünkü f5 yapan kullanıcı postu yeniden gönderebilir. Bu da başımıza bela. Demeyin ki 30 saniye aralık koycam falan. Bi dolu iş. Kayıt tarihi tut her kayıt için, cookie at, olur mu olmaz mı her sunucuda session değişken ata falan. Ortalık kan revan yani.
Hatta bir ara header location yaptırıp istediğim değişkeni $_POST’a ekleyip sonra 307 argümanı ile postu yönlendireyim dedim. Tabi tarayıcı extremetracking üyeliğindeki gibi napıyo bu site postunu yönlendiriyor ey kullanıcı uyarısı verdi. Sakıncalı gelir kullanıcıya öle şeyler.
Bende şu fonksiyonu yazdım;
function sonuc($sonuc_icerik)
{
global $OturumBilgi;
// saat bilgisi alınıyor daha küçük saatli uyarilar siliniyor
$saat=date(”H”);
mysql_query(”delete from _temp where saat<’$saat’”);
// Bu session’a ait daha önceki uyarılar siliniyor…
mysql_query(”delete from _temp where session=’$OturumBilgi’”);
// Bu session ve bulunulan saatte uyarı kaydediliyor
mysql_query(”insert into _temp SET uyari=’$sonuc_icerik’,session=’$OturumBilgi’,saat=’$saat’”);
header (”Location: $HTTP_HOST/sonuc/”);
}
Burada her daim framework session tutyor zaten. Oturum bileti $OturumBilgi değişkeni. _temp tablosu ise form döntülerini kaydettiğim tablo. Sonuc fonksiyonu ile bildirim yapan sayfadan gelen datayı mysqle kaydediyoruz. Sonra o kullanıcının oturum bilgilerini bu kayda ekliyoruz. Daha evvel de eski kayıtları siliyoruz ki o an için tek kaydı olsun kullanıcının sonuc sayfasında. Sonra arada da olur ya oturum bileti almayan falan olur session şişer falan diye saat olarak kayıt tutturup bir saat önceki tüm uyarıları siliyoruz. Böylece temp tablomuz taşma ihtimali varsa da tamamen ortadan kalkıyor.
Bu şekilde işte. Çok iyi bir programcı değilseniz söylediklerimin hepsini anlamanız zor. Hatta öyle iseniz bile zor. :) Bu kadar karışık yazdığım için üzgünüm ama 15 saat uğraşıp birkaç sorununu çözdüğüm frameworküm artık yaşıyor onun sevinci :)



Bu arada ajax ile uğraşırken XAJAX son sürümünü indireyim bakayım dedim. Değişiklikler olmuş ve smarty’de xajax artık kullanılırken sorun çıkmıyor.
http://wiki.xajaxproject.org/Tips_and_Tricks:Show_Dialog
adresinden detayları öğrenebilirsiniz.