CodeIgniter 1.7.0 versiyonundan sonra form doğrulama kütüphanesini değiştirdi. Halen eskisinin (validation kütüphanesi) ve yenisinin (form_validation kütüphanesi) birlikte kullanıldığı 1.7+ versiyonlarında, alınan hata mesajları dizi değişkenlerine aktarılır.
Yeni kütüphanenin işleyişi ve yeni fonksiyonları ile ilgili daha önce burada anlattığım özelliklerde bahsetmediğim bir konu olan hata mesajlarının derlenmesi konulu uygulamamıza bu yazıda değinmek istedim.
Form_validation kütüphanesinde hata mesajlarını $this->form_validation->_error_array fonksiyonu ile alabiliriz. Klasik metod olarak hata fonskiyonu geri dönüşünü oturum kütüphanesine atarak ekrana bastırdığımızı düşünelim. Bu uygulamamızda yeni form_validation kütüphanesinde hata mesajı dizi değişkenine alındığı için bu değeri ekrana bastırmak amacıyla kendi kütüphanemizi yazalım.
Dizi değişkenlerini ekrana bastırmak için düzenleyen kütüphanemiz application/libraries dizini altına kayıtlı error.php dosyasının içeriği aşağıdadır:
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Error
* Error flashing library
*
*
* Features:
* + To flash of stored in session
*
* Requirements:
* PHP 5.0+, CodeIgniter 1.7.0+
*
* Usage:
*
* In your controller:
* $this->load->library('error');
*
* Syntax
* $this->error->error_view(); : to show session error codes
*
* @package CodeIgniter
* @subpackage Libraries
* @category Error flashing
* @author Fatih Bazman : fatihbazman at gmail.com
* @version 1.0
* @license http://creativecommons.org/licenses/by-sa/3.0/us/
*/
class Error
{
var $CI;
function Error()
{
$this->CI =& get_instance();
log_message('debug', "Error Class Initialized");
}
function error_view()
{
if(is_array($this->CI->session->flashdata('msg')))
{
$text = '<blockquote>';
foreach($this->CI->session->flashdata('msg') as $row):
$text .= '<p>'.$row.'</p>';
endforeach;
$text .= '</blockquote>';
return $text;
}
else if($this->CI->session->flashdata('msg'))
{
$text= '<blockquote><p>';$this->CI->session->flashdata('msg')'</p></blockquote>';
return $text;
}else return FALSE;
}
}
Yukarıdaki kodlarda, Error isimli kütüphanemizi oluşturup log dosyamıza çalıştığını bildiriyoruz. Sınıfımızdaki error_view() fonksiyonu ile oturum (session) kütüphanemizde bulunan mesajların dizi olup olmadığını kontrol ederek, diziyse her bir elemanını, değilse sadece kendisini HTML kodlara uygun olarak düzenleyip geri bildiriyoruz.
Error kütüphanemizi kontrol edecek basit bir controller dosyası yazalım. Ekrana gelecek form bilgilerine kullanıcı e-posta adresini ve mesajını girdikten sonra, basit bir CAPTCHA alternatifi olan toplam değerini de girdikten sonra form kontrolü yapılsın. Buna göre application/controllers dizini altındaki yorum.php isimli dosyamızın içeriği şöyle olacaktır:
<php
class Yorum extends Controller {
function Yorum()
{
parent::Controller();
$this->load->library('form_validation');
}
function index()
{
$this->session->keep_flashdata('msg');
}
function form()
{
$this->load->view('form_view');
}
function ekle()
{
$this->load->helper('form');
$this->form_validation->set_rules('email', 'E-posta adresiniz', 'trim|required|valid_email');
$this->form_validation->set_rules('comment', 'Mesaj', 'trim|required|xss_clean');
$this->form_validation->set_rules('added', 'Toplam sonucu', 'trim|required|xss_clean|callback__verify');
$this->form_validation->set_message('required', '%s bilgisini girmelisiniz');
$this->form_validation->set_error_delimiters('<blockquote><p>', '</p></blockquote>');
if ($this->form_validation->run() == FALSE)
{
$this->session->set_flashdata('msg', $this->form_validation->_error_array);
redirect('yorum/form/');
}
else
{
$create = array(
'email' => $this->input->post('email',TRUE),
'metin' => $this->input->post('comment',TRUE)
);
//Burada model dosyanıza $create dizinini göndermelisiniz.
$this->session->set_flashdata('msg', 'Yorumunuz siteye eklendi teşekkür ederiz.');
redirect('yorum/form/');
}
}
function _verify($data)
{
$added = (((($this->input->post('added'))+795)*351)-27);
$result = $this->input->post('sonuc');
if($added != $result)
{
$this->form_validation->set_message('_verify', 'Girdiğiniz toplam sonucu yanlıştır. Lütfen tekrar deneyiniz.');
return FALSE;
}
}
}
/* End of file yorum.php */
/* Location: ./system/application/controllers/yorum.php */
Yukarıdaki yorum.php isimli controller dosyamızda, form() metodu ile ekrana bastırdığımız formdan gelen değişkenleri add() isimli metodumuzla kontrol ederek uygunsa ekrana teşekkür mesajı göndermekteyiz (konuyu dağıtmamak için model işlemlerini anlatmadım). Bu kodlarda dikkat edilecek konu, mesajları ve hata bildirim değişkenlerini $this->session->set_flashdata fonksiyonuyla ekranlara taşıdığımızdır. Her mesajın bir sonraki sayfaya aktarılması için index() metodumuzdaki $this->session->keep_flashdata('msg'); cümlesinin bulunması şarttır.
Form kullanıcısını botlardan ayırmak için kullanılan CAPTCHA sınıfı CodeIgniter ile birlikte sürüm içinde dağıtılsa da, ona alternatif olarak kullanıcıdan bir toplamın sonucunu isteme opsiyonunu bu uygulamada kullanalım. 1 ile 50 arasında rastlantısal seçilen iki sayının toplamı, botlardan korunmak amacıyla bir dizi aritmetik işlemle değiştirilerek (örneğimizde (((X+795)*351)-27)) form içinde bir sonraki adıma taşınır. Form kontrolü yapılırken _verify() geriçağrımı (callback) kullanılarak kullanıcının girdiği değer ile formdan dönen toplam eşit mi kontrolü yapılır.
Formun bulunduğu view dosyası application/views dizini altında form_view.php ismiyle kayıtlıdır. İçeriği aşağıdadır:
<?
$a = rand(1,50);
$b = rand(1,50);
$add = (((($a+$b)+795)*351)-27);
?>
<!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>Form Kontrol Uygulamasi | CodeIgniter.gen.tr</title>
<style>
.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;
}
</style>
</head>
<body>
<?=$this->error->error_view()?>
<h1>Yorum Formu</h1>
<form action="<?=base_url()?>yorum/ekle" method="post">
<input type="hidden" name="sonuc" value="<?=$add?>" />
<div class="form">
<span>E-posta adresiniz :</span>
<input type="text" name="email" size="35" /><br />
<span>Mesajınız :</span>
<textarea name="comment" cols="35" rows="10" class="textarea"></textarea><br />
<span>Sonucu giriniz: <?=$a?> + <?=$b?> =</span>
<input type="text" name="added" size="35" value=""/><br />
<input type="submit" name="add" class="submitbutton" value="GONDER">
</div>
</form>
</body>
</html>
View dosyamız içinde oturum kütüphanemizdeki mesajları yazdırmak için Error kütüphanemizi $this->error->error_view() cümlesi ile çağırdığımız satıra dikkat etmeliyiz. Böylelikle, form girişinde yaşanılan hataları Error kütüphanemizdeki error_view() isimli fonksiyon sayesinde ekrana yazdırabiliriz.
Uygulamamızı devreye almadan önce konfigürasyon dosyalarımızda yapmamız gereken değişiklikleri sıralarsak, application/config dizini altındaki autoload.php dosyamızda aşağıdaki düzeltmeleri yapmalıyız:
/*
| -------------------------------------------------------------------
| Auto-load Libraries
| -------------------------------------------------------------------
| These are the classes located in the system/libraries folder
| or in your system/application/libraries folder.
|
| Prototype:
|
| $autoload['libraries'] = array('database', 'session', 'xmlrpc');
*/
$autoload['libraries'] = array('session','error');
/*
| -------------------------------------------------------------------
| Auto-load Helper Files
| -------------------------------------------------------------------
| Prototype:
|
| $autoload['helper'] = array('url', 'file');
*/
$autoload['helper'] = array('url');
application/config dizini altındaki config.php dosyamızda aşağıdaki düzeltmeleri yapmalıyız:
$config['base_url'] = "http://site_adresimiz/";
Uygulamamızı CI_form-uygulaması.zip adı altında indirebilir, http://site_adresimiz/yorum/form yolu ile çalşıtırabilirsiniz.
Yazarı : Fatih BAZMAN | Yorum Ekle | Etiketler : 1.7+ form Uygulama
Türkiye