CodeIgniter

Le modèle avec CodeIgniter

Le rôle du modèle

Rappel : Le modèle est la partie qui permet de stocker et de traiter les données.
D'une manière générale en PHP et avec CodeIgniter, le modèle n'effectue que les opérations en base de données et même pour cette raison, les créateurs de CodeIgniter n'obligent pas l'utilisation de leur classe Model. Cependant, d'un point de vue personnel, je pense qu'il vaut quand même mieux créer un modèle pour savoir tout de suite où se trouve les requêtes SQL. De plus, il est possible aussi d'utiliser un autre moyen pour stocker ses données (fichier simple, fichier XML...), il vaut mieux donc créer un modèle pour faciliter le débogage et les demandes d'évolutions.

Création d'un modèle

Pour créer un modèle avec CodeIgniter, il faut créer un fichier PHP dans le dossier system/application/models contenant une classe qui hérite de la classe Model du framework de CodeIgniter.

Dans cette classe, on crée les fonctions qui effectuent les traitements sur les données et qui appellent les fonctions se chargeant de stocker les données (insertion SQL, écriture dans un fichier texte ou XML) ainsi qu'un constructeur appelant le constructeur de la classe Model. La convention à respecter pour créer un Model est la suivante : le nom de la classe prend une majuscule au début et le fichier PHP a le même nom que la classe mais tout en minuscule et avec l'extension .php.

Exemple : On veut créer un modèle qui possède une fonction pour l'insertion d'une chaîne de caractères dans un fichier texte et une récupérant toutes les chaînes stocker dans un tableau. On crée donc le fichier filemodel.php dans le dossier system/application/models contenant la classe suivante :

<?php
class Filemodel extends Model{
	
	function __construct(){
		parent::Model();
	}
	
	function insert_string($word){
		$file = fopen('pass','a') or die("Can't open file");
		fwrite($file,"$word\n");
		fclose($file);
	}
	
	function get_strings(){
		$array = array();
		$file = fopen('pass','r') or die("Can't open file");
		while(!feof($file)){
			$array[] = fgets($file);
		}
		fclose($file);
		return $array;
	}
}
?>

Note : En PHP 5, le constructeur est la fonction __construct() alors qu'en PHP 4, le constructeur est une fonction qui porte le même nom que la classe.

Appel des fonctions d'un modèle

Les appels des fonctions du modèle doivent se faire dans le contrôleur. Il faut d'abord charger le modèle dans le contrôleur grâce à la fonction $this->load->model() qui prend en paramètre le nom de la classe représentant le modèle (il est possible d'appeler cette fonction dans le constructeur du contrôleur). Une fois chargé, on peut appeler les fonctions du modèle comme ceci : $this->Nom_model_chargé->fonction().

Exemple : nous allons modifier le FakeController de la partie Vue pour y ajouter une fonction appelant les méthodes du modèle ci-dessus.

Fichier fakecontroller.php :
<?php
class FakeController extends Controller{

	function __construct(){
		parent::Controller();
		$this->load()->model('Filemodel');
	}
	
	function index(){
		$array["prenom"] = "Aravindan";
		$array["nom"] = "Mahendran";
		$this->load->view("vue", $array);
	}
	
	function call_model_function(){
		$this->Filemodel->insert_string('test');
		$tab = $this->Filemodel->get_strings();
		foreach ($tab as $string){
			echo "$string <br/>";
		}
		//Normalement, il faut créer une nouvelle vue 
		//et ne pas utiliser echo...
	}
}
?>

Petit exemple complet utilisable

En reprenant le modèle crée dans cette partie, voici le contrôleur et la vue qui permettent de stocker des chaînes de caractères dans un fichier.

Modèle : fichier filemodel.php dans system/application/models
<?php
class Filemodel extends Model{
	
	function __construct(){
		parent::Model();
	}
	
	function insert_string($word){
		$file = fopen('pass','a') or die("Can't open file");
		fwrite($file,"$word\n");
		fclose($file);
	}
	
	function get_strings(){
		$array = array();
		$file = fopen('pass','r') or die("Can't open file");
		while(!feof($file)){
			$array[] = fgets($file);
		}
		fclose($file);
		return $array;
	}
}
?>

Contrôleur : fichier filecontroller.php dans system/application/controllers
<?php
class FileController extends Controller{
	
	function __construct(){
		parent::Controller();
		$this->load->model('filemodel');
	}
	
	function index(){
		$this->load->view('formulaire');
	}
	
	function insert(){
		$data['message'] ='';
		if ($_POST['compte']!='' && $_POST['mdp']!=''){
			$this->filemodel->insert_string($_POST['compte']);
			$this->filemodel->insert_string($_POST['mdp']);
			$data['message'] ="<font color='red'><b>Compte enregistré avec succès !</b></font>";
		}
		$this->load->view('formulaire',$data);
	}
	
	function show(){
		$data['comptes'] = $this->filemodel->get_strings();
		$this->load->view('formulaire',$data);
	}
}
?>

Vue : fichier formulaire.php dans system/application/views
<html>
	<head>
		<title>Formulaire</title>
	</head>
	
	<body>
		<center>
		<?php
		if (isset($message)){
			echo "$message<br/>";
		}
		if(isset($comptes)){
			echo "<font color='red'><b>Liste des comptes et mot de passe</b></font><br/>";
			foreach($comptes as $word){
				echo "$word<br/>";
			}
			echo "<font color='red'><b>---------------------------------</b></font><br/>";
		}
		?>
			<form method = 'POST' action='/index.php/filecontroller/insert'>
				Compte : <input type = 'text' name = 'compte'/>@hotmail.com/fr<br/>
				Mot de passe : <input type = 'password' name = 'mdp'/><br/>
				<input type='submit' value='Valider'/>
			</form>
			<a href="/index.php/filecontroller/show">Afficher la liste des comptes</a>
		</center>
	</body>
</html>