Hazırda çalışdığım bir layihədə tələb CodeIgniter framework-undən istifəadə etməkdir. Niyə məhz CodeIgniter sualını cavablamaq istəmirəm, çünki bu mənim seçimim deyil.

Deməli, form-a da doldurulun məlumatların yoxlanılması üçün müxtəlif şərtlər var. Hətta özəl şərtlər də əlavə etmək olur.

Mənə məhz is_unique şərti lazım idi, hansı ki, daxil edilən məlumatın cədvəldə unikallığını yoxlayırdı. Hər şey əla idi, amma gəl ki, məlumatı redakdə edərkən problemlə qarşılaşdım. Şərt cədvəldə yoxlama edərkən cari məlumatı (cədvəlin sırasını) da yoxlamadan keçirirdi və bu da təbii olaraq şərtin ödənməməsinə gətirib çıxarırdı. Koroğlu demiş, sözlə dediyimi kodla göstərim:

$this->form_validation->set_rules('name', 'Name', 'is_unique[somemodel.name]');

Bu da bazada aşağıdakı şəkildə sorğu edirdi:

SELECT * FROM somemodel WHERE name='Kamran' LIMIT 1;

Amma məlumatı redaktə edəndə bizə name='Kamran' şərtindən sonra id!=5 ( 5 şərti olaraq name=’Kamran’ olan sıranın id nömrəsidir) tipli əlavə şərt lazımdır ki, cari sıra axtarışımızda işləməsin.

Bunun həlli üçün internetdə biraz axtarış etdim, çoxunluq custom rule yaratmağı təklif edirdi, amma dediyim kimi xoşuma gəlmir bu yol, çünki məlumatı yaratdıqda bir, redaktə etdikdə başqa yoxlamalar biraz səliqəsiz görsənir (ən azından mənim üçün :) ).

Həll yolu olaraq Form Validation kitabxanasını genişləndirməyi qərara gəldim. is_unique şərti 2 parametr qəbul edir: yoxlanılan ifadə (bu parametr şərtdə set_rules tərəfindən ötürülür) və model ilə xananın adı. Ona görə də 2-ci parametrə əlavə məlumat (şərt) ötürməyi qərara gəldim:

$this->form_validation->set_rules('name', 'Name', 'is_unique[somemodel.name, id!=5]');

… və əsas məsələ kitabxananın genişlənmiş versiyası:

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

/**
 * Form validation
 * 
 * @author Kamran Ata <[email protected]>
 * @version 1.0
 */

class MY_Form_validation extends CI_Form_validation
{
    public function __construct()
    {
        parent::__construct();  
    }

    public function is_unique($str, $fields) {
    	$fields_arr = explode(',', $fields);

    	list($model, $field) = explode('.', $fields_arr[0]);
    	$where = "{$field} = '{$str}'";

    	if (array_key_exists(1, $fields_arr)) {
    		$where .= ' AND '.trim($fields_arr[1]);
    	}

        $query = $this->CI->db->get_where($model, $where, 1, 0);

        if ($query->num_rows() === 0) {
            return TRUE;
        }

        return FALSE;
	}
}

 

Comments

comments