Pazar, 25 Temmuz 2010

CodeIgniter.gen.tr Iki Yaşında

 

CodeIgniter.gen.tr artık iki yaşına girdi! Sitenin ilk yayına başladığı gün olan 24 Temmuz 2008 yılından bugüne kadar geçen iki yılın çok hızlı geçtiğinin farkına varmak bir yandan insanı üzse de, sizlerden gelen destek mesajları insanı sevindiriyor.

Sitedeki yazılar bugüne kadar, "içerik olsun" kaygısı ile yazılmadı. Bir çok yazı, birebir yaşalanılan sorunlara getirdiğim çözümleri diğer kullanıcılarla paylaşmak amacıyla hazırlandı. Bu nedenle aynı sorunlarla karşılaşan pek çok kullanıcı için işe yarar bir kütüphanenin oluşmasına önem verildi.

İkinci yıl süresince 39 adet makale yayımlandı. Bu makalelere 57 farklı kullanıcı tarafından 163 yorum eklendi. Bu makalelerin 6 tanesi uygulama içermektedir. Bir çoğunda da kodlar kullanıcılarla paylaşıldı. Amaç bir yılda 52 makale yayımlamak olmasına karşın, bu hedef yakalanamadı; ancak geçen sene ile aynı sayıda yazı yayınlandığı için de geriye düşülmedi. Geçen yıl süresince okurlardan gelen yorum sayısında iki kat artış olması daha cesaret verici bir gelişme oldu.

CodeIgniter geçen yıl süresince sadece 1.7.2. versiyonu ile bu versiyona ait güvenlik yaması çıkarttı. CodeIgniter kendisine getirilen "PHP5 tabanlı olmaması" şikayetlerini dikkate almış olmalı ki, PHP4 desteğini kestiği 2.0 versiyonunun çıkacağını duyurdu. Henüz resmi olarak yayımlanmasa da kullanıcıların erişip inceleyebileceği ve kullanabileceği BitBucket üzerinde tutulan yeni versiyon, diğer PHP çatıları ile arasındaki PHP5 tabanı farkını ortadan kaldırıyor. CodeIgniter`ın bu sene içinde 2.0 versiyonuna resmen geçeceği tahmin ediliyor.

Uzun ve emek dolu bir uğraş olan CodeIgniter Yardım sayfalarının türkçeye çevrilmesi süresince katkıda bulunan Kervan ASLAN arkadaşımız başta olmak üzere, katkı dolu mesajları ile siz kullanıcılara verdikleri destek için teşekkür ederim.

Önümüzdeki yıllarda da katkısını esirgemeyen siz destekçilerimizle birlikte nice yıllara!

Çarşamba, 14 Temmuz 2010

CodeIgniter 1.7.2. Güvenlik Yaması

 

CodeIgniter 1.7.2. versiyonunda kullanılmak üzere güvenlik yaması yayımladı. Olası bir güvenlik açığını önlemek amacıyla, kurulumuzu buradaki düzeltilmiş sürüm ile yeniden yapabileceğiniz gibi, sadece yama dosyasını indirip eskisinin üzerine yükleyerek de (system/libraries/Upload.php) yapabilirsiniz.

Dosya yükleme sınıfında (Upload.php) dosya adının uzantıya gerek olmadan değiştirilmesine izin verilmesiyle ortaya çıkan bu açık, yeni yama ile birlikte kapatılmıştır. Önceki sürümlerde dosya adı değiştirilirken uzantısı bildirilmesine gerek yokken, yeni sürümde uzantının da bildirilmesi gerekli hale getirilmiştir. Yama ile birlikte, dosya adı ve uzantısı alınırken, kullanıcının tarayıcısı ile de doğrulama yapılmaktadır.

Uygulamalarınızda Upload sınıfındaki "file_name" değişkeninin üzerine yeni dosya adını yazdırıyorsanız, yeni duruma göre uygulamanızı düzeltiniz.

Eğer CodeIgniter`ı BitBucket üzerinden kullanıyorsanız, son halini çektiğinizden emin olunuz.

