Académique Documents
Professionnel Documents
Culture Documents
Sbastien Adam
8 aot 2016
ii RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Table des matires
1 Introduction 1
2 Concepts de base 3
2.1 Le patron MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.1 Quest-ce que le patron MVC ? . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.3 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.4 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2.1 Quest-ce quun framework ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2.2 Prsentation de CodeIgniter . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3.1 Installation standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3.2 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.3 Installation personnalise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.4 Premire page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.4.1 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4.2 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4.3 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4.4 URL Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4.5 HTML Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.5 Page de contact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5.1 Une nouvelle page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.5.2 Cration du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.3 Validation des donnes reues . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5.4 Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.5.5 Envoi de le-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6.1 noncs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.6.2 Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3 Authentification 29
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2 Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.1 Sessions de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.2 Sessions avec CodeIgniter . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4 Blog 43
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.2 Base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3 Liste des articles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.3.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.3.4 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.4 Cration dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.4.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.4.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.4.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5 Affichage dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.5.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.5.2 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.5.3 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.5.4 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.6 Modification dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.6.1 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.6.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.7 Suppression dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.7.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.7.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.7.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.7.4 Confirmation AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.8 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.8.1 noncs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.8.2 Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Introduction
Bonjour,
Bienvenue sur ce tutoriel Ralisez votre blog avec le framework CodeIgniter 3 .
Cela fait dj quelques annes maintenant que je dveloppe des sites web avec diffrents langages
(Perl, PHP, C#. . .) et en utilisant diffrents outils (des gestionnaires de contenu, des frameworks. . .).
Lorsque jai dcouvert le framework PHP CodeIgniter, jai t sduit, et surpris, par sa simplicit
et sa facilit dapprentissage. L o dautres framework se comportent parfois comme de vraies
usines gaz , CodeIgniter va lessentiel. Et jespre, grce ce tutoriel, vous faire partager
mon enthousiasme.
Nous allons ici passer en revue les diffrentes fonctionnalits dun site web, et voir comment
les raliser avec CodeIgniter. Nous allons ainsi envisager diffrents aspects comme laffichage dune
page statique, la cration dun formulaire de contact, les sessions, lauthentification et la cration
de contenu dynamique.
Que vous soyez un autodidacte clair, un jeune dveloppeur, ou un dveloppeur plus confirm
voulant valuer CodeIgniter, vous tes au bon endroit !
Entendons-nous bien, ceci nest pas un cours de dveloppement web. Je vais juste vous prsenter
un outil pour crer de sites. Ainsi, je suppose que vous possdez les pr-requis suivants :
Bon, OK, ne vous laissez pas impressionner par la liste des pr-requis, vous ne devez pas tre
BAC+5 en ralisation de site web (de toute faon, je ne suis mme pas sr que cela existe).
Vous avez seulement besoin de matriser les bases. Si vous tes un peu dbrouillard, vous vous en
sortirez trs bien.
Trve de bavardages, passons au vif du sujet. . . Pour ce cours, jai utilis mon serveur web de
test tournant sous Debian 8.5 (stable). Les versions des logiciels sont les suivantes :
Apache 2.4.10
PHP 5.6.22
MySQL 5.5.49
CodeIgniter 3.0.6 1
Vous ntes pas oblig davoir votre propre serveur ddi. Il existe des tas de solutions sur
internet vous permettant de faire tourner un serveur web sur votre machine comme XAMPP, et
bien dautres. . .
Je vous recommande de lire ce document avec attention, sinon, vous pourriez passer ct de
quelque chose dimportant. Et si vous deviez rencontrer lune ou lautre erreur dans ce document,
ou que vous vouliez proposer une amlioration, vous pouvez toujours me contacter ladresse
sebastien.adam.webdev@gmail.com. Attention, je ne corrigerai pas vos travaux, ni ne vous donnerai
de cours particulier ( moins de trouver un arrangement ).
1. Jai commenc la rdaction de ce tutoriel avec la version 3.0.3. Il est donc possible que vous trouviez des
rfrences des versions plus anciennes.
CHAPITRE 1. INTRODUCTION
Chapitre 2
Concepts de base
2.1.2 Modle
Le modle reprsente vos donnes. Il sagit bien souvent dune classe dont les mthodes per-
mettent deffectuer les actions de cration, de lecture, de mise jour et de suppression de vos
donnes. Dans le jargon, on parle de CRUD (Create, Read, Update, Delete). En principe, ailleurs
dans votre code, vous ne devriez jamais trouver dinstruction de connexion une base de donnes,
un fichier, etc. (suivant le type de ressource que vous utilisez). Tout passe par le modle.
Savoir ce que contient exactement le modle est aussi un sujet qui peut enflammer les foules.
Restons simple. Nous verrons au fur et mesure comment limplmenter avec CodeIgniter.
Application
Contrleur
Modle Vue
2.1.3 Vue
Cest dans la vue que nous allons dfinir ce qui doit tre affich et comment. En principe, pour
une application web, cest le seul endroit o nous pourrions retrouver du code HTML. Nous pouvons
galement trouver dans les vues des instructions concernant la programmation. Cest pratiquement
invitable. Cela permet de rendre les pages plus dynamiques.
2.1.4 Contrleur
Le contrleur va recevoir les requtes de lutilisateur, charger les modles ncessaires ainsi que
les vues adquates et retourner le rsultat. Avec une application web, les requtes se font au travers
des URL. La figure 2.1 la page 4 montre les interactions entre les diffrents lments.
Notez que la flche qui unit le modle et la vue est en pointill. Certaines chapelles veulent que
seule le contrleur accde au modle. Dautres acceptent que la vue communique directement avec
le modle. Cest plus facile, mais cest moins propre. Encore une fois, cest vous de voir quelle est
la meilleure pratique.
2.1.5 Conclusion
Voil, jai trs brivement expos le patron MVC. Vous avez maintenant en main le strict mini-
mum ncessaire pour suivre le cours. Pour ceux qui ne matrisent pas encore bien le sujet, je vous
invite le creuser un peu plus, cela vous servira toujours.
Attention, ce que jai prsent ci-avant est vraiment le strict minimum connatre. Si lune ou
lautre chose nest pas claire pour vous, revenez dessus, cest important.
2.2 Framework
Mais quest-ce donc exactement un framework ? Cest un mot qui est difficilement traduisible
en franais (on pourrait parler de cadre de travail ). Disons simplement quil sagit dune bote
outil.
Les Helpers Il sagit de fichiers contenant diffrentes fonctions, comme en programmation proc-
durale. Celles-ci permettent dajouter des fonctionnalits votre application qui sont acces-
sibles partout. Par exemple, dans un helper, vous avez une fonction qui permet de gnrer le
code HTML pour un lien.
Les librairies La diffrence entre les helpers et les librairies, cest que ces dernires sont des classes.
Nous avons par exemple une librairie permettant denvoyer un e-mail.
Les Drivers Les drivers sont des librairies spciales, plus labores et qui possdent des enfants.
Par exemple, nous avons un driver pour grer les accs aux bases de donnes.
Vous navez pas besoin de connatre tous les outils ds le dbut. Mais lorsque vous aurez besoin
dune fonctionnalit, demandez-vous dabord si elle nexiste pas dj dans le framework avant de la
dvelopper. Pour cela, nhsitez pas explorer la documentation en ligne. Il serait bte de rinventer
la roue.
2.3 Installation
2.3.1 Installation standard
Basta avec la thorie maintenant, commenons la pratique ! Nous allons ici installer CodeIgniter
pour pouvoir dvelopper notre blog.
Rendez-vous sur le site de CodeIgniter ladresse http://www.codeigniter.com/download
pour tlcharger le framework. Je vous recommande la version courante (3.0.6 lcriture de ces
lignes, mais vous tlchargerez surement une version plus rcente). Vous pouvez galement tlchar-
ger les traductions si vous le voulez (cliquez sur Download System Message Translations ).
Linstallation est un processus particulirement complexe : il faut dcompressez le fichier dar-
chive que vous venez de tlcharger dans la partie publique de votre serveur web.
La figure 2.2 la page 6 donne la structure originale des rpertoires de CodeIgniter. Voici leur
utilit :
system Cest le framework en lui-mme. Vous ne devez, en principe, rien modifier dans ce
rpertoire.
Jai suppos que vous aviez install votre serveur web sur la machine o vous vous trouvez.
Aisni, lancez votre navigateur et allez ladresse http://localhost/. Vous devriez avoir une page
ressemblant limage 2.3 la page 6. Si ladresse de votre serveur est diffrentes, il suffira de changer
localhost par le nom de votre serveur.
Si vous avez tlcharg les traductions, vous pouvez les galement les installer. Depuis lar-
chive, copiez les rpertoires contenant les langues qui vous intressent se trouvant dans le rpertoire
language (par exemple french ) vers le rpertoire application/language de votre framework
et le fichier core/MY_Lang.php de larchive vers le rpertoire application/core .
2.3.2 Configuration
Cest ici que les choses srieuses commencent.
Tous les frameworks on cette chose en commun que la plupart des personnes ngligent : les fichiers
de configuration. Pour CodeIgniter, ils se trouvent tous dans le rpertoire application/config .
Vous constatez quil sy trouve un certain nombre de fichiers. Chacun dentre eux correspond la
configuration dun domaine bien prcis. Nous les explorerons au fur et mesure de leur utilisation.
Pour linstant, concentrons-nous sur config.php , le fichier de configuration principal. Nous
devons dfinir la valeur du paramtre $config[base_url] . Comme nous lavons install sur
notre machine locale, nous donnerons la valeur http://localhost/ . Bien entendu, si vous avez
install votre site sur un autre serveur, cest lURL de ce serveur qui devra se trouver ici.
Un autre paramtre intressant est $config[index_page] . Il donne le nom du fichier den-
tre du site. Ne le modifions pas tout de suite. Nous y reviendrons dans la partie routage (voir
section 2.4.1 la page 9).
Pour ceux qui ont install les fichiers de la traduction franaise, vous pouvez assigner la valeur
french au paramtre $config[language] .
Voici donc quoi doit ressembler les paramtres dont nous venons de parler (attention, neffacez
pas les autres paramtres, sinon vous tes dans la mouise) :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $config [ base_url ] = http :// localhost / ;
5 $config [ index_page ] = index . php ;
6 $config [ language ] = french ;
Maintenant, si vous navez pas fait derreur, votre site doit toujours tre oprationnel. Notez
que linstallation des fichiers de traduction naffecte pas la page daccueil. Elle restera en anglais,
cest normal.
www/application application
www/system framework/codeigniter-3.0.6
Vous vous doutez bien que maintenant, votre site web ne fonctionne plus. Cest normal. Mais ne
vous inquitez pas, avec CodeIgniter, tout est trs simple. Il suffit juste de modifier deux variables
dans le fichier www/index.php pour le remettre en route :
1 <? php
2 // (...)
3 $system_path = ../ framework / codeigniter -3.0.6 ;
4 // (...)
5 $app l i ca t i on _ f ol d e r = ../ application ;
6 // (...)
2.4.1 Routage
Daprs le principe du patron MVC, les pages sont gnres partir des mthodes des contrleurs.
Ainsi, si nous voulons faire afficher la page daccueil de notre site, nous devons appeler la mthode
correspondante du contrleur adquat. Et comme, avec CodeIgniter, tout est simple, cest grce
ladresse que nous renseignons que nous allons pouvoir le faire (en fait, cette technique est utilise
par pratiquement tous les frameworks). Voici le format des adresses :
http://localhost/index.php/[controller-class]/[controller-method]/[arguments]
Ainsi, si pour afficher la page daccueil, nous devons appeler la mthode index() du contrler
site (cest dailleurs ce que nous ferons ), ladresse sera celle ci-dessous. Nous navons que le
contrleur et la mthode, tant donn que nous navons aucun argument passer.
http://localhost/index.php/site/index
Vous ne trouvez pas que cette adresse manque de charme ? Je voudrais que ladresse de ma page
daccueil soit (je suis un nostalgique de lHTML ):
http://localhost/index.html
Comme toujours, avec CodeIgniter, tout est simple. Cette opration seffectue en seulement
quelques oprations. . .
Premire tape, donner lextension .html toutes nos pages . Pour cela, nous devons diter
le fichier application/config/config.php (o ai-je bien pu entendre parler de ce fichier ?) et et
assigner la valeur .html la variable $config[url_suffix] :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $config [ url_suffix ] = . html ;
Seconde tape, cacher le index.php de ladresse. Cela se fera en deux temps. Tout
dabord, dans le fichier application/config/config.php , assigner une chane vide la variable
$config[index_page]
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $config [ index_page ] = ;
Nous devons ensuite configurer notre configurer votre serveur web pour quil envoie de manire
transparente les requtes au fichier index.php . Attention, si vous ne faites pas cela, vous
ne pourrez plus accder vos pages. . . Avec un serveur Apache, nous devons crer un fichier
.htaccess la racine de la partie publique contenant les quelques lignes ci-dessous. Assurez-vous
que le module rewrite_module est activ, sinon, le serveur plante (pour de vrai !).
1 RewriteEngine On
2 RewriteCond %{ REQUEST_FILENAME } ! - f
3 RewriteCond %{ REQUEST_FILENAME } ! - d
4 RewriteRule ^(.*) $ index . php / $1 [ L ]
Comme dernire tape, nous allons dfinir quelques rgles de routage. Et comme toujours, cela se
fera de manire trs simple, grce au fichier application/config/routes.php . Dans ce dernier
est cr une variable $route . Il sagit dun tableau associatif o les cls sont les URI que nous
donnons, et les valeurs les appels qui seront effectivement effectus. Ce tableau est parcouru de
manire squentielle. Ds quune cl satisfait ladresse donne, elle est utilise. Ainsi, il est possible
que des rgles ne soient jamais atteintes. Si, sur votre site, pour une raison quelconque, ce ne sont
pas les pages demandes qui saffichent, cest ici quil faut venir voir en premier.
Mais revenons nos moutons. Pour faire afficher notre page daccueil, nous allons dfinir un
contrleur Site avec une mthode index() . Nous allons ainsi dfinir les rgles suivantes dans le
fichier application/config/routes.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $route [ de fau lt _c on tr ol le r ] = site ; // Si aucun param tre n est donn , c est
5 // la route qui sera utilis e . Il n est
6 // pas n cessaire d indiquer la m thode
7 // index () c est celle qui est appel e
8 // par d faut
9 $route [ (: any ) ] = site / $1 ; // si un seul param tre est donn , il sera utilis
10 // comme m thode du contr leur site . Cela per -
11 // mettra de cacher ce dernier dans les adresses
Croyez moi sur parole, lorsque vous aurez fini cette section et que vous taperez ladresse
http://localhost/index.html vous accderez la page daccueil (si cela ne marche pas ac-
tuellement, cest normal, nous navons pas encore fini). De toute faon, si javais fait une erreur
ce stade-ci, je serais revenu la corriger avant la publication de ce document.
Ici, je ne vous ai montr que lessentiel du sujet, ce que vous utiliserez peu prs tous les jours.
Si vous voulez allez plus loin, je vous invite consulter laide en ligne de CodeIgniter sur les URL
et le routage.
2.4.2 Contrleur
Pour rappel, dans la philosophie du patron MVC, nous utilisons un contrleur pour charger
les pages afficher. Ces contrleurs ne sont ni plus ni moins que des classes qui vont tendre
CI_Controller . Tous les contrleurs se trouveront dans le dossier application/controllers .
Maintenant, crons notre classe contrleur, appelons-la Site et sauvons-la dans le fichier
application/controllers/Site.php (respectez bien les majuscules et les minuscules). Dans
cette classe, crons une mthode index() . Dans cette mthode, nous allons simplement faire ap-
pel la librairie Loader pour charger notre vue.
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
Vous allez me dire que vous ne connaissez pas la librairie Loader ? Ne vous inquitez pas. Dites-
vous simplement quelle est prsente tout le temps et quelle sert charger toutes les ressources dont
nous avons besoin. Si vous voulez aller plus loin, vous pouvez consulter laide en ligne.
Pour charger la vue, nous passons son chemin partir du rpertoire application/views , sans
lextension. Ainsi, dans notre cas, notre vue sera le fichier application/views/site/index.php .
Attention, contrairement la plupart des autres framework, CodeIgniter nutilise pas les layout.
Ainsi, lorsque vous chargez la vue application/views/site/index.php , vous naurez que le
contenue de cette vue.
Vous me direz alors, mais comment faire pour avoir la mme prsentation pour toutes les pages ?
Rassurez-vous, vous pouvez chargez plusieurs vues la fois. Ainsi, vous pouvez dfinir une vue pour
le haut de la page et une autre pour le bas.
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 public function index () {
6 $this - > load - > view ( common / header ) ;
7 $this - > load - > view ( site / index ) ;
8 $this - > load - > view ( common / footer ) ;
9 }
10 }
2.4.3 Vue
Voici (enfin) la dernire tape permettant laffichage de notre page daccueil. Nous allons ici
crer nos trois vues. Je vous livre leur contenu tel quel, lHTML ne faisant pas partie de ce cours.
La premire vue, application/views/common/header.php , permettra dafficher le haut de
la page. Nous dfinirons lentte HTML, le menu, etc.
1 <! DOCTYPE html >
2 < html >
3 < head >
4 < meta charset = " UTF -8 " >
5 < meta http - equiv = "X - UA - Compatible " content = " IE = edge " >
6 < meta name = " viewport " content = " width = device - width , initial - scale =1 " >
7 < title > < ?= $title ? > </ title >
8 < link rel = " stylesheet " href = " css / bootstrap . min . css " >
9 < link rel = " stylesheet " href = " css / bootstrap - theme . min . css " >
10 <! -- HTML5 shim and Respond . js for IE8 support of HTML5 elements and media
queries -- >
11 <! -- WARNING : Respond . js doesn t work if you view the page via file :// -- >
12 <! --[ if lt IE 9] >
13 < script src = " https :// oss . maxcdn . com / html5shiv /3.7.2/ html5shiv . min . js " > </
script >
14 < script src = " https :// oss . maxcdn . com / respond /1.4.2/ respond . min . js " > </ script
>
15 < ![ endif ] -- >
16 </ head >
17 < body >
18 < nav class = " navbar navbar - inverse " >
Je fois dj les plus presss dentre vous qui ont essay dafficher la page et ce la ne marche
toujours pas. Patience, il y a encore quelques concepts vous expliquer. . .
Les plus perspicaces dentre vous auront tout de suite vue que javais utilis le framework Boots-
trap pour le rendu de ma page. Cest un choix personnel, vous pouvez utiliser nimporte lequel,
cest votre entire discrtion. Limportant est dinstaller tous les fichiers ncessaires dans la partie
publique du site.
Vous constaterez galement que dans len-tte et le contenu de la page, jai utilis une variable
appele $title . Mais do vient-elle ? Je lai tout simplement dfinie dans le contrleur (honte
moi, je vous ai laiss vous planter sans vergogne ).
Il est en effet possible de faire passer des informations depuis les contrleurs vers les vues. Cest
un des concepts-cls de la philosophie du patron MVC. Avec CodeIgniter, ce mcanisme est trs
simple, comme tout le reste. Il suffit de dfinir un tableau associatif dans le contrleur et de le passer
au Loader . Les cls du tableau associatif seront utilises comme nom de variable dans la vue.
Voici ce quest devenue notre mthode :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 public function index () {
6 $data [ " title " ] = " Page d accueil " ;
7
8 $this - > load - > view ( common / header , $data ) ;
9 $this - > load - > view ( site / index , $data ) ;
10 $this - > load - > view ( common / footer , $data ) ;
11 }
12 }
13.
site_url("index") http://localhost/index.html
base_url("js/jquery-2.1.4.min.js") http://localhost/js/jquery-2.1.4.min.js
Une troisime fonction de ce helper qui peut savrer utile est anchor() . Elle permet de crer
des liens, et Dieu sait combien de liens nous pouvons crer dans un site web (en fait, Dieu n rien
voir l dedans, mais cest un autre dbat ). Elle prend comme premier paramtre lURI du lien,
tout comme les fonctions site_url() et base_url() , et comme second paramtre le texte qui
sera entour par les balises. Voici un exemple de lutilisation de cette fonction :
1 echo anchor ( index , " Accueil " ) ;
2 // affiche : <a href =" http :// localhost / index . html " > Accueil </ a >
Maintenant, je vous laisse mettre jours vos vues en utilisant ces mthodes.
H, l ! Doucement ! Je ne vous ais pas encore dit dessayer dafficher votre page ! Cela ne marche
pas encore ! Un Helper, il faut le charger avant de pouvoir lutiliser. Nous pourrions faire un load
chaque fois quon en a besoin, cest dire tout le temps, et risquer de loublier lune fois ou
lautre. Nous pouvons aussi demander CodeIgniter de le charger automatiquement. Pour cela,
nous utilisons le fichier application/config/autoload.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $autoload [ helper ] = array ( url ) ;
Voil, maintenant, laffichage devrait marcher. Votre page daccueil doit toujours ressembler
la figure 2.5 la page 13. Et si vous examinez le code source de la page, vous devriez avoir vos liens
en adresses absolues :
1 < link rel = " stylesheet " href = " http :// localhost / css / bootstrap . min . css " >
2 <a href = " http :// localhost / index . html " > Accueil </ a >
4 if (! function_exists ( meta ) ) {
5 function meta ( $name = , $content = , $type = name , $newline = " \ n " ) {
6 if (! is_array ( $name ) ) {
7 $name = array (
8 array (
9 name = > $name ,
10 content = > $content ,
11 type = > $type ,
12 newline = > $newline
13 )
14 );
15 } elseif ( isset ( $name [ name ]) ) {
16 $name = array ( $name ) ;
17 }
18 $allowed_type = array ( charset , http - equiv , name , property ) ;
19 $str = ;
20 foreach ( $name as $meta ) {
21 $meta [ type ] = isset ( $meta [ type ]) ? (( $meta [ type ] === equiv ) ?
http - equiv : $meta [ type ]) : ; // backward compatibility
22 $type = in_array ( $meta [ type ] , $allowed_type ) ? $meta [ type ] : name ;
23 $name = isset ( $meta [ name ]) ? $meta [ name ] : ;
24 $content = isset ( $meta [ content ]) ? $meta [ content ] : ;
25 $newline = isset ( $meta [ newline ]) ? $meta [ newline ] : " \ n " ;
26 $str .= < meta . $type . =" . $name . (( $type === charset ) ? : "
content =" . $content ) . " / > . $newline ;
27 }
28 return $str ;
29 }
30 }
Je ne sais pas pour vous, mais moi, je narrive jamais retenir la syntaxe exacte pour linsertion
dune feuille de style dans la page HTML. Cest pourtant une opration que lon doit effectuer trs
rgulirement. Mais jai du mal avec cela. CodeIgniter a donc dfini une fonction spcialement pour
moi (enfin, elle existe et je laime beaucoup ) : link_tag() . Voici un exemple de son utilisation :
1 echo link_tag ( " css / style . css " ) ;
2 // affiche : < link href =" http :// localhost / css / style . css " rel =" stylesheet " type ="
text / css " / >
Outre les feuilles de style, cette fonction permet galement de dfinir licne du site, les feuilles
de style alternatives, etc. Pour plus de dtails, voyez laide en ligne.
Une dernire petite fonction que je voudrais voir ici, cest heading() . Elle permet de faire des
titres :
1 echo heading ( " Welcome " , 3) ; // affiche : <h3 > Welcome </ h3 >
Cest une fonction toute simple. Le premier paramtre reoit le texte du titre. Le deuxime
paramtre reoit le niveau du titre. Sil nest pas donn, le niveau par dfaut est 1 . La fonction
accepte un troisime paramtre qui permet de dfinir les attributs de la balise. Pour plus de dtails,
vous pouvez consulter laide en ligne.
Maintenant, je vous invite modifier vos vues en utilisant les fonctions du HTML Helper .
Le rsultat obtenu doit tre le mme quavant. Vous vous demanderez alors quelle est lutilit de ces
fonctions ? Cest vous de voir. Soit vous prfrez taper votre code HTML vous-mme, soit vous
prfrez utiliser les fonctions. On peut juste dire que le rendu des pages sera un poil plus rapide
sans les fonctions, mais que ces dernires pourront vous aider si vous avez des doutes quant la
syntaxe de vos balises, ou simplifier des tches rptitives.
Maintenant, nous allons ajouter un lien dans le menu principal pour accder cette page de
contact. Pour cela, nous allons diter la vue common/header.php et rajouter une ligne dans le
menu pour pointer vers la page de contact. Voici ce que nous devrions avoir aprs la modification
(il ne sagit que dun extrait de la vue, tout le reste du code ne doit pas changer).
1 <! -- (...) -- >
2 < div class = " collapse navbar - collapse " id = " main_nav " >
3 < ul class = " nav navbar - nav " >
4 < li > < ?= anchor ( index , " Accueil " ) ; ? > </ li >
5 < li > < ?= anchor ( contact , " Contact " ) ; ? > </ li >
6 </ ul >
7 </ div >
8 <! -- (...) -- >
20 < ?= form_label ( " Titre & nbsp ;: " , " title " , [ class = > " col - md -2 control -
label " ]) ? >
21 < div class = " col - md -10 " >
22 < ?= form_input ([ name = > " title " , id = > " title " , class = > form -
control ]) ? >
23 </ div >
24 </ div >
25 < div class = " form - group " >
26 < ?= form_label ( " Message & nbsp ;: " , " message " , [ class = > " col - md -2 control -
label " ]) ? >
27 < div class = " col - md -10 " >
28 < ?= form_textarea ([ name = > " message " , id = > " message " , class = >
form - control ]) ? >
29 </ div >
30 </ div >
31 < div class = " form - group " >
32 < div class = " col - md - offset -2 col - md -10 " >
33 < ?= form_submit ( " send " , " Envoyer " , [ class = >" btn btn - default " ]) ; ? >
34 </ div >
35 </ div >
36 < ?= form_close () ? >
37 </ div >
38 </ div >
Pour ce qui est du code HTML, il est assez simple et rptitif. Je me suis bas sur les exemples
de la documentation de Bootstrap. Vous pouvez bien videmment utiliser votre propre framework
daffichage (ou pas).
Il est noter que la plupart des frameworks utilisent leurs propres fonctions. Si vous voulez les
adapter vos besoins, cest possible, mais fastidieux. Vous allez passer des heures et des heures
trouver LE paramtre changer pour avoir le rsultat voulu (je parle dexprience). Encore une
fois, avec CodeIgniter, tout est trs simple.
Mais revenons notre vue. Je vous passe lusage de la fonction heading() , cela a dj t vu
prcdemment.
La premire fonction sur laquelle nous allons nous pencher est form_open() . Celle-ci va
crer la balise douverture du formulaire <form> , mais pas uniquement. Le premier para-
mtre est la route donnant ladresse o sera envoy le formulaire. Cette route sera calcule
comme avec la fonction site_url() . Ainsi, dans notre exemple, contact sera transform en
http://localhost/contact.html . form_open() possde une second paramtre optionnel per-
mettant dajouter des attributs HTML sous forme dun tableau cl - valeur .
Cette fonction a galement un intrt supplmentaire. Il existe un type dattaque de sites web
appel Cross-Site Request Forgery , abrg CSRF (parfois prononc sea-surfing en anglais) ou
XSRF. Pour viter cela, on ajoute un champ cach avec un jeton. Si le jeton nest pas prsent, ou est
erron, les donnes du formulaire ne seront pas traites. form_open() permet de gnrer cette ba-
lise. Pour cela, il faut lactiver dans le fichier de configuration application/config/config.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $config [ csrf_protection ] = TRUE ;
5 $config [ csrf_token_name ] = csrf_token_name ;
6 $config [ csrf_cookie_name ] = csrf_cookie_name ;
7 $config [ csrf_expire ] = 7200;
8 $config [ csrf_regenerate ] = TRUE ;
9 $config [ c srf_ex clude_ uris ] = array () ;
10 // (...)
11 }
videmment, si on ouvre la balise du formulaire, il faut la fermer. Pour cela, nous utiliserons
la fonction form_close() . Cette dernire ne prend aucun paramtre et va simplement afficher
</form> . Vous pouvez aisment vous en passer, ou pas si vous voulez garder une certaine cohrence
dans votre code.
Les autres fonctions ont des noms qui sont assez explicites. form_label() va gnrer la balise
<label> , form_input() va gnrer la balise <input> , etc. Pour plus de dtails nhsitez pas
consulter laide en ligne.
Notez la cl site/contact de notre tableau de configuration. Cest elle qui va dire que
les rgles sappliquent la mthode contact du contrleur site . Une rgle peut dfinir
plusieurs exigences, comme pour le champ email .
Maintenant, nous crons la vue qui sera affiche en cas de succs. Son contenu nest
pas spcialement important, il sagit juste dun message de russite. Voici le code de la vue
application/views/site/contact_result.php :
1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 </ div >
5 < div class = " row alert alert - success " role = " alert " >
6 Merci de nous avoir envoy ce mail . Nous y r pondrons dans les meilleurs d
lais .
7 </ div >
8 < div class = " row text - center " >
9 < ?= anchor ( " index " , " Fermer " , [ class = > " btn btn - primary " ]) ; ? >
10 </ div >
11 </ div >
Pour terminer, il va nous falloir modifier notre contrleur afin de lancer la validation et, suivant
que les donnes dentre sont valides ou pas, afficher la page de succs ou nouveau afficher la page
de contact. La validation se fera en appelant la mthode run() de la librairie de validation des
formulaires. La mthode de notre contrleur ressemblera ceci :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
Voil, maintenant, tant que vous nenvoyez pas de donnes valides, vous restez sur le formulaire
de contact. Sinon, vous avez une page indiquant que votre message a bien t envoy. Et ce qui est
magique, cest quaucune rgle de validation napparat dans la mthode du contrleur.
Bon, jespre que vous avez bien compris ce qui a t fait, car, maintenant, vous allez rpter
lopration pour tous les autres champs. Vous devriez avoir un rsultat ressemblant limage 2.6
la page 23.
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function contact () {
7 // (...)
8 if ( $this - > form_validation - > run () ) {
9 $this - > load - > library ( email ) ;
10 $this - > email - > from ( $this - > input - > post ( email ) , $this - > input - > post ( name )
);
11 $this - > email - > to ( sebastien . adam . webdev@gmail . com ) ;
12 $this - > email - > subject ( $this - > input - > post ( title ) ) ;
13 $this - > email - > message ( $this - > input - > post ( message ) ) ;
14 $this - > email - > send () ;
15 $this - > load - > view ( site / contact_result , $data ) ;
16 } else {
17 $this - > load - > view ( site / contact , $data ) ;
18 }
19 $this - > load - > view ( common / footer , $data ) ;
20 }
21 }
Vous pouvez constater que nous avons les mthodes from() pour dfinir la source du message,
to() pour dfinir le destinataire, subject() pour dfinir le sujet du message, et message() pour
dfinir le corps de ce dernier. Une fois que tous ces paramtres auront t introduits, nous pouvons
appeler la mthode send() pour effectivement envoyer le-mail. Si tout se passe correctement, le
message envoy via le formulaire de votre site vous arrivera. Notez que jai ici directement donn
mon adresse e-mail comme destinataire. En respectant les bonnes pratiques, vous aurez mis cette
adresse dans un fichier de configuration. Ainsi si elle doit changer, vous naurez pas parcourir tout
votre code la recherche des corrections effectuer.
Il se peut que, pour un raison ou une autre, votre e-mail ne puisse pas tre envoy. Comment
peut-on le savoir allez-vous me dire ? Cest, une nouvelle fois, trs simple. La mthode send()
possde une valeur de retour qui lindique. Nous avons galement notre disposition une mthode
print_debugger() qui va nous afficher ce qui sest pass.
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function contact () {
7 // (...)
8 if ( $this - > email - > send () ) {
9 $data [ result_class ] = " alert - success " ;
10 $data [ result_message ] = " Merci de nous avoir envoy ce mail . Nous y r
pondrons dans les meilleurs d lais . " ;
11 } else {
12 $data [ result_class ] = " alert - danger " ;
13 $data [ result_message ] = " Votre message n a pas pu tre envoy . Nous
mettons tout en oeuvre pour r soudre le probl me . " ;
14 // Ne faites jamais ceci dans le " vrai monde "
15 $data [ result_message ] .= " <pre >\ n " ;
16 $data [ result_message ] .= $this - > email - > print_debugger () ;
17 $data [ result_message ] .= " </ pre >\ n " ;
18 $this - > email - > clear () ;
19 }
20 $this - > load - > view ( site / contact_result , $data ) ;
21 // (...)
22 }
23 }
Dans lexemple ci-dessus, nous avons test la valeur de retour de la mthode send() . Suivant
le cas, nous allons dfinir un message de succs ou dchec. Notez que dans lexemple, nous affichons
les informations derreur. Ne faites jamais cela sur un vrai site. Il sagit simplement ici
dillustrer lusage de la mthode print_debugger() . Idalement, ces informations devraient tre
fournies dans le cadre dune gestion globale des erreurs, et cela sort du tutoriel. Notez lusage de la
mthode clear() en cas derreur. Par dfaut, CodeIgniter fait une remise zro des paramtres
de le-mail en cas de russite, mais pas en cas dchec. Il faut alors le faire manuellement, sinon,
nous risquons denvoyer des informations des personnes qui nen sont pas les destinataires.
Nous allons galement modifier notre vue application/views/site/contact_result.php
pour quelle affiche ces messages.
1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 </ div >
5 < div class = " row alert <?= $result_class ; ? > " role = " alert " >
6 < ?= $result_message ; ? >
7 </ div >
8 < div class = " row text - center " >
9 < ?= anchor ( " index " , " Fermer " , [ class = > " btn btn - default " ]) ; ? >
10 </ div >
En cas de succs, nous devrions ainsi avoir un page qui ressemble la figure 2.7 la page 25 et
en cas dchec, une page qui ressemble la figure 2.8 la page 25.
Tout lheure, je vous avais parl de magie. Et si elle noprait pas ? Pas de panique, CodeIgniter
a prvu le coup. Il est possible de paramtrer lenvoi de-mail. Pour tous les paramtres disponibles,
je vous invite consulter laide en ligne.
CodeIgniter permet denvoyer les e-mail via la fonction mail() de PHP, le protocole SMTP
(comme avec un client de messagerie) ou sendmail (systme de messagerie de linux). La mthode
utilisable dpend de la configuration de votre serveur. Pour plus de dtail sur ce qui est possible de
faire, vous devez contacter votre fournisseur daccs.
Je vais vous montrer comment configurer CodeIgniter pour envoyer des mail via SMTP.
Pour travailler de manire propre, nous allons dabord crer le fichier de configuration
application/config/email.php ci-dessous. Pour connatre les paramtres donner, vous devez
contacter le fournisseur de service mail (si vous avez un client de messagerie, il sagit des paramtres
du compte).
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 $config [ protocol ] = " smtp " ;
5 $config [ smtp_host ] = " ********** " ;
6 $config [ smtp_user ] = " ********** " ;
7 $config [ smtp_pass ] = " ********** " ;
Maintenant, dans notre contrleur, nous allons charger ces paramtres. Notez le deuxime para-
mtre TRUE de la mthode $this->config->load() . Comme tous les paramtres de configuration
se trouvent dans le mme espace, nous pourrions craser dautres paramtres avec les ntres. En
mettant le second paramtre TRUE , nous crons un seule entre email et tous nos paramtres
sy trouverons.
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function contact () {
7 // (...)
8 $this - > load - > library ( email ) ;
9 $this - > config - > load ( email , TRUE ) ;
10 $this - > email - > initialize ( $this - > config - > item ( email ) ) ;
11 // (...)
12 }
13 }
2.6 Exercices
Normalement, si vous avez bien suivi ce cours, vous devriez avoir un site avec deux pages : la page
daccueil et une page de contact (tout a pour a ). Si ce nest pas le cas, vous pouvez utiliser
le code se trouvant dans le fichier site_base1.7z accompagnant ce document (galement
disponible sur mon site personnel).
2.6.1 noncs
Page de prsentation
Dans ce petit exercice, vous allez crer une page de prsentation propos . Le menu principal
(celui qui se trouve en haut de chaque page) devra avoir une entre pointant sur cette page de
prsentation. Le but de cet exercice est de voir si vous avez compris le principe dajout dune page.
Confirmation e-mail
Dans la page de contact, vous allez ajouter un champ qui demande lutilisateur de confirmer
sont e-mail. Ce champ est requis et devra tre gal au champ e-mail. Le but de cet exercice est de
voir si vous pouvez exploiter les rgles de validation des formulaires.
2.6.2 Corrections
Voici les solutions que je suggre pour les exercices proposs. Je vous invite ardemment dabord
faire les exercices avant de lire ces solutions.
Page de prsentation
Pour ajouter une page, il y a trois choses faire : crer la mthode correspondante dans le
contrleur, crer la vue et ajouter lentre dans le menu principal.
Nous allons modifier notre contrleur application/controllers/Site.php pour lui ajouter
la mthode apropos() :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function apropos () {
7 $data [ " title " ] = " propose de moi ... " ;
8
9 $this - > load - > view ( common / header , $data ) ;
10 $this - > load - > view ( site / apropos , $data ) ;
11 $this - > load - > view ( common / footer , $data ) ;
12 }
13 // (...)
14 }
Confirmation e-mail
Le champ de validation de ladresse e-mail de fait en deux tapes : ajouter le champs dans la
vue et ajouter la rgle de validation correspondante.
Modifions notre vues application/views/site/contact.php pour ajouter la demande de
confirmation entre ladresse e-mail et le titre :
1 <! -- (...) -- >
2 < div class = " form - group " >
3 < ?= form_label ( " Confirmation e - mail & nbsp ;: " , " email " , [ class = > " col - md -2
control - label " ]) ? >
4 < div class = " col - md -10 <?= empty ( form_error ( emailconf ) ) ? " " : " has - error " ? >
">
5 < ?= form_input ([ name = > " emailconf " , id = > " emailconf " , type = > email
, class = > form - control ] , set_value ( emailconf ) ) ? >
6 < span class = " help - block " > < ?= form_error ( emailconf ) ; ? > </ span >
7 </ div >
8 </ div >
9 <! -- (...) -- >
2.7 Conclusion
Voil, vous tes ce stade lheureux propritaire dun site web minimaliste : (au moins) une page
daccueil et un formulaire de contact. Cest vraiment le minimum pour un site, mais vous pourriez
dj le mettre en ligne. Oh, si vous avez fait lexercice avec la confirmation de ladresse e-mail pour
la page de contact, vous pouvez lenlever, ce nest pas une pratique trs courante sur le web.
Il est certain que pour obtenir ce rsultat, nous avons utilis un outils trop puissant, mais ne vous
inquitez pas, nous allons aborder ds le prochain chapitre des aspects beaucoup plus intressants.
Authentification
3.1 Introduction
Dans ce chapitre, nous allons voir comment faire pour vous identifier sur votre site. Nous verrons
comment adapter le contenu de vos pages suivant que vous soyez identifi ou non. Soyons clair ds
le dpart. Ce que je vais vous montrer ici nest pas une scurisation digne de Fort Knox . Il y a
dautres lments prendre en compte, comme le chiffrement. . .
Mais avant de rentrer dans le vif du sujet, je dois dabord introduire quelques concepts comme
les sessions et les bases de donnes. Bon, OK, vous tes senss maitriser ces domaines, mais on verra
comment les grer avec CodeIgniter. Et un petit rafraichissement ne fait pas de tord.
3.2 Sessions
3.2.1 Sessions de PHP
Si vous ne connaissez pas les sessions de PHP, je vous invite consulter laide en ligne ladresse.
Pour faire court, les sessions permette votre site de retenir des informations dune page
lautre, comme le fait dtre identifi ou pas, davoir mis des articles dans son panier ou pas, etc.
Ces informations sont stockes sur le serveur web.
Pour dmarrer une session, on utiliser linstruction session_start() . PHP va alors crer un
identifiant spcial qui va permettre de rcuprer les donnes sauvegardes. Ne vous prenez pas trop
la tte pour savoir comment cela fonctionne, PHP fait a trs bien sans vous . Si vous voulez
quand-mme comprendre, ou si vous avez des problmes, vous pouvez consulter laide en ligne (ce
nest pas indispensable, mais cest chaudement recommand ).
Les donnes sauvegarder devront tre enregistres dans la variable spciale $_SESSION . Il
sagit dun tableau associatif, une structure de donnes trs courante en PHP, qui est accessible
depuis nimporte o dans votre programme. Attention, cette variable naccepter pas tous les types
de donnes. Les donnes scalaires (nombres, chaines de caractres. . .) sont trs bien acceptes. Pour
les autres, nhsitez pas faire des tests.
Voici un petit exemple dutilisation des sessions en PHP :
1 <? php
2 session_start () ;
3 if (! isset ( $_SESSION [ count ]) ) {
4 $_SESSION [ count ] = 0;
5 } else {
6 $_SESSION [ count ]++;
7 }
8 echo " Valeur : " . $_SESSION [ count ];
9 ?>
La premire vois que vous allez charger la page, la variable $_SESSION[count] sera initialise
0 , ensuite, chaque fois que vous chargerez la page, la valeur sera incrmente de 1 . Cette
incrmentation ne vaut que pour vous. Si quelquun dautre affiche la page, ou si vous utilisez un
autre navigateur, le dcompte sera diffrent.
Pour accder aux donnes de session, nous pouvons utiliser indiffremment la variable classique
$_SESSION ou lobjet $this->session . Et pour raliser lexemple de notre compteur de la section
ci-avant, nous pourrions dfinir dans notre contrleur :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function session_test () {
7 $this - > session - > count ++;
8 echo " Valeur : " . $this - > session - > count ;
9 }
10 }
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 31
Pour une configuration sur un serveur MySQL, les paramtres importants sont le nom du serveur
de base de donnes, le nom dutilisateur de la base de donnes, son mot de passe, le nom de la base de
donnes et le pilote. Normalement le pilote est mysqli et le reste est donn par votre fournisseur
daccs. Si vous utilisez un autre type serveur de base de donnes que MySQL, il faudra vous rfrer
la documentation (allez ! je change un coup ), et utiliser le paramtre dsn .
Ensuite, pour pouvoir accder la base de donnes, il suffira de charger la librairie Database .
Comme nous en aurons besoin trs souvent, nous la chargerons automatiquement en modifiant le
fichier application/config/autoload.php .
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $autoload [ libraries ] = array ( database , session ) ;
5 // (...)
CHAPITRE 3. AUTHENTIFICATION
32 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Les mthodes du constructeur de requte se rapprochent trs fort des commandes SQL. Il en
propose aussi des tas dautres. Si cela vous intresse, nhsitez pas consulter laide en ligne (a y
est, je recommence ).
3.4 Implmentation
Voyons comment utiliser les sessions et la base de donnes. Pour pouvoir identifier une personne,
nous allons dfinir une table avec des noms dutilisateurs et leur mot de passe et crer un modle
pour y accder.
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 33
Lidentifiant est de type entier et son incrmentation est automatique. Nous avons galement
veiller ce que les noms dutilisateur soient uniques.
Maintenant ajoutons un utilisateur. Comme nous navons implment aucune interface ce
sujet, nous devrons le faire via une requte SQL.
1 INSERT INTO login ( username , password , status ) VALUES ( admin ,
$ 2 y $ 1 0 $ U y X E Y p p M u V n Y N 3 V d 8 l / e n u 3 U o L r 9 z P T O X u Q G W i Z / h4GQejoCJvlH . , A ) ;
Oups ! Jen vois qui sont un peu effray par le mot de passe. Ne vous inquitez pas, ce nest
pas ce que vous allez devoir taper pour vous identifier. Un bonne pratique (pour ne pas dire une
obligation) est de ne jamais sauvegarder en clair un mot de passe dans une base de donnes. Ainsi,
si cette dernire se fait pirater, les pirates ne pourront pas faire grand-chose avec (OK, cest encore
un honteux raccourcis, disons que cela ralenti fortement le processus de piratage). Le mot de passe
est ici password et nous verrons plus tard comment il a t encod.
3.4.2 Modle
Comme nous sommes dans une structure MVC, nous allons crer un modle pour accder aux
donnes didentification. Attention la claque, je vous livre le code en vrac. Il est sauvegarder
dans le fichier application/models/Auth_user.php .
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Auth_user extends CI_Model {
5
6 protected $_username ;
7 protected $_id ;
8
9 public function __construct () {
10 parent :: __construct () ;
11 $this - > lo ad_fro m_sess ion () ;
12 }
13
14 public function __get ( $key ) {
15 $method_name = get_property_ . $key ;
16 if ( method_exists ( $this , $method_name ) ) {
17 return $this - > $method_name () ;
18 } else {
19 return parent :: __get ( $key ) ;
20 }
21 }
22
23 protected function clear_data () {
24 $this - > _id = NULL ;
25 $this - > _username = NULL ;
26 }
27
28 protected function clear_session () {
29 $this - > session - > auth_user = NULL ;
30 }
31
32 protected function get_property_id () {
33 return $this - > _id ;
34 }
35
CHAPITRE 3. AUTHENTIFICATION
34 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
36 protected function g e t _ p r o p e r t y _ i s _ c o n n e c t e d () {
37 return $this - > _id !== NULL ;
38 }
39
40 protected function g e t _ p r o p e r t y _ u s e r n a m e () {
41 return $this - > _username ;
42 }
43
44 protected function load _from _sessi on () {
45 if ( $this - > session - > auth_user ) {
46 $this - > _id = $this - > session - > auth_user [ id ];
47 $this - > _username = $this - > session - > auth_user [ username ];
48 } else {
49 $this - > clear_data () ;
50 }
51 }
52
53 protected function load_user ( $username ) {
54 return $this - > db
55 -> select ( id , username , password )
56 -> from ( login )
57 -> where ( username , $username )
58 -> where ( status , A )
59 -> get ()
60 -> first_row () ;
61 }
62
Vous avez tenu le choc (ou pas ) ? OK, passons maintenant aux explications.
Lide de base, est de permettre un utilisateur de se connecter et de se dconnecter, et de
garder cette information dans une session.
Tout dabord, notre modle va tendre la classe CI_Model . Cela va nous permettre dutiliser
les librairies, les paramtres de configurations. . . dj chargs. Pour plus de dtails sur les modles,
vous pouvez consulter laide en ligne.
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 35
3.4.3 Authentification
Pour pouvoir sidentifier, nous devrons utiliser la mthode login() en lui passant le nom
dutilisateur et le mot de passe.
1 $this - > auth_user - > login ( $username , $password ) ;
CHAPITRE 3. AUTHENTIFICATION
36 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Mettons maintenant cela en pratique sur notre site. Il y a un peu de travail, mais ce nest pas
compliqu.
Tout dabord, modifions la vue application/views/common/header.php qui sert dentte de
nos pages pour ajouter le lien vers la page didentification :
1 <! -- (...) -- >
2 < div class = " collapse navbar - collapse " id = " main_nav " >
3 < ul class = " nav navbar - nav " >
4 < li > < ?= anchor ( index , " Accueil " ) ; ? > </ li >
5 < li > < ?= anchor ( apropos , " propos " ) ; ? > </ li >
6 < li > < ?= anchor ( contact , " Contact " ) ; ? > </ li >
7 </ ul >
8 < ul class = " nav navbar - nav navbar - right " >
9 < li > < ?= anchor ( connexion , " Connexion " ) ; ? > </ li >
10 </ ul >
11 </ div >
12 <! -- (...) -- >
Vous pouvez afficher la page daccueil pour vrifier que le lien apparait bien dans le menu. Et
a ne sert rien de cliquer maintenant sur ce lien, il ne mne rien. . .
Crons maintenant la vue application/views/site/connexion.php . Il sagit dun simple
formulaire, similaire la page de contact.
1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 < hr / >
5 </ div >
6 < div class = " row " >
7 < ?= form_open ( connexion , [ class = > form - horizontal ]) ; ? >
8 < div class = " form - group " >
9 < ?= form_label ( " Nom d utilisateur & nbsp ;: " , " username " , [ class = > " col - md
-2 control - label " ]) ? >
10 < div class = " col - md -10 <?= empty ( form_error ( username ) ) ? " " : " has - error "
?>">
11 < ?= form_input ([ name = > " username " , id = > " username " , class = >
form - control ] , set_value ( username ) ) ? >
12 < span class = " help - block " > < ?= form_error ( username ) ; ? > </ span >
13 </ div >
14 </ div >
15 < div class = " form - group " >
16 < ?= form_label ( " Mot de passe & nbsp ;: " , " password " , [ class = > " col - md -2
control - label " ]) ? >
17 < div class = " col - md -10 <?= empty ( form_error ( password ) ) ? " " : " has - error "
?>">
18 < ?= form_password ([ name = > " password " , id = > " password " , class = >
form - control ] , set_value ( password ) ) ? >
19 < span class = " help - block " > < ?= form_error ( password ) ; ? > </ span >
20 </ div >
21 </ div >
22 < div class = " form - group " >
23 < div class = " col - md - offset -2 col - md -10 " >
24 < ?= form_submit ( " send " , " Envoyer " , [ class = > " btn btn - default " ]) ; ? >
25 </ div >
26 </ div >
27 < ?= form_close () ? >
28 </ div >
29 </ div >
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 37
Si les donnes du formulaire sont correctes, nous allons tenter didentifier lutilisateur et nous
rediriger vers la page daccueil, sans vrifier le rsultat de lauthentification. Nous rglerons ce
problme plus tard.
CHAPITRE 3. AUTHENTIFICATION
38 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
3.4.4 Dconnexion
Pour pouvoir de dconnecter, nous devrons utiliser la mthode logout() .
1 $this - > auth_user - > logout () ;
Cette dernire va simplement effacer les donnes du modle et de la session grce aux mthodes
clear_data() et clear_session() .
Pour mettre cela en pratique, nous allons simplement crer une entre dans le menu principal
et une mthode dans notre contrleur.
La modification de la vue application/views/common/header.php sera faire comme suit :
1 <! -- (...) -- >
2 < div class = " collapse navbar - collapse " id = " main_nav " >
3 < ul class = " nav navbar - nav " >
4 < ul class = " nav navbar - nav " >
5 < li > < ?= anchor ( index , " Accueil " ) ; ? > </ li >
6 < li > < ?= anchor ( apropos , " propos " ) ; ? > </ li >
7 < li > < ?= anchor ( contact , " Contact " ) ; ? > </ li >
8 </ ul >
9 < ul class = " nav navbar - nav navbar - right " >
10 < li > < ?= anchor ( connexion , " Connexion " ) ; ? > </ li >
11 < li > < ?= anchor ( deconnexion , " D connexion " ) ; ? > </ li >
12 </ ul >
13 </ div >
14 <! -- (...) -- >
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 39
Figure 3.2 Menu pour un visiteur non connec- Figure 3.3 Menu pour un utilisateur connect
te
1 <! -- (...) -- >
2 < div class = " collapse navbar - collapse " id = " main_nav " >
3 < ul class = " nav navbar - nav " >
4 < li > < ?= anchor ( index , " Accueil " ) ; ? > </ li >
5 < li > < ?= anchor ( apropos , " propos " ) ; ? > </ li >
6 < li > < ?= anchor ( contact , " Contact " ) ; ? > </ li >
7 </ ul >
8 < ul class = " nav navbar - nav navbar - right " >
9 <? php if ( $this - > auth_user - > is_connected ) : ? >
10 < li > < ?= anchor ( deconnexion , " D connexion " ) ; ? > </ li >
11 <? php else : ? >
12 < li > < ?= anchor ( connexion , " Connexion " ) ; ? > </ li >
13 <? php endif ; ? >
14 </ ul >
15 <? php if ( $this - > auth_user - > is_connected ) : ? >
16 <p class = " navbar - text navbar - right " >| </ p >
17 <p class = " navbar - text navbar - right " > Bienvenue < strong > < ?= $this - > auth_user - >
username ; ? > </ strong > </ p >
18 <? php endif ; ? >
19 </ div >
20 <! -- (...) -- >
Les figures 3.2 la page 39 et 3.3 la page 39 nous montrent les diffrences qui devraient
apparaitre sur vos pages suivant que le visiteur sest identifi ou non.
Maintenant que nous avons fait un peut de chirurgie esthtique, faisons un peu de mdecine
curative sur notre contrleur. Avant, nous ne vrifions pas si lidentification avait russi ou pas. Nous
allons le faire maintenant. Et en cas dchec, nous allons rafficher le formulaire de connexion avec
un message derreur. Voici quoi va ressembler le nouveau code de notre mthode connexion() .
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
CHAPITRE 3. AUTHENTIFICATION
40 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
21 }
22
23 $this - > load - > view ( common / header , $data ) ;
24 $this - > load - > view ( site / connexion , $data ) ;
25 $this - > load - > view ( common / footer , $data ) ;
26 }
27 }
Maintenant, si le formulaire est valide, nous tentons une authentification. Si elle russi, nous
serons redirig vers la page daccueil. Sinon, un message derreur est dfini. Nous allons modifier la
vue application/views/site/connexion.php pour afficher ce message derreur en cas dchec
didentification.
1 < div class = " container " >
2 <! -- (...) -- >
3 < div class = " row " >
4 < ?= form_open ( connexion , [ class = > form - horizontal ]) ; ? >
5 <? php if (! empty ( $login_error ) ) : ? >
6 < div class = " form - group " >
7 < div class = " col - md - offset -2 col - md -10 has - error " >
8 < span class = " help - block " > < ?= $login_error ; ? > </ span >
9 </ div >
10 </ div >
11 <! -- (...) -- >
12 <? php endif ; ? >
13 < ?= form_close () ? >
14 </ div >
15 <! -- (...) -- >
3.5 Exercice
Normalement, si vous avez bien suivi ce cours, vous devriez avoir un site avec trois pages : la
page daccueil, une page propos et une page de contact. Vous avez galement un mcanisme
qui vous permet de vous identifier. Si ce nest pas le cas, vous pouvez utiliser le code se trouvant
dans le fichier site_base2.7z accompagnant ce document (galement disponible sur mon site
personnel).
3.5.1 nonc
Voici un exercice qui va vous permettre de rviser quelques concepts et de mettre en application
ce que nous venons de voir. Vous devez crer un contrleur qui va grer un panneau de contrle. Ce
dernier ne va pour linstant rien contenir, et le contrleur ne devra avoir quune page dindex. Par
contre la page ne peut tre accessible que par des personnes identifies. Lentre du menu vers ce
panneau de contrle ne sera galement visible que pour les personnes identifies.
3.5.2 Correction
Voici la solution que je suggre pour lexercice propos. Je vous invite ardemment dabord
faire lexercice avant de lire cette solution.
Pour raliser cet exercice, nous allons devoir crer un nouveau contrleur, une nouvelle vue et
modifier une autre.
CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 41
Le contrleur na quune mthode : index() . Cette dernire va simplement rediriger les visiteurs
sur la page daccueil sils ne sont pas identifis ou, sinon, afficher la page principale du panneau de
contrle.
Nous allons ensuite crer la vue application/views/dashboard/index.php comme ci-
dessous. Elle ne fera quafficher le titre et un petit texte quelconque.
1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 < hr / >
5 </ div >
6 < div class = " row " >
7 <p > Ceci est mon panneau de contr le </ p >
8 </ div >
9 </ div >
CHAPITRE 3. AUTHENTIFICATION
42 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
3.6 Conclusion
Voil, vous avez un systme dauthentification basic qui fonctionne trs correctement. Je ne suis
pas un expert de la scurit, je ne doute pas non plus quune attaque de grande ampleur ne fasse
tomber cette barrire, mais pour un site personnel, ce devrait tre trs largement suffisant.
Le systme illustr ici est trs simple et ne permet de diffrencier que les utilisateurs connects
des simples visiteurs. Toutes les personnes identifies ont ainsi les mmes droits. Nous pourrions
utiliser les noms des utilisateurs pour les diffrencier et leur donner des droits diffrents, mais cest
une trs mauvaise pratique. Il est prfrable dutiliser des groupes et de donner les permissions sur
ces derniers. On appelle cela le contrle daccs bas sur les rles ou RBAC (acronyme de Role-
based access control ). Je vous laisse vous renseigner sur le sujet par vous-mme, les rfrences sur
internet sont nombreuses.
CHAPITRE 3. AUTHENTIFICATION
Chapitre 4
Blog
4.1 Introduction
Maintenant que nous avons mis en place un systme dauthentification, nous allons pouvoir
commencer les choses srieuses. Nous allons mettre en place un blog. Bon, ne vous imaginez pas
que vous allez crer le prochain gestionnaire de contenu la mode (h, je laurai fait avant vous
si ctait si simple ! ), le but de ce chapitre est juste de vous montrer au travers dun exemple
concret comment interagir avec une base de donnes.
Au niveau des fonctionnalits, nous allons dvelopper un blog basic, mais fonctionnel. Nous
allons crer, publier, modifier, supprimer des articles. Avec cela, nous allons couvrir peu prs
toutes les oprations lmentaires concernant les bases de donnes. Libre vous, ensuite, de creuser
le sujet et daller plus loin.
4.3.1 Modle
Gnralement, on cre un modle par entit. Personnellement, je travaille un peu diffremment.
Jaime bien avoir en plus un modle par liste. Ainsi, nous allons dabord crer notre modle pour
la liste des articles, et nous crerons un peu plus tard le modle pour larticle en lui-mme. Si vous
voulez polmiquer sur la pertinence de cette manire de faire, on risque dy passer du temps. Alors,
si vous ntes pas du mme avis, faites comme bon vous semble.
Pour dfinir notre modle, nous allons dans un premier temps dfinir ce que nous allons afficher.
Cest simple, il sagit du contenu de la table Article . Toutefois, nous devrons remplacer liden-
tifiant de lauteur par son nom dutilisateur et le code du statut pas un libell comprhensible. De
plus, nous nafficherons quune partie du contenu de larticle. Cela naurait pas beaucoup de sens
dafficher larticle en entier lorsquon liste tous les articles.
Pour limiter le contenu de larticle, nous allons utiliser une fonction SQL, nous navons pas trop
le choix (en fait, si, mais cela va beaucoup compliquer les choses, croyez moi sur parole). Si nous
voulons limiter le contenu sur base dun certain nombre de caractres, nous pouvons utiliser la
fonction SUBSTRING() , mais il y a de fortes chances pour que le dernier mot soit coup, et ce ne
sera pas trs joli. Nous pourrions galement utiliser la fonction SUBSTRING_INDEX() en donnant
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 45
un espace comme dlimiteur, mais alors, l, nous aurons une incertitude quand la taille du texte
affich (suivant la taille des mots affichs). Choisissons la seconde solution, cest la meilleure (bon,
cest vrai, a se discute aussi, disons quil fallait en choisir une et il fallait justifier ce choix, alors. . .
). Attention, les fonctions cites ici concernent MySQL. Si vous utiliser un autre serveur de base
de donnes, veuillez vous rfrer sa documentation.
Pour avoir le nom de lauteur de larticle plutt que son identifiant, il va falloir faire une jointure
entre les tables Login et Article . Le constructeur de requte de CodeIgniter fait a trs bien,
mais au niveau performance, il vaut mieux utiliser une vue. En effet, cette requte sera trs souvent
effectue, mme pour afficher les dtails dun article.
Nous allons donc crer une vue comme suit :
1 CREATE VIEW article_username
2 AS
3 SELECT article . id ,
4 title ,
5 alias ,
6 content ,
7 date ,
8 article . status ,
9 username AS author ,
10 author_id
11 FROM article INNER JOIN login ON article . author_id = login . id ;
22 protected function g e t _ p r o p e r t y _ h a s _ i t e m s () {
23 return count ( $this - > _list ) > 0;
24 }
25
26 protected function ge t_ pr op er ty _i te ms () {
27 return $this - > _list ;
28 }
29
30 protected function g e t _ p r o p e r t y _ n u m _ i t e m s () {
31 return count ( $this - > _list ) ;
32 }
CHAPITRE 4. BLOG
46 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
33
34 public function load ( $show_hidden = FALSE ) {
35 $this - > db - > select ( " id , title , alias , SUBSTRING_INDEX ( content , , 20) AS
content , date , status , author " )
36 -> from ( article_username )
37 -> order_by ( date , DESC ) ;
38 if (! $show_hidden ) {
39 $this - > db - > where ( status , P ) ;
40 }
41 $this - > _list = $this - > db - > get ()
42 -> result () ;
43 }
44 }
Vous devez commencer me connatre, maintenant. Je vous livre dabord le paquet et jexplique
ensuite.
Jai utilis la mme mthode __get() que pour le modle servant lauthentification (il faudra
que je pense crer une sur-classe avec les mthodes courantes). Si vous avez rat les explications
la concernant, je vous invite pour une sance de rattrapage la section 3.4.2 la page 33.
Jai dfini trois proprits en lecture seule : items 1 qui retourne la liste des articles et
num_items qui donne le nombre darticles et has_items qui indique sil y a des articles ou
pas. Jai galement dfini une mthode load() qui va charger les articles.
Vous constaterez que la mthode load() prend un paramtre $show_hidden qui est FALSE
par dfaut. Nous laissons ici la possibilit de nafficher que les articles publis ou galement les
brouillons et les articles supprims. Nous pouvons mesurer ici lintrt du constructeur de requte.
La squence normale dutilisation de ce modle est dabord de le charger, puis dappeler
la mthode load() . Ensuite, les articles seront accessibles via la proprit items . Les autres
lments seront utiles dans les vues (croyez-moi, vous vous en rendrez vite compte ). Si vous
comptez publier votre site, il faudra faire voluer ce modle, notamment pour ajouter des fonctions
de pagination.
4.3.2 Vue
Javais dabord envisag de faire le contrleur avant la vue, mais je suis sr que certain(e)s
dentre vous auraient t tent(e)s dafficher la page avant davoir fini. Alors, faisons la vue
application/views/blog/index.php en premier :
1 < div class = " container " >
2 < div class = " row " >
3 < div class = " col - md -12 " >
4 < ?= heading ( $title ) ; ? >
5 < hr / >
6 </ div >
7 </ div >
8 < div class = " row " >
9 < div class = " col - md -12 " >
10 <p class = " text - right " > Nombre d articles : < ?= $this - > articles - > num_items ;
? > </ p >
11 </ div >
12 </ div >
13 < div class = " row " >
1. Idalement, au lieu de la proprit items , nous utiliserions un itrateur, mais je ne voulais pas vous perdre
ici.
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 47
Nous allons afficher le titre de la page et ensuite le nombre darticle grce la proprit
num_items de notre modle (je vous avais dit que a servirait ). Ensuite, nous faisons un
test pour savoir sil y a des articles ou pas grce la proprit has_items . Sil ny a pas darticle,
un message davertissement sera affich.
Sil y a des articles, nous excuterons une boucle pour les afficher. Alors ici, jai inclus un petit
concept intressant placer dans un entretien dembauche : la vue partielle. Certaines personnes
en font des pataqus autour de ce concept, mais en ralit, cest trs simple : il sagit dune vue
appele partir dune autre vue. Une mme vue partielle peut tre appele partir de diffrentes
autres vues pour avoir un bout de code identique sur plusieurs pages. Cela vite la redondance.
Alors si vous obtenez un job grce a, noubliez pas ma commission.
Voici la vue partielle application/views/blog/article_resume.php :
1 < div class = " col - md -4 " >
2 < ?= heading ( htmlentities ( $title ) , 2) ; ? >
3 <p >
4 < small >
5 < ?= nice_date ( $date , d / m /Y ) ; ? >
6 -
7 < ?= $author ? >
8 <? php if ( $this - > auth_user - > is_connected ) : ? >
9 -
10 < ?= $this - > article_status - > label [ $status ]; ? >
11 <? php endif ; ? >
12 </ small >
13 </ p >
14 <p > < ?= nl2br ( htmlentities ( $content ) ) ; ? > ... </ p >
15 </ div >
Comme nous avons pass un article en paramtre de notre vue, nous accdons directement
ses attributs. Aussi, vous aurez remarqu lutilisation de la fonction PHP htmlentities() . Si un
utilisateur tape du code HTML, il sera affich et non interprt. Une rgle de base : nafficher
jamais tel quel du texte introduit par une utilisateur. Vous pourriez avoir de drles de
surprises. . .
Je vois que certains dentre vous se posent des questions propos de certains lments de cette
vue. Cest normal, elle contient des choses que vous navez pas encore vues. Pour ceux qui ne se
posent pas de question, relisez bien le code, vous avez loup des trucs.
Tout dabord, il y a la fonction nice_date() . Elle est fournie par le helper Date et permet
de formater facilement une date.
CHAPITRE 4. BLOG
48 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 49
53 }
Notre modle contiendra une proprit label qui retournera un tableau des textes des statuts
avec un formatage HTML, une proprit text qui retournera un tableau des textes des statuts et
une proprit codes qui retourne la liste des codes possibles.
Vous constaterez que les donnes sont hard-codes 2 dans le constructeur. Sachez que cest une
pratique proscrire. Idalement, vous crerez une table dans votre base de donnes pour contenir
la liste des statuts. Javoue quici, jai fait preuve dun peu de paresse. Alors, faites ce que je dis,
mais pas ce que je fais .
4.3.3 Contrleur
Voil, maintenant tout devrait tre prt pour pouvoir afficher la liste des articles de notre blog.
Il ny a plus que le contrleur application/controllers/Blog.php ajouter :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
Dans la page dindex, nous allons charger le helper Date (pour la fonction nice_date() ),
et les modles Article et Article_status . Nous chargeons ensuite les donnes de la base de
donnes et affichons les vues. Suivant que lutilisateur soit connect ou pas, nous afficherons les
articles cachs ou non. En allant sur ladresse http://localhost/blog/index.html, vous devriez
avoir une page ressemblant la figure 4.2 la page 50.
Ah ! oui, si vous avez bien regard lillustration 4.2 la page 50, vous aurez constat quil y avait
une entre dans le menu principal pour le blog. Vous devriez tre capable de le faire vous-mme
maintenant . Vous avez du mal et avez besoin dun indice ? Revoyez les exercices de la section
2.6.1 la page 26.
4.3.4 Routage
Pour consulter la page daccueil du blog, ile faut aller ladresse http://localhost/blog/
index.html. Si nous utilisons ladresse http://localhost/blog/, nous aurons une erreur. En effet,
si nous nous reportons la section 2.4.1 la page 9, nous avons dfini que toutes les URI ne
comportant quun seul paramtre seront rediriges vers le contrleur Site . Ainsi, blog sera
redirig vers site/blog .
2. codes en dur , cest dire que les donnes se retrouvent dans le code
CHAPITRE 4. BLOG
50 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Jaimerais que ladresse http://localhost/blog/ nous donne la liste des articles de notre
blog. Comme toujours, avec CodeIgniter, cest trs simple. Nous allons juste modifier le fichier
application/config/routes.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $route [ de fau lt _c on tr ol le r ] = site ;
5 $route [ blog ] = blog / index ; // l URI blog sera redirig e vers blog / index
6 $route [ (: any ) ] = site / $1 ;
Attention ! $route[blog] doit se trouver avant $route[(:any)] , sinon cest cette der-
nire qui sera prise en compte et nous aurons toujours une erreur si nous voulons accder ladresse
http://localhost/blog/.
4.4.1 Modle
Nous allons crer le modle application/models/Article.php qui va reprsenter un article
comme suit :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Article extends CI_Model {
5
6 protected $_alias ;
7 protected $_author ;
8 protected $_author_id ;
9 protected $_content ;
10 protected $_date ;
11 protected $_id ;
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 51
12 protected $_status ;
13 protected $_title ;
14
57 protected function g e t _ p r o p e r t y _ a u t h o r _ i d () {
58 return $this - > _author_id ;
59 }
60
61 protected function g e t _ p r o p e r t y _ c o n t e n t () {
62 return $this - > _content ;
63 }
64
65 protected function get_ prope rty_da te () {
66 return $this - > _date ;
67 }
68
CHAPITRE 4. BLOG
52 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
73 protected function g e t _ p r o p e r t y _ i s _ f o u n d () {
74 return $this - > _id !== NULL ;
75 }
76
77 protected function g e t_ p r op e r ty _ s ta t u s () {
78 return $this - > _status ;
79 }
80
81 protected function ge t_ pr op er ty _t it le () {
82 return $this - > _title ;
83 }
84
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 53
4.4.2 Vue
Comme vue pour la cration dun article, nous aurons un formulaire clas-
sique comparable aux formulaires de contact et dauthentification. Voici donc la vue
application/views/blog/form.php :
CHAPITRE 4. BLOG
54 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
1 < div class = " container " >
2 < div class = " row " >
3 < div class = " col - md -12 " >
4 < ?= heading ( $title ) ; ? >
5 < hr / >
6 </ div >
7 </ div >
8 < div class = " row " >
9 < div class = " col - md -12 " >
10 < ?= form_open ( blog / nouvel_article , [ class = > form - horizontal ]) ; ? >
11 < div class = " form - group " >
12 < ?= form_label ( " Titre & nbsp ;: " , " title " , [ class = > " col - md -2 control -
label " ]) ? >
13 < div class = " col - md -10 <?= empty ( form_error ( title ) ) ? " " : " has - error "
?>">
14 < ?= form_input ([ name = > " title " , id = > " title " , class = > form -
control ] , set_value ( title ) ) ? >
15 < span class = " help - block " > < ?= form_error ( title ) ; ? > </ span >
16 </ div >
17 </ div >
18 < div class = " form - group " >
19 < ?= form_label ( " Texte & nbsp ;: " , " content " , [ class = > " col - md -2 control -
label " ]) ? >
20 < div class = " col - md -10 <?= empty ( form_error ( content ) ) ? " " : " has - error
"?>">
21 < ?= form_textarea ([ name = > " content " , id = > " content " , class = >
form - control ] , set_value ( content ) ) ? >
22 < span class = " help - block " > < ?= form_error ( content ) ; ? > </ span >
23 </ div >
24 </ div >
25 < div class = " form - group " >
26 < ?= form_label ( " Statut & nbsp ;: " , " status " , [ class = > " col - md -2 control -
label " ]) ? >
27 < div class = " col - md -10 <?= empty ( form_error ( status ) ) ? " " : " has - error "
?>">
28 < ?= form_dropdown ( " status " , $this - > article_status - > text , set_value (
status ) , [ id = > " content " , class = > form - control ]) ? >
29 < span class = " help - block " > < ?= form_error ( status ) ; ? > </ span >
30 </ div >
31 </ div >
32 < div class = " form - group " >
33 < div class = " col - md - offset -2 col - md -10 " >
34 < ?= form_submit ( " send " , " Envoyer " , [ class = > " btn btn - default " ]) ; ? >
35 </ div >
36 </ div >
37 < ?= form_close () ? >
38 </ div >
39 </ div >
40 </ div >
Notez que pour le statut, nous utilisons un liste de choix. Pour la remplir, nous nous servons du
modle Article_status dfini la section 4.3.2 la page 46.
Pour accder ce formulaire, nous devons ajouter un lien quelque part. Je vous propose de le
faire sur la page affichant la liste des articles, ct du nombre darticles. Modifions donc la vue
application/views/blog/index.php :
1 <! -- (...) -- >
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 55
Le bouton de cration darticle ne sera visible que pour les personnes connectes. Cest normal,
nous avions dfini quil fallait tre connect pour pouvoir crer un article. Et aussi, ce nest pas
encore la peine de cliquer dessus, il faut que le contrleur soit modifi pour afficher le formulaire.
4.4.3 Contrleur
Nous allons modifier le contrleur application/controllers/Blog.php cr la section 4.3.3
la page 49 en ajoutant la mthode publique nouvel_article()
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Blog extends CI_Controller {
5 // (...)
6 public function nouvel_article () {
7 if (! $this - > auth_user - > is_connected ) {
8 redirect ( blog / index ) ;
9 }
10 $this - > load - > helper ( form ) ;
11 $this - > load - > library ( form_validation ) ;
12 $this - > load - > model ( article_status ) ;
13 $this - > s e t _ b l o g _ p o s t _ v a l i d a t i o n () ;
14
15 $data [ title ] = " Nouvel article " ;
16
17 if ( $this - > form_validation - > run () == TRUE ) {
18 $this - > load - > model ( article ) ;
19 $this - > article - > author_id = $this - > auth_user - > id ;
20 $this - > article - > content = $this - > input - > post ( content ) ;
21 $this - > article - > status = $this - > input - > post ( status ) ;
22 $this - > article - > title = $this - > input - > post ( title ) ;
23 $this - > article - > save () ;
24 if ( $this - > article - > is_found ) {
25 redirect ( blog / index ) ;
26 }
27 }
28 $this - > load - > view ( common / header , $data ) ;
29 $this - > load - > view ( blog / form , $data ) ;
CHAPITRE 4. BLOG
56 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
La premire chose qui est faite dans la mthode nouvel_article() , cest de vrifier que
lutilisateur est bien identifi. Si ce nest pas le cas, nous allons afficher la page daccueil de notre
blog (la liste des articles).
Nous avons dj utilis le fichier application/config/form_validation.php pour valider
des donnes dun formulaire. Mais ici, nous allons faire un peu diffremment. Personnellement, je
ne conseille pas de mlanger diffrentes techniques dans un mme projet, mais on va dire que cest
lexercice qui le veut.
Donc, pour la validation du formulaire, jai cr une mthode set_blog_post_validation() ,
et cela pour deux raisons. Tout dabord, je vais utiliser les mmes paramtres de validation pour un
nouvel article et pour la modification dun article. Vous avez raison, on peut le faire avec le fichier
de configuration, mais cest un peu brouillon. Deuximement, je rcupre la liste des codes possibles
pour le statut partir du modle Article_status .
Si les donnes du formulaire sont valides, nous chargeons le modle Article , remplissons les
donnes et le sauvegardons. Si cela a fonctionn, nous affichons la liste des articles.
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 57
4.5.1 Modle
Nous avons dj dfini notre modle la section 4.4.1 la page 50. Il ny a rien changer.
4.5.2 Contrleur
Dans notre contrleur application/controllers/Blog.php , nous allons dfinir une mthode
article() prenant lidentifiant de larticle afficher :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Blog extends CI_Controller {
5 // (...)
6 public function article ( $id = NULL ) {
7 if (! is_numeric ( $id ) ) {
8 redirect ( blog / index ) ;
9 }
10 $this - > load - > helper ( date ) ;
11 $this - > load - > model ( article ) ;
12 $this - > load - > model ( article_status ) ;
13 $this - > article - > load ( $id , $this - > auth_user - > is_connected ) ;
14
15 if ( $this - > article - > is_found ) {
16 $data [ title ] = htmlentities ( $this - > article - > title ) ;
17
18 $this - > load - > view ( common / header , $data ) ;
19 $this - > load - > view ( blog / article , $data ) ;
20 $this - > load - > view ( common / footer , $data ) ;
21 } else {
22 redirect ( blog / index ) ;
23 }
24 }
25 }
Nous allons dabord nous assurer que lidentifiant donn est bien un nombre (dans la base de
donnes, les identifiants sont numriques). Ensuite, chargeons nos diffrentes ressources (helper,
modles). Et enfin, nous chargeons les donnes depuis la base de donnes. Si le visiteur est identifi,
il aura accs aux articles non publies, sinon, seuls les articles publis seront visibles. Si larticle est
trouv, il sera affich. Sinon, nous serons redirig sur la page daccueil du blog.
CHAPITRE 4. BLOG
58 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
4.5.3 Routage
Normalement, pour accder notre article, nous devons utiliser ladresse http://localhost/
blog/article/<id>. Sachez que les moteurs de recherche utilisent les URL pour valuer la per-
tinence des pages par rapport aux termes recherchs, et ladresse que nous avons nest pas trs
parlante.
Nous allons donc optimiser nos adresses pour que nos pages soient mieux rfrences dans les
moteurs de recherche (en anglais on parle de SEO, Search Engine Optimization). Je vous avais parl
du champ alias qui allait tre utilis pour gnrer nos URL. Voici le moment de le mettre en
pratique.
Donc, pour optimiser nos adresses, nous pourrions avoir une URL du style http://localhost/
blog/article/<alias>. Mais voil, dans notre base de donnes, nous pourrions avoir deux articles
avec le mme titre, et donc avec le mme alias. Il nous faut donc garder lidentifiant dans ladresse.
Les possibilits de combinaison de lidentifiant et de lalias sont nombreuses, il nous faut donc en
choisir une : http://localhost/blog/<alias>_<id>.html.
Vous constaterez que jai retir la partie article de lURL. Cest tout fait possible.
Nous pourrions mme retirer la partie blog , mais ce serait plus alatoire pour le routage,
et moins cohrent pour les visiteurs. Voici comment nous allons configurer cela dans le fichier
application/config/routes.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $route [ blog /(: any ) _ (: num ) ] = blog / article / $2 ; // $2 se r f re au contenu du
5 // deuxi me jeu de parenth ses
6 // (...)
4.5.4 Vue
Maintenant que nous avons dfini la manire daccder notre article, nous allons dfinir la vue
application/views/blog/article.php :
1 < div class = " container " >
2 < div class = " row " >
3 < div class = " col - md -10 " >
4 < div class = " row " >
5 < div class = " col - md -12 " >
6 < ?= heading ( $title ) ; ? >
7 <p >
8 < small >
9 < ?= nice_date ( $this - > article - > date , d / m /Y ) ; ? >
10 -
11 < ?= $this - > article - > author ? >
12 <? php if ( $this - > auth_user - > is_connected ) : ? >
13 -
14 < ?= $this - > article_status - > label [ $this - > article - > status ]; ? >
15 <? php endif ; ? >
16 </ small >
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 59
17 </ p >
18 < hr / >
19 </ div >
20 </ div >
21 < div class = " row " >
22 < div class = " col - md -12 " >
23 < ?= nl2br ( htmlentities ( $this - > article - > content ) ) ; ? >
24 </ div >
25 </ div >
26 </ div >
27 < div class = " col - md -2 " >
28 < ul class = " nav nav - pills nav - stacked " >
29 < li > < ?= anchor ( blog / index , " Liste articles " ) ? > </ li >
30 <? php if ( $this - > auth_user - > is_connected ) : ? >
31 < li > < ?= anchor ( blog / nouvel_article , " Nouvel article " ) ? > </ li >
32 <? php endif ; ? >
33 </ ul >
34 </ div >
35 </ div >
36 </ div >
Notre vue aura deux parties : larticle en lui-mme et un menu. Pour larticle, nous allons
afficher peu prs les mmes informations que pour notre rsum, sauf quici, nous aurons larticle
en entier. Pour le menu, nous aurons un lien vers la page daccueil de notre blog et, pour les
personnes identifies, un lien pour la cration dun nouvel article.
Nous allons galement modifier la vue application/views/blog/article_resume.php de
larticle afin dajouter un lien pour accder la page de larticle :
1 <? php
2 $article_url = blog / . $alias . _ . $id ;
3 ?>
4 < div class = " col - md -4 " >
5 < ?= heading ( anchor ( $article_url , htmlentities ( $title ) ) , 2) ; ? >
6 <p >
7 < small >
8 < ?= nice_date ( $date , d / m /Y ) ; ? >
9 -
10 < ?= $author ? >
11 <? php if ( $this - > auth_user - > is_connected ) : ? >
12 -
13 < ?= $this - > article_status - > label [ $status ]; ? >
14 <? php endif ; ? >
15 </ small >
16 </ p >
17 <p > < ?= nl2br ( htmlentities ( $content ) ) ; ? > ... < ?= anchor ( $article_url , " Lire la
suite " ) ; ? > </ p >
18 </ div >
Nous avons ajout du code PHP pour affecter lURI de larticle dans une variable et utilis cette
variable pour gnrer un lien sur le titre et aprs le rsum de larticle. Maintenant, en affichant la
page daccueil du blog, vous pouvez cliquer sur le titre de larticle visualiser ou sur son lien Lire
la suite (si, si, vous pouvez le faire maintenant, a doit marcher ).
CHAPITRE 4. BLOG
60 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
4.6.1 Contrleur
Nous allons simplement modifier la mthode nouvel_article() du contrleur
application/controllers/Blog.php comme suit :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Blog extends CI_Controller {
5 // (...)
6 public function edition ( $id = NULL ) { // modification nom m thode et
7 // $id comme param tre
8 if (! $this - > auth_user - > is_connected ) {
9 redirect ( blog / index ) ;
10 }
11 $this - > load - > helper ( form ) ;
12 $this - > load - > library ( form_validation ) ;
13 $this - > load - > model ( article_status ) ;
14 $this - > load - > model ( article ) ; // on charge le mod le Article () ici
15
16 if ( $id !== NULL ) { // si identifiant donn , modification
17 if ( is_numeric ( $id ) ) { // v rification validit de l identifiant
18 $this - > article - > load ( $id , TRUE ) ;
19 if (! $this - > article - > is_found ) {
20 redirect ( blog / index ) ;
21 }
22 } else {
23 redirect ( blog / index ) ;
24 }
25 $data [ title ] = " Modification article " ;
26 } else { // si aucun identifiant donn , cr ation
27 $data [ title ] = " Nouvel article " ;
28 $this - > article - > author_id = $this - > auth_user - > id ;
29 }
30
31 $this - > s e t _ b l o g _ p o s t _ v a l i d a t i o n () ;
32
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 61
Tout dabord, la mthode nouvel_article() sera renomme en edition() (je vous laisse
deviner pourquoi ). Aussi, cette mthode acceptera maintenant un ventuel identifiant darticle
en paramtre.
Le modle Article() sera charg ds le dpart, et non plus lorsque les donnes du formulaire
auront t valides. En effet, nous devrons pouvoir retrouver un article si un identifiant est donn.
Si un identifiant est donn, nous sommes dans le cas dune modification. Nous allons alors valider
cet identifiant. Il doit tre numrique et correspondre un article existant. Si ce nest pas le cas, nous
chargerons la page daccueil du blog. Si lidentifiant est correct, nous chargerons larticle concern.
Si aucun identifiant nest donn, nous sommes dans le cas dune cration. Jai dcid de dfinir
lidentifiant de lauteur ici. Cest une chose discutable. Lauteur est-il celui qui cre larticle, ou celui
qui le modifie ? Jai opt pour la premire solution, parce que ctait la meilleure 4 .
Pour le reste, cela ne change pas trop de ce que nous faisions avant. Remarquez toutefois la
dfinition du titre (via la variable $data[title] ). Ce dernier sera diffrent suivant que nous
allons crer ou modifier un article.
4.6.2 Vue
Nous allons apporter quelques petites modifications sur notre vue
application/views/blog/form.php . Voici les changements :
1 <! -- (...) -- >
2 < ?= form_open ( uri_string () , [ class = > form - horizontal ]) ; ? >
3 <! -- (...) -- >
4 < ?= form_input ([ name = > " title " , id = > " title " , class = > form - control ] ,
set_value ( title , $this - > article - > title ) ) ? >
5 <! -- (...) -- >
6 < ?= form_textarea ([ name = > " content " , id = > " content " , class = > form -
control ] , set_value ( content , $this - > article - > content ) ) ? >
7 <! -- (...) -- >
8 < ?= form_dropdown ( " status " , $this - > article_status - > text , set_value ( status ,
$this - > article - > status ) , [ id = > " content " , class = > form - control ]) ? >
9 <! -- (...) -- >
La premire chose modifier est ladresse o les donnes du formulaire sont envoyes. En effet,
dans notre contrleur, nous avons dfini quil fallait donner un identifiant darticle pour tre dans le
cas dune modification, et que sans identifiant, nous sommes dans le cas dune cration darticle. Nous
utiliserons alors la fonction uri_string() comme premier paramtre de la fonction form_open() .
Nous devons galement modifier le remplissage du formulaire. Nous allons donc donner les don-
nes du modle comme deuxime paramtre de la fonction set_value() . Ainsi, le formulaire sera
dabord rempli avec les donnes postes. Sil ny a pas de donne poste, ce seront les donnes du
modle qui seront utilises. Et sil ny a pas de donnes dans le modle non plus, me direz-vous ?
Et bien, le formulaire sera vide.
Il faudra galement modifier le menu de la vue application/views/blog/article.php pour
modifier ou ajouter un nouvel article :
4. lisez : il fallait faire un choix et il fallait le justifier
CHAPITRE 4. BLOG
62 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
1 < ul class = " nav nav - pills nav - stacked " >
2 < li > < ?= anchor ( blog / index , " Liste articles " ) ? > </ li >
3 <? php if ( $this - > auth_user - > is_connected ) : ? >
4 < li >
5 < ?= anchor ([ blog , edition , $this - > article - > id ] , " Modifier article " ) ? >
6 </ li >
7 < li > < ?= anchor ( blog / edition , " Nouvel article " ) ? > </ li >
8 <? php endif ; ? >
9 </ ul >
4.7.1 Modle
Pour supprimer un article, nous allons simplement changer son statut en D . Pour ce faire,
nous allons crer la mthode delete() dans notre modle application/models/Article.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Article extends CI_Model {
5 // (...)
6 public function delete () {
7 if ( $this - > is_found ) {
8 $this - > _status = D ;
9 $this - > save () ;
10 }
11 }
12 // (...)
13 }
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 63
Notez quil ne faut pas sauvegarder les donnes aprs avoir appeler la mthode delete() . Notez
galement que larticle nest pas effectivement supprim de la base de donnes. Il est simplement
rendu inaccessible pour le public.
4.7.2 Vue
Nous allons devoir crer deux vues : la premire pour la demande de confirmation de la suppres-
sion et lautre pour afficher le rsultat. En fait, nous nallons crer quune seule vue et deux vues
partielles. Nous appellerons lune ou lautre suivant le cas dans lequel nous seront. Cest au niveau
du contrleur que nous dterminerons dans quelle situation nous sommes.
Voici donc notre vue principale application/views/blog/delete.php :
1 < div class = " container " >
2 < div class = " row " >
3 < div class = " col - md -12 " >
4 < ?= heading ( $title ) ; ? >
5 < hr / >
6 </ div >
7 </ div >
8 < div class = " row " >
9 < div class = " col - md -12 " >
10 <? php $this - > load - > view ( blog / delete_ . $action ) ; ? >
11 </ div >
12 </ div >
13 </ div >
Notez que cest la variable $action qui dtermine la situation dans laquelle nous sommes. La
valeur de cette variable sera dtermine dans notre contrleur.
Voici la vue application/views/blog/delete_confirm.php qui sera utilise pour demande
la confirmation de la suppression dun article :
1 <p class = " alert alert - danger " role = " alert " >
2 tes - vous s r ( e ) de vouloir supprimer cet article ?
3 </ p >
4 < ?= form_open ( uri_string () , [ class = > form - horizontal ]) ; ? >
5 < div class = " form - group " >
6 <p style = " text - align : center " >
7 < ?= form_submit ( confirm , " Supprimer " , [ class = > " btn btn - default " ]) ; ? >
8 & nbsp ;& nbsp ;& nbsp ;
9 < ?= anchor ([ blog , $this - > article - > alias . _ . $this - > article - > id ] , "
Annuler " , [ id = > cancel_delete , class = > btn btn - default ]) ? >
10 </ p >
11 </ div >
12 < ?= form_close () ? >
Cette vue affiche un message invitant lutilisateur confirmer son choix. Pour ce faire, il postera
un formulaire. Cette mthode permet dempcher la suppression dun article via une requte directe
( GET ). Si lutilisateur change davis, il aura un lien pour revenir larticle.
Voici la vue application/views/blog/delete_result.php qui sera utilise pour afficher le
rsultat de la suppression dun article :
1 <p class = " alert alert - success " role = " alert " >
2 L article a t supprim .
3 </ p >
4 <p style = " text - align : center " >
5 < ?= anchor ( blog / index , " Fermer " , [ class = > " btn btn - default " ]) ; ? >
CHAPITRE 4. BLOG
64 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
6 </ p >
La vue affichera simplement un message indiquant que la suppression a bien eu lieu. Ici, je pars
du principe que si cela ne sest pas bien droul, le systme plantera et la vue ne saffichera pas.
Je sais que ce nest pas bien. Il faudrait grer ce genre derreur et ne jamais faire cela dans la vraie
vie .
Il faudra galement modifier le menu de la vue application/views/blog/article.php afin
dajouter une entre pour pouvoir supprimer un article :
1 <! -- (...) -- >
2 < ul class = " nav nav - pills nav - stacked " >
3 < li > < ?= anchor ( blog / index , " Liste articles " ) ? > </ li >
4 <? php if ( $this - > auth_user - > is_connected ) : ? >
5 < li >
6 < ?= anchor ([ blog , edition , $this - > article - > id ] , " Modifier " ) ? >
7 </ li >
8 < li >
9 < ?= anchor ([ blog , suppression , $this - > article - > id ] , " Supprimer " ) ? >
10 </ li >
11 < li >
12 < ?= anchor ( blog / edition , " Nouvel article " ) ? >
13 </ li >
14 <? php endif ; ? >
15 </ ul >
16 <! -- (...) -- >
4.7.3 Contrleur
Nous allons ajouter la mthode suppression() , qui prend lidentifiant dun article comme
paramtre, notre contrleur application/controllers/Blog.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Blog extends CI_Controller {
5 // (...)
6 public function suppression ( $id = NULL ) {
7 if (! $this - > auth_user - > is_connected ) {
8 redirect ( blog / index ) ;
9 }
10 if (! is_numeric ( $id ) ) {
11 redirect ( blog / index ) ;
12 }
13 $this - > load - > model ( article ) ;
14 $this - > article - > load ( $id , TRUE ) ;
15 if (! $this - > article - > is_found ) {
16 redirect ( blog / index ) ;
17 }
18 if ( $this - > input - > post ( confirm ) === NULL ) {
19 $data [ action ] = " confirm " ;
20 } else {
21 $this - > article - > delete () ;
22 $data [ action ] = " result " ;
23 }
24 $data [ title ] = " Suppression article " ;
25 $this - > load - > helper ( form ) ;
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 65
Dans un premier temps, nous vrifions si lutilisateur est bien identifi. Ensuite, nous vrifions
si lidentifiant est bien un nombre. Nous chargeons alors larticle correspondant et vrifions quil
a bien t trouv. Si le formulaire de confirmation na pas t post, nous laffichons. Sinon, nous
supprimons larticle et affichons le rsultat. Cela prend quelques lignes, mais le travail du contrleur
nest pas trs compliqu.
CHAPITRE 4. BLOG
66 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Si vous ne comprenez pas bien ce qui a t fait ici, ne vous inquitez pas. Jai utilis JQuery
pour intercepter le clic sur le lien de suppression et de le remplacer par une requte AJAX. Jaffiche
ensuite le rsultat de cette requte dans la fentre modale que nous venons dajouter notre vue.
Enfin, jintercepte aussi le clic sur le lien dannulation de la suppression pour fermer la fentre
modale plutt que de recharger la page.
Nous allons devoir charger notre script dans notre page, mais aprs avoir charg JQuery. Comme
ce dernier est charg dans la vue application/views/common/footer.php , nous devons modifier
cette dernire afin dajouter un script aprs ceux dj rfrencs :
1 <! -- (...) -- >
2 < script src = " <?= base_url ( " js / jquery -2.1.4. min . js " ) ? > " > </ script >
3 < script src = " <?= base_url ( " js / bootstrap . min . js " ) ? > " > </ script >
4 <? php
5 if ( isset ( $script ) ) {
6 echo $script ;
7 }
8 ?>
9 <! -- (...) -- >
Jai dfini ici la possibilit de crer une variable $script dans le contrleur afin dy insrer un
ventuel script. Nous allons tout de suite voir comment lutiliser.
Voici donc le code qui nous intresse vraiment dans le contrleur
application/controllers/Blog.php :
1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Blog extends CI_Controller {
5 public function article ( $id = NULL ) {
6 // (...)
7 $data [ title ] = htmlentities ( $this - > article - > title ) ;
8 $data [ script ] = < script src =" . base_url ( js / article . js ) . " > </
script > ;
9 // (...)
10 }
11 // (...)
12 public function suppression ( $id = NULL ) {
13 // (...)
14 $this - > load - > helper ( form ) ;
15 if ( $this - > input - > is_ajax_request () ) {
16 // nous avons re u une requ te ajax
17 $this - > load - > view ( blog / delete_confirm ) ;
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 67
18 } else {
19 // nous avons re u une requ te classique
20 if ( $this - > input - > post ( confirm ) === NULL ) {
21 $data [ action ] = " confirm " ;
22 } else {
23 $this - > article - > delete () ;
24 $data [ action ] = " result " ;
25 }
26 $data [ title ] = " Suppression article " ;
27 $this - > load - > view ( common / header , $data ) ;
28 $this - > load - > view ( blog / delete , $data ) ;
29 $this - > load - > view ( common / footer , $data ) ;
30 }
31 }
32 }
CHAPITRE 4. BLOG
68 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
4.8 Exercices
Normalement, si vous avez bien suivi ce cours, vous devriez avoir un site avec quelques pages
statiques, un mcanisme qui vous permet de vous identifier, et un blog. Si ce nest pas le cas, vous
pouvez utiliser le code se trouvant dans le fichier site_bas3.7z accompagnant ce document
(galement disponible sur mon site personnel).
4.8.1 noncs
Bouton de publication
Dans la vue affichant un article, crez un bouton permettant la publication dun article, linstar
du bouton de suppression. Lorsquon clique sur le bouton de publication, le statut de larticle change
(sans demander de confirmation) et la page de larticle se rafraichit.
4.8.2 Corrections
Voici les solutions que je suggre pour les exercices proposs. Je vous invite ardemment dabord
faire les exercices avant de lire ces solutions.
Bouton de publication
Nous rsoudrons cet exercice en deux temps : crer un lien dans le menu de la vue de larticle
et crer une mthode dans le contrleur du blog pour publier larticle.
Modifions donc la vue application/views/blog/article.php afin dajouter le lien de pu-
blication de larticle :
1 <! -- (...) -- >
2 < ul class = " nav nav - pills nav - stacked " >
3 < li > < ?= anchor ( blog / index , " Liste articles " ) ? > </ li >
4 <? php if ( $this - > auth_user - > is_connected ) : ? >
5 < li > < ?= anchor ([ blog , edition , $this - > article - > id ] , " Modifier " ) ? > </ li >
6 < li > < ?= anchor ([ blog , publication , $this - > article - > id ] , " Publier " ) ? > </
li >
7 < li > < ?= anchor ([ blog , suppression , $this - > article - > id ] , " Supprimer " , [
id = > menu_delete_article ]) ? > </ li >
8 < li > < ?= anchor ( blog / edition , " Nouvel article " ) ? > </ li >
9 <? php endif ; ? >
10 </ ul >
11 <! -- (...) -- >
CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 69
5 // (...)
6 public function publication ( $id = NULL ) {
7 if (! $this - > auth_user - > is_connected ) {
8 redirect ( blog / index ) ;
9 }
10 if (! is_numeric ( $id ) ) {
11 redirect ( blog / index ) ;
12 }
13 $this - > load - > model ( article ) ;
14 $this - > article - > load ( $id , TRUE ) ;
15 if (! $this - > article - > is_found ) {
16 redirect ( blog / index ) ;
17 }
18 $this - > article - > status = P ;
19 $this - > article - > save () ;
20 redirect ( blog / . $this - > article - > alias . _ . $id ) ;
21 }
22 }
Une vrification est faite pour savoir si lutilisateur est connect. Si ce nest pas le cas, nous
sommes redirig vers la page daccueil du blog.
Nous vrifions ensuite que lidentifiant est valide, nous chargeons les donnes de larticle partir
de la base de donnes, modifions le statut de larticle, et sauvegardons le tout. Une fois que cest
fait, nous chargeons la page de larticle.
4.9 Conclusion
Aprs avoir ralis ce tutoriel, vous devriez tre lheureux propritaire dun blog ralis avec
CodeIgniter. Bon, vous nallez pas concurrencer dautres produits comme WordPress, Joomla!,
Drupal et consorts. Et le chemin est encore long pour finaliser ce projet de blog, mais si cela
vous dit, vous avez tous les outils en main pour cela.
CHAPITRE 4. BLOG
70 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3
Jespre que vous aurez reu un bon aperu de la simplicit dutilisation de CodeIgniter, et
lenvie de continuer avec. Il est particulirement bien adapt pour des projets de petite (ou mme
moyenne) taille qui doivent aller vite. Je ne vous le recommanderais peut-tre pas pour de (trs)
gros projets (quoique. . .).
Vous pouvez tlcharger les ressources concernant ce tutoriel sur mon site personnel, et notam-
ment une version PDF ainsi que le code source du projet.
Maintenant, cest vous de jouer.
CHAPITRE 4. BLOG
Table des figures