Codeigniter mvc

Codeigniterben, használhatjuk az mvc modellt. A következő példában egy vendégkönyvön keresztül kerül bemutatásra az mvc modell.

A codeigniterben az applicaton/models mappába helyezhetjük a fájlainkat. A vendégkönyvhöz adunk majd hozzá rekordokat vagy törlünk és listázzuk őket. Kezdésnek van pár függvény is segítség képpen definiálva, bár nem használjuk jelen példában mindet, de bennehagytam, sose lehet tudni mikor lesz hasznos :) A lényegi rész a szagatott vonal alatt kezdődik. Nagyon nincs mit cifrázni a dolgokon, egyszerűen csak a codeigniter függvényeit használjuk az sql parancsok "elkészítéshez" és "futtatásához", az "active record"-okat.

Az adatbázisban a tábla így néz ki:

vendegkonyv ( id (int, primary_key), nev (varchar(100) ), uzenet (text), date (date) )

application/models/vendegkonyv_model.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class Vendegkonyv_model extends CI_Model {
	/*
	* Vendegkonyv modell (vendegkonyv)
	* A vendegkonyv tábla listázás
	* Vendegkonyv tábla üzenet hozzáadása
	* Vendegkonyv tábla üzenet törlése
	*/	

	//kötelező mezők ellenőrzése
	function _required($required,$data){
		foreach($required as $field){
			if(!isset($data[$field])) return false; // ha van üres mező
		}
		return true;	//ha minden mező rendben van
	}
	//default vagy egyéb fix adatok beállítása
	function _default($defaults,$options){
		return array_merge($defaults,$options);
	}
	/* megkeressük az adatot
	* $options = table(string), field(string), data(string)
	* table = tábla neve, field = mezőnév, data = keresett érték
	* return: ha megtaláltuk 1, ha nem 0
	*/
	function _search($options = array()){
		if(!$this->_required(
			array('table','field','data'),
			$options)
		) return false;
		
		if(isset($options['field'])&&isset($options['data']))
			$this->db->where($options['field'],$options['data']);

		$query = $this->db->get($options['table']);
		
		return ($query->num_rows())?1:0;
	}
	
	/*--------------------------------------------------------------------------------------------- */
	/* vendegkonyv tábla listázás
	*/	
	function getVendegkonyv($options = array()){
		
		$this->db->order_by("date", "desc"); 

		//limit / offset
		if(isset($options['limit']) && isset($options['offset']))
			$this->db->limit($options['limit'],$options['offset']);
		else if(isset($options['limit']))
			$this->db->limit($options['limit']);
		//sort
		if(isset($options['sortBy']) && isset($options['sortDirection']))
			$this->db->limit($options['sortBy'],$options['sortDirection']);
		//qualification
			
		$query=$this->db->get("vendegkonyv");
		
		return $query->result();
	}
	/* vendegkonyv tábla üzenet hozzáadása
	*  $options = nev(string),uzenet(string)
	*/
	function addVendegkonyv($options = array()){
	
		if(!$this->_required(
			array('nev','uzenet'),
			$options)
		) return false; //<- ha üresek a kötelező mezők megszakítja		

		$options['date']=date("Y-m-d");
		
		if(isset($options['nev'])) // ellenőrizzük, hogy létezik-e már ilyen című hír
			$this->db->where('nev',$options['nev']);
		if(isset($options['uzenet']))
			$this->db->where('uzenet',$options['uzenet']);

		$this->db->insert('vendegkonyv',$options);

		return $this->db->insert_id();	
	}
	/* Vendegkonyv tábla üzenet  törlése
	*  $options = vendegkonyvid(int)
	*/	
	function deleteVendegkonyv($options = array()){
		if(isset($options['vendegkonyvid'])){
			$this->db->where('id',$options['vendegkonyvid']);
			$this->db->delete('vendegkonyv');
		}
	}
}
/* End of file vendegkonyv_model.php */
/* Location: ./application/model/vendegkonyv_model.php */

A controllerek az application/controllers mappában találhatóak. A konstruktorban meghívjuk még a calendar library-t, és két helpert, látogatókat számlálót és ékezetes szövegeket átalakító helpert. Ezeket most nem részletezzük, csak a példa kedvéért hagytam benne, amúgy törölhetőek vagy aki gondolja implementálja le. A jogosultság ellenőrzéseket is kiszedtem most a példából, hogy emészthetőbb legyen a példa, de utólag pótoljuk majd őket az éles rendszerben!

