Cumartesi, 13 Haziran 2009

Controller İçinden Controller Çağırmak

 

CodeIgniter`da biraz ilerleyen her kullanıcı, yazdığı kodları tekrar tekrar yazmadan diğer Controller`larda kullanmak ister. Bunu yapmak için hamle yaptığında Controller içinden, çalıştırmak istediği fonksiyonun bulunduğu Controller çağırma gereği duyar. Ancak sorun burada başlar.

CodeIgniter Controller içinden Controller çağırmanızı önermez. Çünkü MVC kullanımında her amaç için bir Controller yazma ya da amaçlarına göre gruplanmış Controller dosyaları yaratmak elzemdir. Bu nedenle Controller dosyalarını birbiri içinde çağırmak karışıklığa sebep olabileceği gibi kodların yavaş çalışmasına, gereksiz hafıza kullanımına sebep olabilir.

Bu noktada çözüm Library (kütüphane) kullanmaktır. Kendinize özel bir kütüphane yazarak, ihtiyacınız olduğu yerlerde bu kütüphaneyi yüklemenizin ardından ilgili metodu o Controller içinde çalıştırabilirsiniz. Ayrıca bir Helper yazarak (ya da yazmadan da oluyor) View dosyaları içinden de çağırabilirsiniz.

Örneğin veritabanından DATE formatında çektiğimiz tarih değerini türkçe tarihe çevirecek bir fonksiyona ihtiyacımız olsun. Önce application/libraries dizini altına my_lib.php isimli kendi kütüphane dosyamızı açıyoruz. Aşağıdaki kodları yazıyoruz.

if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_lib
{

  
    var $CI;
    
    function MY_lib()
    {
        $this->CI =& get_instance();
  log_message('debug', 'Private libraray class initialized.');

    }

 function tr_tarih($array) {
 
  $tarih = split('::',$array);
  
  $this->ay=array (
   'January' => 'Ocak',
   'February' => 'Şubat',
   'March' => 'Mart',
   'April' => 'Nisan',
   'May' => 'Mayıs',
   'June' => 'Haziran',
   'July' => ' Temmuz',
   'August' => 'Ağustos',
   'September' => 'Eylül',
   'October' => 'Ekim',
   'November' => 'Kasım',
   'December' => 'Aralık'
   ) ;
   
  $this->gun=array (
   'Sunday' => 'Pazar',
   'Monday' => 'Pazartesi',
   'Tuesday' => 'Salı',
   'Wednesday' => 'Çarşamba',
   'Thursday' => 'Perşembe',
   'Friday' => 'Cuma',
   'Saturday' => 'Cumartesi'
  );
 
  return $this->gun[$tarih[0]].", ".$tarih[1]." ".$this->ay[$tarih[2]]." ".$tarih[3]; 

 }
}

MY_lib kütüphanesindeki tr_tarih fonksiyonunu Controller dosyasında çalıştırmak istersek, öncelikle kütüphanemizi yüklemeliyiz. Daha sonra ise kütüphane ismi ile fonksiyonu çağırabiliriz. Aşağıdaki Controller dosyasının adı Post.php, yeri ise application/controller dizini altıdır.

class Post extends Controller {

 function Post()
 {
  parent::Controller();
  $this->load->library('MY_lib');    
 }
 
 function index()
 { 
  $data['tarih'] = $this->MY_lib->tr_tarih(array(0 => 'Monday::23::June::2009'));
  $this->load->view->('tarih_view',$data);
 }
}

Yukarıdaki kod anlaşılmasının kolay olması amacı ile kısa tutuldu, veritabanından tarih çekmek yerine sabir bir tarih girildi. Kullanıcılar bunu geliştirebilir. Bu kodun yazı açısından dikkat edilmesi gerekli noktası : $this->MY_lib->tr_tarih satırıdır. Burada, MY_lib kütüphanesinden tr_tarih fonksiyonu çağrılmaktadır. Dönen tarih değerini de View dosyasına aktarmaktadır.

MY_lib kütüphanesindeki tr_tarih fonksiyonu View dosyası içinde direkt çağırmak istersek yine aynı satırı yazabiliriz. $this->MY_lib->tr_tarih ile başlayan satır aynı şekilde çalışır. Ancak kütüphane eklerinden kurtulmak istersek aşağıdaki Helper dosyasını yazmamız gerekir. Bu dosyanın adı my_lib_helper.php, yeri ise application/helper dizini altıdır.

if (!defined('BASEPATH')) exit('No direct script access allowed.');

function tr_tarih($field = '',$type) {
 $CI =& get_instance();
 return $CI->my_lib->tr_tarih($field);
}

Bu dosyadan sonra eğer View içinden tr_tarih fonksiyonunu çağıracaksak $tr_tarih(array(0 => 'Monday::23::June::2009'); dememiz yeterli olacaktır.

Yorumlar

Elinize sağlık güzel paylaşım, bu yazı ile wordpressin temalarının çalışma yapısını anladım. Teşekkürler

Yorum Ekle