Çarşamba, 25 Ağustos 2010

Arama Sonuçlarının Sayfalara Bölünmesi

 

Kullanıcının yaptığı aramalarda bulduğu sonuçların listelenmesi, genellikle sayfa tasarımını bozması nedeniyle yaşadığımız bir sorundur. Sonuçların sayısı arttıkça, sonuç ekranının buna uygun olarak sayfalara bölünmesi gereklidir. Bu yazımda CodeIgniter ile arama sonuçlarının nasıl sayfalara bölüneceğinden bahsedeceğim.

Ancak yazının kolay takibi açısından, çok fazla detaya girmeden dikkat edilmesi gereken önemli noktalara dikkatinizi çekeceğim. Diğer ayrıntılar için ise çalışan uygulamayı indirmeniz için sayfanın sonunda link vereceğim.

Arama formunda kullanıcının gireceği değişkenin adının key olduğunu kabul edelim. $key değişkenimiz form üzerinden alınacağı için "post" yöntemi ile çekilmesi gereklidir. Ancak aynı zamanda, sonuçlar sayfalandığında bu değişken diğer sayfalara adres satırı üzerinden aktarılacağı için "get" yöntemi ile de çekilmesi gereklidir. Bu nedenle yazacağımız controller dosyamızda $key değişkeninin her iki yöntem ile de kontrolü gereklidir.

Application/controllers dizini altına kayıtlı search.php dosyamızın içinde form ile birlikte çalışan go metodu aşağıda tanımlıdır. Buna göre önce form_validation kütüphanesi ile post işlemi kullanarak kontrol ettiğimiz key değişkeni boş olsa dahi, bir de get işlemi ile kontrol ediyor, eğer bilgi girilmişse arama işlemine geçiyoruz.

 function go()
 {
 
  $this->form_validation->set_rules('key',  'Arama kriteri', 'trim|required|xss_clean|min_length[3]');
  
  $this->form_validation->set_message('required',  '%s değerini girmelisiniz.');
  $this->form_validation->set_error_delimiters('<div class="fail">', '</div>');  

  if ($this->form_validation->run() === FALSE)
  {
   if($this->input->get('key'))
   {
    $this->key = mysql_real_escape_string($this->input->get('key',TRUE));
    if(!$this->input->get('page')) $this->page = 0;
    else $this->page = (int) $this->input->get('page', TRUE);
    
    $this->_get_result();
   }
   else
   {
    $this->session->set_flashdata('msg', $this->form_validation->_error_array);
    redirect('search/'); 
   }
   
  }
  else
  {
    $this->key = mysql_real_escape_string($this->input->post('key',TRUE));
    $this->page = 0;
        
    $this->_get_result();  
  }
 
 
 }
 

Kullanıcının girdiği key değişkeni yanında, sayfalamak amacıyla kullandığımız page değişkenini ise sadece get yöntemi ile adres satırından çekiyoruz. Eğer kullanıcının arama yaptığı ilk girişi ise page değerini sıfır alıyoruz. Bu metod içinde kullandığım değişkenlerin kontrolü ve temizlenmesine ilişkin buradaki yazımı okuyabilirsiniz.

Search.php isimli controller dosyamız içinde bulunan diğer bir özel metod ise _get_result() metodudur. Bu metod ile key ve page değişkenleri Model dosyası içindeki get_result() fonksiyonuna gönderilir. Fonskiyondan gelen bilgiler sayfalama fonksiyonlarında kullanılarak view dosyasına gönderilir.

 function _get_result()
 {
  
  if($this->Model->get_result($this->key,$this->page) === FALSE)
  {
   $this->session->set_flashdata('msg', 'Aradığınız kriterlere uygun bir sonuç bulunamadı.');
   redirect('search/');
  }
  else
  {
   
   $data['final']= $this->Model->get_result($this->key,$this->page);   
   $data['page_no'] = $this->page;
   $data['final']['pagination'] = $this->config_pagination($data['final']['total']);

   $this->load->view('search_result_view',$data);     
   
  }
 
 }

Model dosyasına geldiğimizde önce veritabanımız konusunda biraz bilgi vereyim. Deneme isimli veritabanımızda iki kolonlu ve "icerik" isimli bir tablomuz olduğunu düşünelim. Biri "id" ismi ile tanımlı sıra numarası, diğeri "metin" ismi ile tanımlı ve içeriğin bulunduğu iki kolonu olsun. Yazacağımız model fonksiyonundaki sorgu, metin kolonu içinde kullanıcının key isimli değişkenini arasın.

Application/models dizini altında bulunan search_model.php isimli dosyamızda bulunan get_result() fonksiyonunun içeriği aşağıdadır:

 function get_result($key, $page="0")
 {
  $query = $this->db->query("
   SELECT SQL_CALC_FOUND_ROWS i.id, i.metin
   FROM icerik i
   WHERE i.metin LIKE '%$key%'
   LIMIT $page,5
  ");

  $nums = $this->db->query('SELECT FOUND_ROWS() as total');

  
  if($query->num_rows() > 0)
  {
   $result = array(
    'result' => $query->result_array(),
    'total' =>  $nums->row()->total
   );
   return $result;
  }
  else return FALSE;
 }


Yukarıdaki fonksiyonda key değişkenimizi metin kolonu içinde aratıp bulduğumuz sonuçları ve sonuç sayısını Search.php isimli controller dosyamıza geri döndürüyoruz. Bu yöntem, Şakir Şensoy`un blogunda anlattığı MySQL komutlarına göre uygulanmıştır.

Sonuçların listelenmesi kısmında ise application/views dizini altına kaydettiğimiz search_result_view.php dosyasına aşağıdaki kodları ekliyoruz.

<?php if(isset($final)) 
  {
?> 
 
 <p><?php echo $final['total'] ?> adet sonuç bulundu.</p>

 
<?php $i = $page_no + 1; ?>

<?php foreach($final['result'] as $row): ?>

   <p><?php echo $i?>. <?php echo $row['metin']?></p>

<?php $i++;?>   
<?php endforeach;?>
 </div>

        <!-- The pagination -->
  <?php echo $final['pagination']?>
        <!-- Pagination end -->

<?php   } ?>

$final isimli dizinin varlığı bize arama sonucunun döndüğünü göstermektedir. $page_no değişkeni çevrim değişkeni olarak kullandığımız $i değişkeninin başlangıç değeri olduğundan sonuçları numaralamak için de kullanabiliriz. $final['result'] isimli dizi bize sonuçları listelerken, $final['pagination'] isimli dizi ise sayfanın en altındaki sayfa numaralarını yazdırır.

Sayfa numaralandırma konusunu daha önce burada anlattığım için o konuya tekrar girmiyorum. Ancak konuya uygun olarak base_url ve per_page değişkenlerinde düzenlemeler yaptım. Bu uygulamanın kodları ile kodlama sırasında kullandığım örnek veritabanı dosyasını buradan indirebilirsiniz.

Yorumlar

Henüz yorum gelmemiş.

Yorum Ekle