Çarşamba, 3 Mart 2010

Çoklu Dil Desteği

 

Bir çok programcı çoklu dil desteği sunan web sitesi uygulamaları ile uğraşır. En büyük sorun site kullanıcısına seçtiği dil desteği ile hizmet verebilmektir. Değişik çözümlerin olduğu bu problemi fikir vermesi açısından bir uygulama ile ele alalım.

Uygulamamız türkçe ve ingilizce olmak üzere iki farklı dil opsiyonuna sahip olsun. MVC mantığının bir avantajı da Controller dosyaları ile View dosyaları ayrılarak kod parçaları içine HTML ya da mesajların girmesini önlemektir. Böylece uygulamamızda değişik temalar kullanılması daha kolay olabileceği gibi, görünüm değiştirmek çok basit olacaktır.

Ancak formlardan gelen geçerlilik mesajları ("form validation") ya da Model dosylarından alınan hata mesajlarının ekrana iletilmesi durumunda genellikle Controler dosyları içinden View dosyalarına mesaj göndermemiz gerekebilir. Çoklu dil desteği sunan sitelerde tek Controller dosyası kullanılması durumunda bu mesajların hangi dilde yazılacağı konusu bir sıkıntıdır.

Bu sıkıntıyı aşmak için application/config dizini altına farklı dillerde (türkçe, ingilizce vs.) yazılmış kendi config dosyamızı ekliyoruz. Örneğimizde application/config/mesaj-tr.php türkçe desteği veren dosyamız, application/config/mesaj-en.php ingilizce desteği veren dosyamız olsun. mesaj-tr.php dosyamızın içeriği şöyledir:

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

$config['welcome_message'] = 'Sitemize hoş geldiniz. Burada türkçe destek veriyoruz.';

Burada "welcome_message" isimli indeks değeri bizim türkçe mesajımızı config isimli dizinde tutmamıza yardım eder. Aynı şekilde application/config/mesaj-en.php isimli dosyamızın içeriği de şöyledir:

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

$config['welcome_message'] = 'Welcome to our website. Our support is in english.';

Bu dosyaları kullanacağımız bir Controller dosyası oluşturalım. Application/controllers dizini altında bulunan multi.php isimli controller dosyamızda, kullanıcının seçtiği dil opsiyonuna göre ekrana hoşgeldin mesajımızı yazdıralım.

 

<?php

class Multi extends Controller
{

 public $dil;//user tarafından seçilen dil
 public $config_dizi;//config dizisi


 function Multi()
 {
  parent::Controller();
  
  $this->load->library('session');
  $this->load->helper('url');
  
  if($this->session->flashdata('dil')) $this->dil = $this->session->flashdata('dil');
  else $this->dil = 'tr';
 
  $this->config->load('mesaj-'.$this->dil, TRUE);
  $this->config_dizi = $this->config->item('mesaj-'.$this->dil);

 }

 function index()
 {
  redirect('multi/sec/'.$this->dil);
 } 
 
 function sec()
 {
  
  $array = array(
   'dil' => $this->uri->segment(3)
  );
 
  $this->session->set_flashdata($array);
  
  redirect('multi/sonuc');
 }
 
 
 function sonuc()
 {
 
  $data['mesaj']= $this->config_dizi['welcome_message'];
  
  $this->load->view($this->dil.'/multi_view',$data);
 }
 
}

Controller dosyamızda kullanıcının seçtiği dil opsiyonunu session kütüphanesinde tuttuğumuz için girişte session kütüphanesini yüklüyoruz. Url helper dosyasını da aynı şekilde yapısal sınıfta yüklüyoruz. Kullanıcının seçtiği dil değeri eğer session sınıfına kayıtlıysa ona uygun olan config dosyamızı (mesaj-en.php ya da mesaj-tr.php) yüklüyoruz böylece, kullanıcının isteğine uygun dil destek dosyasını ekrana yazdıracağız.

Kullanıcı sec() metodu yardımı ile istediği dil opsiyonunu seçebilir. Bunun ardından gelen sonuc() metoduyla da seçtiği dil opsiyonuna uygun olacak view dosyasını ekranında görecektir. View dosyalarını da destek verdiğimiz dil türüne göre hazırlanmış dizinler içinde tutmaya dikkat etmeliyiz. Örneğin türkçe destek veren view dosyası application/views/tr/multi_view.php olarak kayıtlıyken, ingilizce destek veen view dosyası application/views/en/multi_view.php olarak kayıtlı olmalıdır.