CodeIgniter, bulduğu açığı kendisine rapor etmesi nedeniyle alexaholic isimli kullanıcısına teşekkür eder. Güvenlik, daima ürünlerinde en önemli önceliğe sahiptir bu nedenle bulduğunuz güvenlik eksiklerini doğrudan CodeIgniter ekibine bildiriniz.

Yazının orijinaline buradan erişebilirsiniz.

Perşembe, 1 Temmuz 2010

CodeIgniter ile Otomatik Tamamlama Uygulaması

 

Kullanıcı girişinin yapıldığı bazı formlarda veritabanı üzerinden okunan bilgilerin eşzamanlı olarak çağrıldığı otomatik tamamlama özelliği bir çok sitede görülür. JQuery için yazılmış autocomplete scripti kullanılarak bu özelliğin CodeIgniter`a nasıl uygulabileceğimizi bu yazıda anlatacağım.

Öncelikle veritabanımızda customers isimli bir tablomuz olduğunu ve bu tablodaki username isimli bir verimizin bulunduğunu düşünelim. Amacımız, kullanıcımızdan bir form içindeki input kutusuna yazmaya başladığında yazdığı harflere göre veritabanına kayıtlı olan müşterilerimin isimlerini alt alta sıralamak olsun.

Öncelikle bassistance.de adresinde yayımlanan autocomplete scriptini indiriyoruz. Bu script JQuery 1.2.6+ versiyonlarını desteklemektedir. Bu dosyalarımızı .htaccess dosyamız ile yönlendirme dışına bıraktığımız kök dizini altındaki js dizinimize kayıt ediyoruz.

Otomatik tamamlama özelliğinin CodeIgniter`a uygulamasında kullanılmak üzere önce formun yer aldığı bir View dosyası hazırlayalım. Bu dosya javascript kodlarını içeren özellikte olmalı, kullanıcımızın input kutusuna yazmasıyla ekrana veritabanından bilgi listelemelidir. View dosyamızı application/views/autocomp-ajax_view.php ismi ile kayıt ediyoruz.

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Otomatik Tamamlama Uygulamasi | CodeIgniter.gen.tr</title>
<!-- LOAD JQUERY -->
<script type="text/javascript" src="<?php echo base_url()?>assets/js/jquery.1.3.2.js"></script>
<script type='text/javascript' src='<?php echo base_url()?>assets/js/jquery.autocomplete.pack.js'></script> 
<link rel='stylesheet' type='text/css' href='<?php echo base_url()?>assets/css/jquery.autocomplete.css' /> 

<script language="javascript">
$(document).ready(function() { 
    $('#username').autocomplete(
 '<?php echo base_url()?>/autocomp/ajax_custom_check/',
 {
        minChars:1,
        delay:400,
        cacheLength:100,
        matchContains:true,
        max:10,
        formatItem:function(item, index, total, query){
            return item.username;
        },
        formatMatch:function(item){
            return item.username;
        },
        formatResult:function(item){
            return item.username;
        },
        dataType:'json',
        parse:function(data) {
   return $.map(data, function(item) {
    return {
     data: item,
       value: item.username,
       result: item.username
    }
   });
  }
 });
});
</script>


<style type="text/css">
.form
{
}
.form span
{
 float: left;
 width: 200px;
 clear: both;
}
.form .normal
{
 width: 120px;
 float: none;
}
.form .short
{
 width: 50px;
}
.form input, .form select, .form textarea
{
 margin-top: 2px;
 margin-bottom: 2px;
}
blockquote
{
 background:#e7e7e7;
 color:red;
}

td {
 height:35px;
 font-size:12px;
 font-weight:bold;
}