application/controllers/vendegkonyv.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Vendegkonyv extends CI_Controller {

	/**
	 * Vendegkönyv oldal index() vendegkonyv oldal üzenetek megjelenítése
	 * vendegkonyv_add() vendegkonyv hozzáadás
	 * vendegkonyv_delete($hir_id) vendegkonyv törlés(int)
	 */
	public function __construct() {
        parent::__construct();
		//$this->load->helper('accent');
		$this->load->library('calendar');
		//$this->load->helper('napok_latogatok');
	}

	// vendegkonyv oldal, linkek megjelenítése
	public function index(){	
		$this->load->library('parser');
		$this->load->library('pagination');
		$this->load->helper('text');
		$this->load->model('vendegkonyv_model');
		
		$this->data_header['header']=array('hatralevo_napok'=>hatralevo_napok(),'latogatok'=>latogatok());
		$this->load->view('header_view',$this->data_header);
		$this->load->view('rightbar_view');
		$this->load->view('sidebar_view');

                // lekérdezzük a vendégkönyv listát
		$this->data['vendegkonyv'] = $this->vendegkonyv_model->getVendegkonyv(); 

		$this->parser->parse('vendegkonyv/vendegkonyv_view',$this->data);
		$this->load->view('footer_view');
	}
	// vendégkönyv eseménye hozzáadás
	public function vendegkonyv_add(){
		
		$this->load->library('form_validation');
		$this->load->model('vendegkonyv_model');
		$this->form_validation->set_rules('nev','nev','trim|required');
		$this->form_validation->set_rules('uzenet','uzenet','trim|required');
		
		if($this->form_validation->run()){
			unset($_POST['ok']);

			$vendegkonyvid=$this->vendegkonyv_model->addVendegkonyv($_POST); // hír hozzáadása
			
			if($vendegkonyvid){
				$this->session->set_flashdata('flashConfirm',' Az üzenet hozzáadása sikerült!');
				redirect('vendegkonyv');
			}
			else{
				$this->session->set_flashdata('flashError',' Az üzenet hozzáadása nem sikerült!');
				redirect('vendegkonyv');
			}
		}
	}
	
	// vendégkönyv eseménye törlés
	public function vendegkonyv_delete($vendegkonyvid){
		$this->load->model('vendegkonyv_model');
		$this->vendegkonyv_model->deleteVendegkonyv(array('vendegkonyvid'=>$vendegkonyvid));
		$this->session->set_flashdata('flashConfirm',' Az üzenet törlése sikerült!');
		redirect('vendegkonyv');
	}
}

/* End of file vendegkonyv.php */
/* Location: ./application/controllers/vendegkonyv.php */

Végül nézzük meg a view-st is. Az application/views mappában találhatóak a fájlok, használjuk a template-eket is.

application/views/vendegkonyv_view.php:
<div id="hirek_div">
	<div id="hirek_cim">
		<form name="" method="post" action="<?php echo site_url('vendegkonyv/vendegkonyv_add'); ?>" target="" >
			<table cellpadding="0" cellspacing="0">
				<tr>
					<td>Név: </td>
					<td><input type="text" value="" name="nev" /></td>
				</tr>
				<tr>
					<td>Üzenet: </td>
					<td>
						<textarea name="uzenet" rows="8" cols="35" class="post">
						</textarea>
					</td> 
				</tr>
				<tr>
					<td colspan="2" align="center">
                                                  <input type="submit" name="ok" value="Új üzenet" />
                                        </td>
				</tr>
			</table>
		</form>
	</div>
	
	<div id="hirek_cim">Vendégkönyv</div>
	{vendegkonyv}
		<div id="hirek_tartalom_sor" >
                       {nev}
			<a href="<?php echo base_url();?>vendegkonyv/vendegkonyv_delete/{id}">törlés</a>
			{date}
		</div>
		<div id="hirek_tartalom">
			{uzenet}
		</div>
	{/vendegkonyv}
</div>

Jó tanács a vendégkönyvhöz: készítsünk valami egyszerű captha-t, különben elöntenek minket a spam-ek :)

A paraméterek, kapcsolók, osztályok, függvények részletes magyarázata itt:
http://www.codeigniter.com/user_guide/database/active_record.html
http://www.codeigniter.com/user_guide/general/models.html
http://www.codeigniter.com/user_guide/general/controllers.html
http://www.codeigniter.com/user_guide/general/views.html
http://www.codeigniter.com/user_guide/libraries/parser.html
2014.03.03.