25 Nisan 2009CodeIgniter ile Ziyaretçi Defteri Yapımı
Bir süredir öylesine bakındığım bir php framework var adı Codeigniter. Türkçe olarak çatı anlamına gelmektedir. Hazır kütüphane topluluğu gibi düşünebiliriz. MVC ( model – view – controller ) yapısı ile de kullanımı ve öğrenmesi fazla zaman almıyor. Frameworkleri illa kullanmak zorunda mıyız gibi bir soru gelebilir aklınıza aslında bu tamamen kişisel bir düşüncedir bana göre. Kimi kesim evet kesinlikle kullanmak gerekli derken kimi kesim de ne gerek var diyip inline kod yazmaya devam etmektedirler. Benim fikrim ise yerine göre kullanılmalıdır. Büyük projelerde kullanmak faydalı olacaktır ve projelerinizi hızlı esnek ve güvenilir bir şekilde yazılmasını sağlayacaktır.
Tutup da bir ziyaretçi defteri için framework kullanmanın anlamı her ne kadar yok desem de bu yazı da ne yazıkki ziyaretçi defteri yapımını anlatacağım. Aslında bu örnek codeigniter da nasıl veri alınır kontrol edilir kaydedilir ve gösterilir üzerine basit ve sade bir örnek. MVC linkini umarım açıp okumuşsunuz eğer okumadıysanız kısaca bende bahsetmek istiyorum.
M (model) V (view) C (controller) = MVC
Peki nedir bu model view ve controller ?
Model verilerin işlendiği kısımdır. Yani controllerden gelen istekler doğrultusunda iş yapar. Örneğin formdan gelen bir veriyi veritabanına işler veya çağırı.
View kısmı ise sadece controller tarafından kendisine sunulan verileri ziyaretçiye göstermekle yükümlüdür.
Controller ise view ve model arasında köprü kurmuş vaziyettedir. View den gelen bilgileri alır işler ve model veya tekrar view e sunar ya da sadece model e sunup model den dönen bilgiye göre tekrar view e geri döner.
Yani kısaca;
resimdeki gibidir mvc.
Lafı daha fazla uzatmadan verilerimizi işleyeceğimiz controller dosyamızı yazalım:
< ?php class Zd extends Controller { private $sorgu; private $satir; private $islem; private $data = array(); public function __construct() { parent::Controller(); $this->load->model('defter'); } public function index() { $this->data = $this->sayfalama(); $this->load->view('zd',$this->data); } public function mesajEkle() { // Form Kontrol $this->form_validation->set_rules('ad_soyad','Ad ve Soyad','required'); $this->form_validation->set_rules('mesaj','Mesaj','required'); if ($this->form_validation->run() == FALSE) { $this->data = $this->sayfalama(); $this->load->view('zd',$this->data); } else { $this->islem = $this->defter->mesajEkle( array( 'ad_soyad' => strip_tags($this->input->post('ad_soyad')), 'email' => strip_tags($this->input->post('email')), 'web' => strip_tags($this->input->post('web')), 'mesaj' => $this->input->post('mesaj'), 'ip' => $_SERVER['REMOTE_ADDR'], 'tarih' => time() ) ); if ($this->islem == TRUE) { redirect(site_url()); } else { $data['hataMesaji'] = 'Mesaj Eklenemedi. Yeniden Deneyiniz.'; $this->load->view('zd',$data); } } } private function sayfalama() { if (isset($_GET['sayfa'])) $sayfa = intval($_GET['sayfa']); else $sayfa = 0; $config['base_url'] = "?"; $config['query_string_segment'] = "sayfa"; $config['total_rows'] = $this->defter->toplamKayitSayisi(); $config['per_page'] = 5; $this->data['mesajlar'] = $this->defter->mesajGetir($sayfa); $this->pagination->initialize($config); $this->data['sayfa'] = $this->pagination->create_links(); return $this->data; } } ?>
Şimdi ise model dosyamızı yazalım:
< ?php class Defter extends Model { private $query; private $rows; public function __construct() { parent::Model(); } public function mesajEkle($o) { return $this->db->insert('defter',$o); } public function tumMesajlar() { return $this->db->get('defter'); } public function toplamKayitSayisi() { $this->query = $this->db->get('defter'); $this->rows = $this->query->num_rows(); return $this->rows; } public function mesajGetir($sayfa) { return $this->query = $this->db->query(" SELECT * FROM defter ORDER BY id DESC LIMIT ".$sayfa.",5 "); } } ?>
Son olarak view dosyamızı yazalım:
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta name="author" content="Raiden" /> <title>Ziyaretçi Defteri v1.0 - http://ysfkc.com</title> <link href="<?=site_url('css/reset.css')?>" rel="stylesheet" type="text/css" /> </link><link href="<?=site_url('css/style.css')?>" rel="stylesheet" type="text/css" /> </link><link href="<?=site_url('css/jquery.wysiwyg.css')?>" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="<?=site_url('js/jquery.js')?>"></script> <script type="text/javascript" src="<?=site_url('js/jquery.wysiwyg.js')?>"></script> <script type="text/javascript"> $(document).ready(function() { $('#mesaj').wysiwyg(); }); </script> </link></head> <body> <div class="govde"> < ?php foreach ($mesajlar->result_array() AS $rows): ?> <div class="ziyaretci_alani"> <p class="belirtec">< ?=$rows['ad_soyad']?></p> <div class="ziyaretci_mesaji"> < ?=$rows['mesaj']?> </div> </div> < ?php endforeach; ?> <div class="sayfalama_alani"> Sayfalar: < ?php echo $sayfa; ?> </div> < ?php if (isset($hataMesaji)): ?> <div class="ikaz">< ?=$hataMesaji?></div> < ?php endif; ?> <div class="form_alani"> < ?php echo form_open('mesajEkle'); ?> <label>Ad Soyad: < ?php echo form_error('ad_soyad'); ?></label> <br /> <input type="text" name="ad_soyad" /> <br /> <br /> <label>E-mail:</label> <br /> <input type="text" name="email" /> <br /> <br /> <label>Web:</label> <br /> <input type="text" name="web" /> <br /> <br /> <label>Mesajınız: < ?php echo form_error('mesaj'); ?></label> <br /> <textarea id="mesaj" name="mesaj" rows="11" cols="69" ></textarea> <br /> <br /> <input type="submit" name="submit" value="Ekle" /> </div> <div class="footer"> Copyright © <a href="http://www.ysfkc.com" target="_blank">ysfkc.com</a> Ziyaretçi Defteri v1.0 Alt Yapı <a href="http://www.codeigniter.com" target="_blank">CodeIgniter</a> <a href="<?=site_url('proje/zd.tar.gz')?>">Download</a> </div> </div> </body> </html>
Controller dosyamızda neler yapmışız bir bakalım;
Yapılandırıcı metodumuz da ( __construct ) uygulamamızda kullanacağımız modeli bir defaya mahsus yüklüyoruz. Bu uygulamadaki modelimizin adı defterdir. İndex metodumuzda ise sayfalama metotundan dönen bilgileri alıp view dosyamıza veri aktarımını sağlıyoruz.
mesajEkle metodumuzda ise öncelikle formdan gelen verilerden hangilerinin kontrol edileceğini form validation kütüphanesini kullanarak belirtiyoruz ve ardından validation işleminin doğru veya yanlış olma koşulunu kontrol ediyoruz. Eğer koşul yanlış dönerse view dosyası yeniden çağrılıyor eğer dönmez ise modelimizdeki mesaj kayıt metoduna uygun bir şekilde aktarılıyor ve ardından bu işlemin true ya da false değerine göre işlem yapılıyor.
sayfalama metodumuzda ise yine ci ye ait olan pagenition kütüphanesinden yararlanılarak model alınan tüm mesajlar sayfalama yapılmak üzere hazırlanıyor.
Model dosyamızda neler yapmışız bir bakalım;
Model dosyamızda ise controllerden bize gelecek verilere göre sql sorguları yapıp yine contoller dosyamıza bilgi dönüşü yaptırmışız.
Views dosyamızda neler yapmışız bir bakalım;
Bu dosyada ise artık gerekli işlemlerin yapılarak views in kullanıcılara sunacağı verileri aktarılmış ve views de bunları alıp işleyerek uygun bir formatta kullanıcıya göstermiştir.
Örneğimizin çalışması için veritabanı bağlantısını system/application/config/database.php den yapabilirsiniz.
Son olarak codeigniter user manualine buradan bakabilirsiniz.



Güzel ve açıklayıcı bir yazı olmuş Yusuf, tebrik ederim. Kodları da paylaşman konuya yeni başlayacak arkadaşlar için yararlı olacaktır.
Şimdi fark ettiğim bir konu var: kullanıcıdan isim ve mesaj çekilirken en azından xss_clean kuralını kontrol ettirmemiz gerekir. Yani,
// Form Kontrol
$this->form_validation->set_rules(‘ad_soyad’,'Ad ve Soyad’,'required’);
$this->form_validation->set_rules(‘mesaj’,'Mesaj’,'required’);
olarak yazdığın satırları:
// Form Kontrol
$this->form_validation->set_rules(‘ad_soyad’,'Ad ve Soyad’,'trim|required|xss_clean’);
$this->form_validation->set_rules(‘mesaj’,'Mesaj’,'required|xss_clean’);
olarak düzeltmekte fayda vardır.
@Fatih ‘cim
XSS Filteri configden default olarak true yaptığım için xss_clean kontrol etmedim.
Slm elinize sağlık üstadlar xss_clean kuralı ne oluyor ilk defa duydum ayrıca bu ziyaretci defterini ajaxla nasıl yapabilirdik birde böyle örnek hazırlasanız mükemmel olurdu…
Teşekkürler
@husonet
xss_clean kuralı codeigniter frameworküne özgü bir kural. bunu aktif ettiğiniz zaman sitenize zararlı html kod (meta,script vs.) injeckte edilmesini önlersiniz..
Ayrıca şuanki ziyaretçi defteri zaten ajaxla çalışmakta.
Selam
Modülde <? tagından sonra
if (!defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
eklemen iyi olacaktır.
@Ramazan Uluçay
Öncelikle teşekkür ederim. Lakin CI ‘da sadece yazılan librarylere ekleyin diye yazıyor.. Bunun ne gibi bir faydası olacağınıda yazarsanız model de sevinirim.
Merhaba @Raiden
Öncelikle bunu yazmamızın amacını sizinde bildiğiniz gibi dışardan dosyaya doğrudan erişimi engellemek. Bu kapsamda bakıldığında librarylere dışardan erişim engellenmesi gerektiği kadar, modellerede dışardan erişimi engellemek gerekiyor düşüncesindeyim. Aşağıdaki örnekte bulunan modelde bahsetmiş olduğum gibi ekleme yapılmıştır.
http://codeigniter.com/wiki/OOCalendar/
Arkadaşlar birde model sayfaların başına güvenlik olarak koyduğumuz bir satırlık kod var dı o neydi.
Ve ayrıca bize acil codeigniter formu lazım….
Selam @Hüseyin, aşağıdaki kodu diyorsun galiba.
<?if (!defined(’BASEPATH’)) exit(’No direct script access allowed’);
ekledim ama bi hata yaptım galiba codeigniterda yeniyimde pagination ve form_open fonksiyonlarında hata veriyor.
neden olabilir acaba
Buldum Nedenini helperlar ve libraryleri autoload etmediğim için miş Çok teşekkürler
” public function mesajEkle($o)
{
return $this->db->insert(‘defter’,$o);
}
”
$o değişkenin var olup olmadığını kendisimi kontrol ediyor, olmadığı durumlarda ne yapıyor ?
Teşekkürler
@Alonon
$o değişkenini controllerdan alıyor dolayısıyla controllerdan gönderiliyor modele
Şöyle diyeyim o zaman, benim elimde bir fonksiyon var.O fonksiyonun aldığı parametrenin boş olup olmadığını kontrol etmeme gerek var mı ? Eğer yoksa exception’ı nasıl kontrol edebilirim ?
@ALonon
Herhangi bir fonksiyon için soruyorsanız eğer tabiki kontrol etmek gerekir. Sonuç itibari ile fonksiyonun işlevini yapabilmesi için parametre gerekmektedir.
Ufak bir örnek
Gibi Exceptionları yakalayabilirsiniz..
Hem bu güzel yazı, cevaplarınız için teşekkür ederim, iyi çalışmalar.
Diyecek bişey yok
eline sağlık yusuf . Framework kullanmayı sevmesemde , akıllı olup bazı işlerde framework desteği almak daha mantıklı geliyor
CI ile yapılan bu örnek bana çok karışık geldi. Nedeni ne olabilir? MVC yapısını iyi anlayamadığımdan mı yoksa sınıflarla çalışma konusunda eksik olduğumdan mı?
Hocam tebrik ederim.Siteniz çok güzel olmuş.Hayırlı olsun.
çok güzel bir site, herkese çok teşekkürler.
daha fazla CI örneği istiyoruz! heh
view’da; ile açılan form tag’ı sonda kapatmayı unutmuşun bu arada…
Yazılarınızı uzun zamandır takip ediyorum çok faydalılar. Bende CI ya yeni başlayanlardanım ama sizin örneğinizi inceledikten sonra aklımdaki soru işaretleri bir bir çözülmeye başladı. Yazılarınız için çok teşekkür ederim. Başarılarınızın devamını dilerim.
MVC yapısı gerçekten çok yararlı. Bende deneme olsun diye bir blog kodluyorum, 1 hafta ara veriyorum tekrar kodlara dönüyorum her şey yerli yerinde. spagetti kod yazınca 1 gün sonra bile unutuyorum ne yapmak istediğimi
Çok faydalı olmuş saolsın kardeş…
güzel çalışma ellerine sağlık
teşekkürler ellerinize sağlık güzel anlatım
selam elinize sağlık bilgileriniz için teşekürler
Elinize sağlık. Sade ve anlaşılır bir anlatım olmuş