</style>
</head>
<body>

  <?=$this->error->error_view()?>

 <h1>Veritabanından Bilgi Çekme Formu</h1>
 
 <form action="<?=base_url()?>autocomp" method="post">

  
  <div class="form"> 
    <span>Kullanıcı Adı ve Soyadı :</span>
     <input type="text" name="username" size="50" id="username"/><br />
       
    <input type="submit" name="add"  class="submitbutton" value="GONDER">

  </div>
 </form>  
 <p>Bu uygulama <a href="http://www.codeigniter.gen.tr">CodeIgniter.gen.tr</a> adresinden alınmıştır.</p>
</body>
</html>

Yukarıda kodları verilmiş view dosyamızda bulunan javascript kodu, username id değeri ile tanımlı input kutusuna bilgi girildiğinde autocomp isimli controller dosyasındaki ajax_custom_check metodunu çalıştıran ve oradan gelen username isimli veriyi yine username isimli kutuya yazdıran bir scripttir.

Uygulamanın ikinci adımı ise javascript tarafınan çalıştıran autocomp isimli controller dosyamızın hazırlanmasıdır. Application/controllers dizini altına kayıtlı autocomp.php isimli dosyamızın içeriği şöyle olacaktır:

class Autocomp extends Controller {

 function Autocomp()
 {
  parent::Controller();
  $this->load->library(array('session','error'));
 }
 
 function index()
 {
  $this->session->keep_flashdata('msg');
  $this->load->view('autocomp-form_view');
 }

 function ajax_custom_check()
 {
 
  $this->load->model('autocomp_model','Model');
  
   $where = 'username LIKE "'.mysql_real_escape_string($this->input->get("q",TRUE)).'%"';
  
  $data['arr'] = $this->Model->get_username($where);
  
  $this->load->view('autocomp-ajax_view',$data);

 }
}

Controller dosyamızda autocomplete isimli javascript dosyası çalıştırılınca oluşan q isimli değişken, XSS temizliği yapıldıktan sonra alınarak, model dosyasında çalıştırılmak üzere bir sorgu cümlesinin, sadece kullanıcının girdiği harfler ile başlayan username değerini bulmak üzere hazırlanmış where kısmı oluşturulmaktadır. Daha sonra autocomp_model isimli dosyada bulunan get_username fonksiyonu yardımıyla çekilen bilgiler, autocomp-ajax_view.php isimli view dosyasına gönderilerek ekrana bastırılır. Önce model dosyamıza bakalım:

Application/models dizini altına kayıtlı autocomp_model.php isimli model dosyamızda controller dosyasından gelen where bilgisini kullanarak veritabanından bilgi çekelim:

class Autocomp_model extends Model {

    function Autocomp_model()
    {
        parent::Model();
    }
 
 function get_username($where)
 {
  $query = $this->db->query("
   SELECT DISTINCT username
   FROM customers
   WHERE $where
  ");

  $result = $query->row();
  
  if($query->num_rows() > 0)
  {
   return $query->result_array();
  }
  
 }  
}

Controller dosyamıza geri gelen bu bilgiyi ise application/views dizini altına kayıtlı autocomp-ajax_view.php dosyamıza gönderelim. Javascript dosyası json formatında gelen bilgileri düzenlediği için, veritabanından çektiğimiz bilgileri json_encode ile yazdırıyoruz.

 echo json_encode($arr);

Bu yazıda bir form üzerinde kullanıcının bilgi girişine göre veritabanından bilgi çekerek ekrana dinamik olarak nasıl yansıtılacağını anlattım. Çalışan kodların bulunduğu uygulamaya buradaki linkten erişebilirsiniz. Uygulama üzerinde a, b ve c harflerine göre deneme bilgi girişi yapılmıştır.

Dip Not: Javascript kodu adres satırından bilgi çekmektedir. Bu nedenle application/config dizini altında bulunana config.php dosyasında uri_protocol değişkeni size uygun olan bir protokole ayarlı (benim için "PATH_INFO" uygundu) ve enable_query_strings değişkeni TRUE olmalıdır.