Controller dosyamızda kullanıcının seçtiği dil opsiyonuna göre config dosyasından aldığımız mesajı ilgili dil desteğini veren view dosyası ile ekrana bastırıyoruz. Bu uygulama çoklu dil desteğinin nasıl yapıldığına ilişkin bir fikir vermek acaıyla hazırlanmış örnek uygulamadır. Bu uygulamanın kodlarını buradan indirebilirsiniz. Çalışan örnek uygulamayı test edebilirsiniz.

Çarşamba, 27 Ocak 2010

Veritabanından Satır Çekme Fonksiyonu

 

Bazı formları kullanırken, formlardan kullanıcının göremediği id değerleri çekeriz. Bu yöntemle, tablolar arasında geçiş yapmak kolaydır. Ancak çoğu zaman, formlardan çekilen id değerlerine karşılık gelen başka değişkenleri okumak isteyebiliriz. Bu yazımda controller dosyalarının hepsinde ortak kullanabilen basit ve kullanışlı bir model fonksiyonunu anlatacağım.

Bu fonksiyon oldukça basit bir fonksiyon:

 function get_item_row($table,$column,$arr)
 {
  $query = $this->db->get_where($table,$arr);
  if($query->num_rows() > 0)
  {
   $res = $query->row();
   return $res->$column;
  }else return FALSE;
 }

get_item_row() isimli fonksiyona tablo adı, kolon adı ve WHERE bölümünde kullanılacak bir dizi gönderiyoruz. Fonksiyon bize tablonun istediğimiz kolonuna karşılık gelen değeri geri gönderiyor. Diyelim ki, users isimli bir tablomuz olsun. Formdan gizlice okuduğumuz user_id değerimiz elimizde olsun. Form çalışınca ekrana user_id değerine karşılık gelen username isimli kolondaki değer çekmek istiyorsak, controller dosyamızdan Model fonksiyonunu şöyle çağıracağız:

 $username = $this->Model->get_item_row('users', 'username', array('id' => $this->input->post('user_id'));

Genellikle formlardan gelen bilgilerin çekildiği controller dosyalarında kullanacağımız bu fonksiyon için en uygun kullanım yeri, application/libraries dizini altına oluşturacağımız MY_Model.php dosyası olacaktır.

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

class MY_model extends Model {
 
    function MY_model()
    {
        parent::Model();
    }

 function get_item_row($table,$column,$arr)
 {
  $query = $this->db->get_where($table,$arr);
  if($query->num_rows() > 0)
  {
   $res = $query->row();
   return $res->$column;
  }else return FALSE;
 }
 
}

Diğer model dosyalarımızı Model sınıfı yerine MY_Model sınıfını genişleterek (extends) oluşturursak, bu fonksiyonu her controller içinden kullanma şansımız olur.

Cuma, 1 Ocak 2010

PHP Sürümlerinde Dikkat Edilmesi Gerekenler

 

CodeIgniter 1.7.2. sürümü PHP`nin (şimdilik) son sürümü olan 5.3.0 sürümü ile uyumlu olduğunu kendi sitesinden okuduk. Çekirdek kodlarında yapılmış değişiklikleri kodları inceleyenler de takip edebilir. Ancak öyle bir hata var ki, ancak rast gelirseniz çözümü için aranıp duruyorsunuz. Bu yazıda hatayı ve en basit düzeltme yöntemindem bahsedeceğim.

Eğer kullandığınız PHP sürümü 5.3.0 ise view dosyalarında php değişkenlerini yazdırmak için eşitlik ifadesini kullanıyorsanız:

<link href="<?=base_url()?>assets/css/styles.css" rel="stylesheet" type="text/css" />
//ya da:
<?=$degisken_adi?>

PHP 5.3.0 versiyonlu kurulumda çalışmayacak ekrana boş değer geri dönecektir. Bu hatayı gidermenin yolunu uzun uzun yazmakla çözmüşler. Üstteki cümleyi aşağıdaki gibi çevirince hata gideriliyor:

<link href="<?php echo base_url()?>assets/css/styles.css" rel="stylesheet" type="text/css" />
//ya da:
<?php echo $degisken_adi?>

Bu tür tespiti zor hatalardan etkilenmemek için çalışan sistemlerin (eğer çok önemli güvenlik açıkları yoksa) yeni sürümlere yükseltilmesinden önce iki kere düşünülmesini tavsiye ederim.

@15 Ocak 2010: Gelen görüşler üzere daha önceki adı "PHP 5.3.0 Sürümündeki Hata" olarak yazdığım bu yazının adını, PHP sürümlerinde dikkat edilmesi gerekenler olarak değiştirdim.