Cumartesi, 28 Mart 2009

Remap Fonksiyonu ve Kullanımı

 

CodeIgniter'ın ulaşımı, yapısı gereği site_adı/controller_adı/method_adı/degisken1/degisken2 olarak kuruludur. Ancak bazı durumlarda controller dosyası tek bir method'tan oluşabilir. Bu method index() ismini verdiğimiz varsayılan method olabileceği gibi herhangi bir isimle yazacağımız bir method da olabilir.

Bu durumda sayfaya ulaşım adresini klasik adres yolu ile gereksiz yere uzatmamak için, method_adı kısmını kaldırmak daha doğrudur. Bu işi iki yolla gerçekleştirebilir. Birincisi, MY_Router.php isimli kütüphane dosyasını yazarak bunun içinden yönlendirme; ikincisi ise, Remap fonksiyonu ile çözme.

Herkesin indirmesine izin verdiğimiz dosyalarımızın istatistiğini tutmak üzere bir controller yazdığımızı düşünelim. Site adresimiz site_adi/indir/dosya_adi olduğunu farzedelim. Daha önce de dediğimiz gibi klasik CodeIgniter site adresi site_adi/indir/method_adi/dosya_adi şeklinde olması gerekirken, bizim durumumuzda bu adreste method_adi kısmını kaldırmak daha uygun olacaktır.

Controller dosyamız ana hatları ile aşağıdaki gibidir :

class Indir extends Controller {

 function Indir()
 {
  parent::Controller();
 }
 

 function index($dosya_adi)
 {
  
  $this->load->model('Indir_model', 'Indir');

  $array = array(
    'dosya_adi' => $dosya_adi,
    'tarih' => date('Y-m-d h:i:s'),
    'ip_adresi' => $this->Indir->get_ip()
  );
  
  if($this->Indir->Indir_log($array)) redirect('assets/'.$dosya_adi);
  else redirect('error/not_found_Indir');
 }

}

Indir isimli controller çalıştırıldığında index method'una gidilecek, dosya adına göre model dosyasında bulunan Indir_log methodu çağırılarak, veritabanı içine istemin yapıldığı tarihi ve makineden gelen ip adresi eklenecektir. Eğer bir hata olursa da error isimli controller çağrılacaktır, hata yoksa "assets" dizini altında bulunan dosyayı kullanıcıya yönlendirecektir.

Buraya kadar bilindik yapı ve kodlama yapılmıştır. Ancak Indir controller'ı çağrıldığında başka gelen adres satırından başka method yerine index methodunun çağrılması ve bu dosya_adi değişkeninin alınması işlemi için, controller dosyamız içine _remap fonksiyonunu eklemek gereklidir.

 function _remap($method) {
     if ($this->uri->segment(2)) {
   $method = $this->uri->segment(2);
     }

  $this->index($method);
 }  

Bu fonksiyonda uri sınıfı yardımı ile adres satırında 2. değeri olan dosya adını $method isimli değişkene atılıp, index method'una da bu adı göndermekteyiz. Böylece adres satırında site_adi/indir/dosya_adi olarak linkin görülmesine olanak sağlanmaktadır. Controller dosyasının tam hali aşağıdadır.

class Indir extends Controller {

 function Indir()
 {
  parent::Controller();
 }
 

 function _remap($method) {
     if ($this->uri->segment(2)) {
   $method = $this->uri->segment(2);
     }

  $this->index($method);
 } 
 
 function index($dosya_adi)
 {
  
  $this->load->model('Indir_model', 'Indir');

  $array = array(
    'dosya_adi' => $dosya_adi,
    'tarih' => date('Y-m-d h:i:s'),
    'ip_adresi' => $this->Indir->get_ip()
  );
  
  if($this->Indir->Indir_log($array)) redirect('assets/'.$dosya_adi);
  else redirect('error/not_found_Indir');
 }

}

Yorumlar

Peki URL'de yer alan 2. parametreyi yeni bir controller olarak algılamasını sağlamamız mümkün mü?

Örneğin:
"site_adı/admin" adresinde admin controller'ı çalışacak ama "site_adı/admin/uyeler" adresinde "controllers/admin/uyeler.php" dosyasını controller olarak çalıştıracak. Bu mümkün müdür? Veya bunu yapmanın yolu nedir? İlla admin controller'ı içinde uyeler methodu mu tanımlamak gerekiyor? Öyleyse bu modüllerin birbirinden bağımsız çalışmasını engellemez mi?

Yine kendi sorumun cevabını buldum. Keşfetmeden sorarak burayı işgal ediyorum kusura bakmayın bari çözümü de yazayım :)

"conrollers/admin" klasörü içine de "config/routers.php" içinde ayarladığımız başlangıç controller'ı ile aynı isimde bir controller dosyası oluşturarak "site_adı/admin" adresinde bu controller'ı açtırabiliyor dolayısıyla admin içindeki modülleri de farklı controller dosyalarıyla yapabiliyoruz.

@Muhittin: İstediğin için contollers dizini altına admin diye bir klasör açacak, bunun içine uyeler.php isimli controller dosyanı ve sınıfını ekelyeceksin. geniş bilgi için Kullanım Kılavuzunu okuyabilirsin.

@Fatih: Sormak istediğim "site_adı/admin" ve "site_adı/admin/uyeler" adreslerini farklı controller dosyalarıyla yönetebilmekti. Çözümü keşfettim biraz geç oldu :)

guzel acıklamalar olmus tsk ederım

Şurada farklı bir kullanım mevcut.

Yorum Ekle