Az alapvető tutorial cikkek mellett úgy gondoltam, hogy érdemes technikai és megvalósítási kérdésekkel is foglalkozni. Most a CodeIgniter model bővítéséről beszélünk pár mondatban.A cél egy olyan kiegészítést akarunk elkészíteni, ami nagy mértékben felgyorsítja a fejlesztést. Ne kelljen a legtöbb lekérdezéshez külön metódust írni a model állományban, hanem könnyen hívhassunk dinamikus lekérdezéseket a controllereken keresztül. Miért is jó ez? Csökkenthetjük a fejlesztési időt ha az MVC szemléleten belül készítünk egy adatbázis lekérdező mini réteget. Márpedig ez jelentős érv.IsmerkedjünkElső körben nézzük meg mit is találunk az alap Model.php állományban. A fájl a System/Core mappában található. Megnyitása után láthatjuk, hogy nem tartalmaz semmi érdemleges dolgot. Nézzük hát:
class CI_Model {
function __construct() {
log_message('debug', "Model Class Initialized");
}
function __get($key){
$CI =& get_instance();
return $CI->$key;
}
}
Mint mondtam semmi olyan nincs itt, ami komolyan befolyásolná az alapvető munkát. De ezen változtatni fogunk. Első lépés, hozzunk létre egy saját model fájlt. Legyen a neve mondjuk MY_Model.php. Mivel ez egy saját kiegészítés így pakoljuk az applikációnk, libraries mappájába. Természetesen ha használni is akarjuk majd, akkor ezt be is kell tölteni. Ha rendszeresen akarjuk használni, akkor a config/autload.php fájlban célszerű betölteni. Erre most nem térnék ki, a CodeIgniter dokumentációban részletesen le van írva a használata.Az új modelA már megnyitott model fájl tartalmát másoljuk az új model fájl-ba. Ez első lépésnek ugyan jó, de mit sem érnünk el vele, ott vagyunk ahol voltunk. Az alábbi kódrészletet másoljuk be a már bemásolt tartalom után.
//generált select
function _getSelect($table,$where = 'none',$order = 'none',$limit = 'none',$like = 'none') {
$CI =& get_instance();
$CI->db->select('*');
$CI->db->from($table);
if($where != 'none') {
foreach($where as $where_name=>$where_value) {
$CI->db->where($where_name,$where_value);
}
}
if($order != 'none') {
foreach($order as $order_name=>$order_value) {
$CI->db->order_by($order_name,$order_value);
}
}
if($limit != 'none') {
foreach($limit as $num=>$offset) {
$CI->db->limit($num,$offset);
}
}
if($like != 'none') {
foreach($like as $like_name=>$like_value) {
$CI->db->like($like_name,$like_value);
}
}
$query = $CI->db->get();
return $query->result();
}
//generált select num rows
function _getSelectRows($table,$where = 'none',$order = 'none',$like = 'none') {
$CI =& get_instance();
$CI->db->select('*');
$CI->db->from($table);
if($where != 'none') {
foreach($where as $where_name=>$where_value) {
$CI->db->where($where_name,$where_value);
}
}
if($order != 'none') {
foreach($order as $order_name=>$order_value) {
$CI->db->order_by($order_name,$order_value);
}
}
if($like != 'none') {
foreach($like as $like_name=>$like_value) {
$CI->db->like($like_name,$like_value);
}
}
$query = $CI->db->count_all_results();
return $query;
}
//generált insert
function _getInsert($table,$data) {
$CI =& get_instance();
$CI->db->insert($table, $data);
return $CI->db->insert_id();
}
//generált update
function _getUpdate($table,$data,$where) {
$CI =& get_instance();
foreach($where as $where_name=>$where_value) {
$CI->db->where($where_name,$where_value);
}
$CI->db->update($table, $data);
}
//generált delete
function _getDelete($table,$where) {
$CI =& get_instance();
foreach($where as $where_name=>$where_value) {
$CI->db->where($where_name,$where_value);
}
$CI->db->delete($table);
}
Mint látjuk is az alapvető lekérdezési műveletek kerültek be. Egy egyszerű select, select rows num, insert, update és delete metódus. A lehetőségekhez mérten dinamikusan megírva és könnyen használhatóvá alakítva.A használataMost hogy már megvan az új model, nincs más hátra mint használni ezt. Mint minden esetben amikor használni akarjuk az adatbáziskapcsolatunkat, be kell tölteni egy model fájlt. Pl.:
$this->load->model(’users’);
Itt betöltöttük a már létező users model-t. A users model-nek az alábbiak szerint kell kinéznie.
Class Users extends My_Model {
function __construct() {
parent::__construct();
}
}
Mi is van ebben? Hát igazából semmi, pusztán a users modell a már elkészített My_Model-ből származtatott osztály. Vagy is alapértelmezetten tartalmazza a My_Model minden elemét. Ezzel a model letudva. Nézzük mit is kell tenni a controllerbe, hogy használni tudjuk.
$this->load->model(’users’);
$where = array(’user_id’ => 11);
$order = array(’user_name’ => ’DESC’);
$limit =array(1 => 1);
$like = array(’user_email’ => ’@freemail.hu’);
$query = $this->users->_getSelect(’users_list’,$where,$order,$limit,$like);
Ki kell emelni, hogy nem kötelező az összes keresési paraméter beállítása. Csak amikre szükségünk van! Az összes lekérdezés első paramétere annak a táblának a neve ahol az sql parancsot futtatni akarjuk. Utána pedig a keresési paramétereket kell megadni. A lekérdezés eredménye jelen példában a $query változóba kerül és a már megszokott objektum alapú result.VégezetülA többi metódus felfedezése legyen mondjuk házi feladat, de annyit elárulok, hogy használatuk megegyezik a már fentebb bemutatott _getSelect példával. Így egységesnek tekinthető a megvalósítás.Néhány hasznos információAz alábbi kivitelezés nem gátolja azt, hogy bármikor egyedi metódusokat hozz létre a model-eken belül. Fontos azt is megjegyezni, hogy ez csak egy minta osztály, mindenki nyugodtan alakítsa át a saját száj-íze szerint. Érdemes megjegyezni azt is, hogy már kész CodeIgniter rendszerek alá is könnyen applikálható. Egy kis trükkel percek alatt be is lehet integrálni. Hozzunk létre egy generate_model.php nevezetű model-t. A tartalma legyen a már fentebb látható model tartalom,persze az osztály neve, a fájl neve legyen. Ezek után amikor meg akarjuk hívni a metódusokat, akkor be kell tölteni ezt az osztályt. ( $this->load->model(’generate_model’) ) Innentől kezdve használhatjuk könnyen.