Vous êtes sur la page 1sur 75

Ralisez votre blog avec le framework CodeIgniter 3

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

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 iii


iv RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

3.3 Base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30


3.3.1 Configuration de la base de donnes . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.2 Constructeur de requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.3 Rcupration des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4 Implmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4.1 Table des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.4.2 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
3.4.3 Authentification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.4.4 Dconnexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.5 Contrle daccs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.5 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.1 nonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.5.2 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

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

TABLE DES MATIRES


Chapitre 1

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 :

disposer dun serveur web avec PHP 5.5+ ;


disposer dun serveur de base de donnes ;
matriser les concepts de base de HTML, CSS et JavaScript ;
matriser les concepts de base de la programmation oriente objet et plus spcifiquement avoir
des bases en PHP ;
matriser les concepts de base des bases de donnes ;
matriser les concepts de base du patron darchitecture logicielle modle-vue-contrleur
(MVC).

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

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 1


2 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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 Le patron MVC


Bon, en thorie, le patron darchitecture logicielle modle-vue-contrleur (plein de mots
grandiloquents) doit faire partie de vos pr-requis. Mais comme cest un concept important, je vais
vite le passer en revue.

2.1.1 Quest-ce que le patron MVC ?


Alors, donc, le patron MVC est une manire dorganiser son code. Lide est de sparer le code
qui sert accder aux donnes de celui servant la gestion de laffichage et de celui destin grer
les requtes des utilisateurs ainsi que les interactions entre laffichage et les donnes. Pour cela, nous
utiliserons respectivement des modles, des vues et des contrleurs.
Si vous faites des recherches sur internet propos du patron MVC, vous allez trouver des tonnes
de ressources traitant du sujet et vous risquez vite dtre noy. Aussi, si vous vous lancez dans une
discussion ce propos, vous avez de fortes chances de vous retrouver pris entre les tirs croiss des
diffrentes chapelles. Je vais vous prsenter le point de vue qui, mon sens, est le meilleur : le
mien.
OK, certains ne seront pas daccord avec moi. Sachez seulement quil ny a pas une chapelle
qui soit meilleure que lautre (sauf la mienne, bien entendu). Ce que je voudrais faire ici, cest vous
montrer comment CodeIgniter intgre cette philosophie de codage. Pour le reste, vous serez de toute
faon seul(e)s devant vos PC, et vous ferez comme il vous plaira. . .

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.

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 3


4 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

Application
Contrleur

Modle Vue

Figure 2.1 Interactions entre les diffrents lments du patron MVC

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.

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 5

2.2.1 Quest-ce quun framework ?


Si vous avez dj touch la programmation, vous savez quon doit souvent rpter les mmes
choses dans chaque application. Pour cela, avant, nous dveloppions nos propres outils. Et bien,
aujourdhui, ce nest plus ncessaires, car il existe des frameworks pour peu prs tout.
Lide des frameworks est de vous permettre de dvelopper plus vite et moindre cot. En effet,
une partie des oprations rptitives sont fournies par le framework. Par exemple, larchitecture
MVC est trs largement utilise actuellement dans le monde du dveloppement web. Alors que
le concept est assez simple , si vous voulez limplmenter vous-mme, cela va vous prendre un
certain temps (et mme un temps certain ). Lusage du framework est donc une plus-value.

2.2.2 Prsentation de CodeIgniter


Ainsi, CodeIgniter est un framework PHP qui va vous permettre de dvelopper plus rapidement
des applications (sites) web. Il fournit un ensemble vari doutils qui vous permettra de raliser les
tches les plus communes, tout en restant trs simple. Il a en effet t dvelopp avec pour objectif
la simplicit et la rapidit.
CodeIgniter est un framework MVC. Il implmente les modles, les vues et les contrleurs. La
gestion entre ces diffrents lments est faite pour vous. Vous ne devez vous proccuper de (presque)
rien de cet aspect. Toutefois, il est trs souple quant au concept de MVC. Il ne ncessite par exemple
pas lusage systmatique dun modle comme dautres frameworks.
Aussi, CodeIgniter est facilement extensible. Vous pouvez aisment adapter, ou remplacer, les
fonctionnalits internes.
Les outils fournis par CodeIgniter sont les suivant :

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

CHAPITRE 2. CONCEPTS DE BASE


6 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

Figure 2.2 Structure originale


des rpertoires Figure 2.3 Page daccueil initiale

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 :

application Cest ici que se trouve votre application (site) web.

application/config Les fichiers de configuration.

application/controllers Vos contrleurs.

application/models Vos modles.

application/views Vos vues

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.

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 7

Figure 2.4 Adaptation de larborescence

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.

2.3.3 Installation personnalise


Je ne sais pas pour vous, mais moi, mettre des lments critiques, mme cachs, dans la partie
publique, cela ne me plat pas de trop. Alors, je vais un peu rorganiser tout a. Cette partie est
optionnelle et si vous voulez, vous pouvez la passer. Aussi, cette rorganisation nest peut-tre pas
compatible avec certains hbergeurs. Cela dit, elle apporte un plus la scurit de votre site.
La figure 2.4 la page 7 nous montre lavant et laprs. Pour faire simple, voici la liste des
changements de rpertoires. Nous supposons que la partie public se trouve dans le rpertoire www .

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 :

CHAPITRE 2. CONCEPTS DE BASE


8 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3


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 // (...)

Pourquoi ai-je utiliser le rpertoire framework/codeigniter-3.0.6 et pas simplement


system ? Cest simple, lorsque CodeIgniter produira sa prochaine version, vous pourrez la mettre
jour en crant un nouveau rpertoire dans framework (par exemple codeigniter-3.1.0 ) et
y copier le contenu du rpertoire system . Ensuite, pour lactiver, il suffira de modifier le fichier
www/index.php . Le temps dinaccessibilit de votre site lors de la mise jour sera fortement
rduite.
Il est temps maintenant de faire un peu de nettoyage. Vous pouvez supprimer (si, si, cest vrai)
tous les fichiers index.html et .htaccess se trouvant dans les rpertoires application et
framework/codeigniter-3.0.6 (pas dans le rpertoire www ).
Tant qu parler de nettoyage, vous pouvez galement supprimer les fichiers composer.json ,
contributing.md , license.txt et readme.rst . Pour ceux qui utilisent Git, en fait, jespre
que vous lutilisez TOUS , le fichier .gitignore peut tre remont dun niveau et tre dit
comme suit :

1 . DS_Store
2
3 / application / cache /
4 / application / logs /
5
6 / www / user_guide /
7 / framework /
8
9 # IDE Files
10 #-------------------------
11 / nbproject /
12 . idea /*
13
14 ## Sublime Text cache files
15 *. tmlanguage . cache
16 *. tmPreferences . cache
17 *. stTheme . cache
18 *. sublime - workspace
19 *. sublime - project

2.4 Premire page


Cette section expliquera comment crer votre propre page daccueil. Mais ce serait bte de faire
tout ce travail, si on ne peut pas y accder. Alors, voyons dabord comment CodeIgniter gre laccs
aux pages.

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 9

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 ]

CHAPITRE 2. CONCEPTS DE BASE


10 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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

4 class Site extends CI_Controller {


5 public function index () {
6 $this - > load - > view ( site / index ) ;
7 }
8 }

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.

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 11

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 }

Dans lexemple ci-dessus, nous chargerons successivement les vues


application/views/common/header.php , application/views/site/index.php et
application/views/common/footer.php . Le rsultat sera une seule page qui sera la concatna-
tion des trois vues.
ce stade, la page daccueil ne peut toujours pas tre affiche. Cest normal, mais on y est
presque.

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 " >

CHAPITRE 2. CONCEPTS DE BASE


12 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

19 < div class = " container - fluid " >


20 < div class = " navbar - header " >
21 < button type = " button " class = " navbar - toggle collapsed " data - toggle = "
collapse " data - target = " # main_nav " aria - expanded = " false " >
22 < span class = " sr - only " > Toggle navigation </ span >
23 < span class = " icon - bar " > </ span >
24 < span class = " icon - bar " > </ span >
25 < span class = " icon - bar " > </ span >
26 </ button >
27 <a class = " navbar - brand " href = " / index . html " >S bastien Adam </ a >
28 </ div >
29 < div class = " collapse navbar - collapse " id = " main_nav " >
30 < ul class = " nav navbar - nav " >
31 < li > <a href = " / index . html " > Accueil </ a > </ li >
32 </ ul >
33 </ div >
34 </ div >
35 </ nav >

La seconde vue, application/views/site/index.php , permettra dafficher le contenu de la


page

en elle-mme.
1 < div class = " jumbotron " >
2 < div class = " container " >
3 < h1 > < ?= $title ? > </ h1 >
4 <p > Ceci est ma page d accueil </ p >
5 </ div >
6 </ div >
7 < div class = " container " >
8 <p >Bla , bla , bla ... </ p >
9 <p >Bla , bla , bla ... </ p >
10 <p >Bla , bla , bla ... </ p >
11 </ div >

La dernire vue, application/views/common/footer.php , affichera le bas de page et chargera



les scripts.
1 < div class = " container " >
2 < hr >
3 < footer >
4 <p >& copy ; S bastien Adam 2016 </ p >
5 </ footer >
6 </ div >
7 < script src = " js / jquery -2.1.4. min . js " > </ script >
8 < script src = " js / bootstrap . min . js " > </ script >
9 </ body >
10 </ html >

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 ).

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 13

Figure 2.5 Page daccueil initiale

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 }

Dans notre exemple, la variable $data["title"] du contrleur deviendra $title dans la


vue. Vous pouvez donner le nom que vous voulez votre tableau associatif.
Un dernier point, si vous travaillez dj avec des frameworks PHP, vous avez certainement
trouv trange que les vues ne contiennent que du code HTML et PHP. En effet, la plupart des
framework utilisent leur propre systme de gnration dans les vues. Ce nest pas loption choisie par
CodeIgniter. Ce dernier privilgie la rapidit et la simplicit. Toutefois, si vous tenez absolument
utiliser un langage propre CodeIgniter, vous pouvez utiliser la librairie Template Parser Class
(mais votre site sera plus lent).
Voil, maintenant, vous pouvez accder votre page daccueil. Rendez-vous ladresse
http://localhost/index.html. Vous devriez avoir une page ressemblant limage 2.5 la page

CHAPITRE 2. CONCEPTS DE BASE


14 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

13.

2.4.4 URL Helper


Bon, notre page daccueil fonctionne. Il a fallut le temps, mais on y est arriv. Toutefois, nous
avons fait une chose horrible : tous les liens sont en dur . Et cest une chose quil ne faut
jamais faire ! En effet, si nous dplaons la structure de notre site, cela perturber fortement le
fonctionnement du site.
Nous pourrions imaginer des tas de manires pour rsoudre ce problme. Mais CodeIgniter la
dj fait pour nous (rappelez-vous du rle dun framework ). Il existes le URL Helper qui va
nous fournir toute une srie de fonction permettant la gestion des URL. Je vais commencer par vous
dcrire deux de ces fonctions : site_url() et base_url() .
La premire servira pointer vers une page . Elle effectuera la concatna-
tion de $config[base_url] , $config[index_page] , lURI pass en paramtre et
$config[url_suffix] .
La seconde servira pointer vers un fichier. Elle effectuera la concatnation de
$config[base_url] et lURI pass en paramtre.
Sur base des paramtres que nous avons dfinis prcdemment, le rsultat de lusage de ces
fonctions sera le suivant :

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

Et voici un exemple dutilisation de ces fonctions :



1 < script src = " <?= base_url ( js / jquery -2.1.4. min . js ) ; ? > " > </ script >
2 <a href = " <?= site_url ( index ) ; ? > " > Accueil </ a >

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 :

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 15


1 < link rel = " stylesheet " href = " http :// localhost / css / bootstrap . min . css " >
2 <a href = " http :// localhost / index . html " > Accueil </ a >

2.4.5 HTML Helper


Dans cette partie, nous allons explorer quelques fonctions du HTML Helper. Et dans cette partie,
vous rserve une petite surprise. . .
La premire fonction que nous allons voir, cest celle qui va gnrer le DOCTYPE , cest
dire la toute premire balise de votre fichier HTML qui va indiquer votre navigateur quelle est la
version utilise. Pour le HTML 5, cette balise est trs simple. Mais pour les versions antrieures de
HTML, trouver la bonne balise tait parfois un vrai parcours du combattant. Cette fonction nous
enlve toute cette problmatique.
Ainsi, la fonction qui va nous gnrer notre DOCTYPE est doctype() . Voici une exemple
pour gnrer celui de HTML 5 :

1 echo doctype ( html5 ) ; // affiche : <! DOCTYPE html >

La liste des versions valides se trouve dans le fichier application/config/doctypes.php . Je


ne vous conseille pas dy toucher. Toutefois, si vous utilisez des types qui ne sy trouvent pas, vous
pouvez les y ajouter.
La seconde fonction nous permettra de gnrer les balises de mta-donnes. Ce sont des ba-
lises permettant denvoyer des informations concernant la page au navigateur et aux moteurs de
recherches. En gnral, ces balises ont comme attribut soit name , soit http-equiv ainsi que
lattribut content . Nous allons utiliser la fonction meta() . Pour lexplication des paramtres
fournir, je vous renvoie laide en ligne, cest un peu complexe. Voici un exemple dutilisation :

1 echo meta ( "X - UA - Compatible " , " IE = edge " , http - equiv ) ;
2 // affiche : < meta http - equiv =" X - UA - Compatible " content =" IE = edge " / >
3 echo meta ( " viewport " , " width = device - width , initial - scale =1 " ) ;
4 // affiche : < meta name =" viewport " content =" width = device - width , initial - scale =1"
/>

Cette fonction a toutefois un problme. HTML 5 a introduit lattribut charset , et notre


fonction ne permet pas de le gnrer. Vous me direz : ce nest pas grave, on na qu crire la
balise sans utiliser de fonction ! . Cest vrai, vous avez raison, mais alors, on nutilise pas ce helper.
Et puis, nous, on ne se laisse pas dmonter par un problme aussi minime.
Voici la petite surprise que je vous rservais : nous allons modifier le comportement de
la fonction meta() . Nous pourrions directement modifier le fichier html_helper.php dans
system/helpers . Cest vrai, mais si vous faites a, je viens vous tire les oreilles. Et lorsque vous
ferez la mise jour de votre framework, ces modifications seront perdues.
Nous allons ainsi crer un fichier application/helpers/My_html_helper.php . Le nom de
ce fichier doit tre le mme que celui du framework, mais prfix de la valeur de la variable
$config[subclass_prefix] ( MY_ par dfaut). Ainsi, lorsque nous essayerons de charger le
helper, cest notre fichier qui sera charg en premier, et cest notre fonction adapte qui sera utilise
et non celle du framework.
Voici le contenu de notre fichier :

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3

CHAPITRE 2. CONCEPTS DE BASE


16 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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 }

Jai fait un copier - coller de la fonction originale et jy ai apport quelques modifications.


Maintenant, les attributs autoriss pour la balise <meta> sont charset , http-equiv , name et
property . Tous ces attributs seront accompagns de lattribut content , sauf charset qui, lui,
est seul. Si vous tes un expert en HTML 5, vous savez que lattribut property nest pas standard.
Je lai autoris pour rendre la fonction compatible avec Open Graph
Maintenant, nous allons pouvoir gnrer notre balise pour lencodage des caractres :

1 echo meta ( " UTF -8 " , " " , charset ) ; // affiche : < meta charset =" UTF -8" / >

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

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 17

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.

2.5 Page de contact


Dans cette section, nous allons crer une page de contact. Le but de cet exercice est, au travers
dun exemple, de voir comment grer les formulaires.

2.5.1 Une nouvelle page


La premire chose faire, est de crer la page sur laquelle nous allons placer notre formulaire.
Cela va se faire trs rapidement.
Nous allons crer le fichier vide application/views/site/contact.php . Nous le remplirons
plus tard, cest promis. Pour une fois, je vais vous laisser afficher la page avant quelle ne soit
termine.
Ensuite, dans le contrleur application/controllers/Site.php , nous allons crer la m-
thode contact() , comme ci-dessous. Pour linstant, cette mthode va simplement dfinir le titre
de la page et charger les vues. Nous la complterons plus tard.

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 $data [ " title " ] = " Contact " ;
8

9 $this - > load - > view ( common / header , $data ) ;


10 $this - > load - > view ( site / contact , $data ) ;
11 $this - > load - > view ( common / footer , $data ) ;
12 }
13 }

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 <! -- (...) -- >

CHAPITRE 2. CONCEPTS DE BASE


18 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

Maintenant, si nous allons ladresse http://localhost/contact.html, nous avons notre page


avec seulement la barre de menu en haut et le copyright en bas. Vous pouvez cliquer sur Accueil
pour aller la page daccueil et sur Contact pour revenir sur la page de contact. Notez lutilisation
de la fonction anchor() du helper URL .
Si vous navez pas le rsultat attendu, revrifier les tapes prcdentes.

2.5.2 Cration du formulaire


Il est temps de raliser le formulaire. Pour cela, CodeIgniter nous propose le Form Helper (quil
faudra charger dans le contrleur). Ce dernier va nous offrir toute une srie de fonctions pour nous
faciliter la vie. Encore une fois, lutilisation de ces fonctions nest pas obligatoire, mais a aide.
Ci-dessous, notre contrleur application/controllers/Site.php o lon charge le Form
Helper :

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 $this - > load - > helper ( " form " ) ;
8
9 $data [ " title " ] = " Contact " ;
10

11 $this - > load - > view ( common / header , $data ) ;


12 $this - > load - > view ( site / contact , $data ) ;
13 $this - > load - > view ( common / footer , $data ) ;
14 }
15 }

Ci-dessous, le contenue de notre vue application/views/site/contact.php . Ne vous ef-


frayez pas, nous allons passer tous cela en revue.

1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 </ div >
5 < div class = " row " >
6 < ?= form_open ( contact , [ class = > form - horizontal ]) ; ? >
7 < div class = " form - group " >
8 < ?= form_label ( " Votre nom & nbsp ;: " , " name " , [ class = > " col - md -2 control -
label " ]) ? >
9 < div class = " col - md -10 " >
10 < ?= form_input ([ name = > " name " , id = > " name " , class = > form -
control ]) ? >
11 </ div >
12 </ div >
13 < div class = " form - group " >
14 < ?= form_label ( " Votre e - mail & nbsp ;: " , " email " , [ class = > " col - md -2
control - label " ]) ? >
15 < div class = " col - md -10 " >
16 < ?= form_input ([ name = > " email " , id = > " email " , type = > email ,
class = > form - control ]) ? >
17 </ div >
18 </ div >
19 < div class = " form - group " >

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 19

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 () ;

CHAPITRE 2. CONCEPTS DE BASE


20 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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.

2.5.3 Validation des donnes reues


Un aspect qui est souvent nglig dans le dveloppement en gnral, cest la validation des
donnes reues. Et cest comme cela quun site se fait facilement pirater. Entendons-nous bien : je
ne vais pas vous faire un cours exhaustif sur la scurit en ligne. Je ne suis dailleurs pas comptent
pour cela. Mais je peux vous dire que je me souviens encore aujourdhui de la premire dmonstration
de la vulnrabilit dun de mes sites (et il y a des annes de cela). Alors sil y a un point sur lequel
notre attention doit se porter, cest celui-ci.
Ainsi, CodeIgniter possde la librairie Form Validation qui soccupe de, je vous le donne en
mille , la validation des donnes reues dun formulaire. Il sagit dune librairie assez volue qui
permet de raliser la mme chose de diffrentes manire. Nous allons en voir une seule. Ce nest
peut-tre pas celle que vous prfrerez, mais elle me sduit par sons ct magique .
Je vous invite garder la page de documentation sur la librairie de validation ouvert en mme
temps que ce document. a peut toujours servir (dailleurs, je suis sr que cela va vous servir ).
Pour valider notre formulaire, nous allons crer un fichier de configuration et associer un groupe
de rgles la mthode de notre contrleur (comme dcrit ici). OK, je nai peut-tre pas t trs
clair. . . Pour tre simple, nous allons faire en sorte que les rgles de validation sappliquent auto-
matiquement notre formulaire de contact.
Ainsi, dans un premier temps, crons notre fichier de configuration
application/config/form_validation.php o seront stockes toutes nos rgles de vali-
dation. Ces rgles dtermineront que tous les champs sont requis et que, en plus, ladresse e-mail
doit tre valide. Le contenu de notre fichier doit ressembler ceci :

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 $config = array (
5 site / contact = > array (
6 array (
7 field = > name ,
8 label = > Nom ,
9 rules = > required
10 ),
11 array (
12 field = > email ,
13 label = > E - mail ,
14 rules = > array ( valid_email , required )
15 ),
16 array (
17 field = > title ,
18 label = > Titre ,

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 21

19 rules = > required


20 ),
21 array (
22 field = > message ,
23 label = > Message ,
24 rules = > required
25 )
26 )
27 );

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

4 class Site extends CI_Controller {


5 // (...)
6 public function contact () {
7 $this - > load - > helper ( " form " ) ;
8 $this - > load - > library ( form_validation ) ;
9

10 $data [ " title " ] = " Contact " ;


11
12 $this - > load - > view ( common / header , $data ) ;
13 if ( $this - > form_validation - > run () ) {
14 // TODO : envoyer le mail
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 }

CHAPITRE 2. CONCEPTS DE BASE


22 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 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.

2.5.4 Affichage des erreurs


Si vous lavez essay, lorsque vous envoyez un formulaire non valide, vous revenez sur la mme
page, mais vous ne pouvez pas dterminer quel est le problme. Je vais donc maintenant vous
montrer comment afficher les erreurs survenues. Aussi, les champs seront remplis avec les valeurs
dj introduites.
Pour raliser ce que nous voulons faire, nous allons nouveau faire appel au Form Helper .
Pour laffichage des erreurs, nous avons les fonctions validation_errors() (affiche toutes les
erreurs en une fois) et form_error() (affiche lerreur associe un champ pass en paramtre).
Pour remplir les champs avec les valeurs dj envoyes, nous allons utiliser les fonctions set_*()
( set_value() , set_select() . . .).
Attention, les fonctions prcdemment cites doivent tre utilises en association avec la librairie
Form Validation . Si ce nest pas le cas, il ne se passera rien.
Ci-dessous je vous propose une manire dutiliser ces fonctions. Jai utilis le champ email
comme exemple. Tout dabord, sil y a un message derreur, jajoute la classe has-error au bloc
contenant le champ du formulaire. Ensuite, jajoute la valeur du champ reue par le serveur comme
deuxime paramtre de la fonction form_input() . Cette dernire remplira le champ avec cette
valeur. Et finalement, jajoute le message derreur, sil existe, en dessous du champ. Notez quil faut
chaque fois donner le nom du champ (et si vous mlanger les noms de champ, vous allez avoir de
jolies surprises ).

1 < div class = " form - group " >
2 < ?= form_label ( " Votre e - mail & nbsp ;: " , " email " , [ class = > " col - md -2
control - label " ]) ? >
3 < div class = " col - md -10 <?= empty ( form_error ( email ) ) ? : has - error ? > " >
4 < ?= form_input ([ name = > " email " , id = > " email " , type = > email ,
class = > form - control ] , set_value ( email ) ) ? >
5 < span class = " help - block " > < ?= form_error ( email ) ; ? > </ span >
6 </ div >
7 </ div >

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.

2.5.5 Envoi de le-mail


Bon, nous avons fait notre formulaire, envoy nos donnes, et nous nous sommes assur que les
donnes taient valides. Maintenant, il ne nous reste qu effectuer lenvoi de le-mail proprement
dit. Cela peut tre quelque chose de magique. . . ou pas. Gnralement, si vous mettez votre site
chez un hbergeur, ce dernier a configur lenvoi de mail pour vous et la magie peut oprer. Nous
allons donc envisager ce cas de figure pour commencer.
Donc, au risque de me faire passer pour un radoteur, lenvoi de-mail avec CodeIgniter est
trs simple. Nous avons notre disposition la librairie Email qui va nous fournir les outils
ncessaires. Comme pour les autres librairies, il suffit de la charger, dappeler les mthodes voulues
pour crer notre mail et de lenvoyer. Voici comment nous allons faire :

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 23

Figure 2.6 Validation du formulaire de contact


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

CHAPITRE 2. CONCEPTS DE BASE


24 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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 >

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 25

Figure 2.7 Envoi russi dun e-mail

Figure 2.8 chec de lenvoi dun e-mail

11 </ 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 ] = " ********** " ;

CHAPITRE 2. CONCEPTS DE BASE


26 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

8 $config [ smtp_port ] = 25;


9 $config [ smtp_crypto ] = " tls " ;

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.

CHAPITRE 2. CONCEPTS DE BASE


RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 27

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 }

Crons maintenant notre vue application/views/site/apropos.php :



1 < div class = " container " >
2 < div class = " row " >
3 < ?= heading ( $title ) ; ? >
4 < hr / >
5 </ div >
6 < div class = " row " >
7 <p >bla , bla , bla ... </ p >
8 <p >bla , bla , bla ... </ p >
9 <p >bla , bla , bla ... </ p >
10 <p >bla , bla , bla ... </ p >
11 </ div >
12 </ div >

Et pour finir, modifions la vue application/views/common/header.php qui sert dentte de


nos pages :

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 </ div >
9 <! -- (...) -- >

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 :

CHAPITRE 2. CONCEPTS DE BASE


28 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3


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 <! -- (...) -- >

Pour notre rgle de validation, nous modifierons le fichier de configuration


application/config/form_validation.php :

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $config [ site / contact ][] = array (
5 field = > emailconf ,
6 label = > Confirmation e - mail ,
7 rules = > array ( valid_email , required , matches [ email ] )
8 );

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.

CHAPITRE 2. CONCEPTS DE BASE


Chapitre 3

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 ]++;

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 29


30 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

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.

3.2.2 Sessions avec CodeIgniter


Pour utiliser les sessions avec CodeIgniter, nous pourrions trs bien utiliser les mcanismes
internes de PHP. Cependant, CodeIgniter ajoute certaines fonctionnalits aux sessions. Je ne les
dvelopperai pas toutes ici, mais pour plus de dtails, vous pouvez toujours consulter laide en ligne
(jespre quil ny a pas de royalties payer pour utiliser cette phrase, sinon je risque dtre ruin
ce stade ).
Donc, pour utiliser les sessions, nous allons devoir charger la librairie Session . Comme nous
allons lutiliser tout le temps, je vous conseille de la charger automatiquement. Modifions ainsi le
fichier application/config/autoload.php :

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $autoload [ libraries ] = array ( session ) ;
5 // (...)

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 }

Comme dhabitude, avec CodeIgniter, tout est simple.

3.3 Base de donnes


Avec la base de donnes, nous allons pouvoir commencer les choses intressantes. Comme preuve
de limportance des bases de donnes pour un site web, laide en ligne (encore une fois) de CodeI-
gniter sur le sujet est trs consquente par rapport au reste du framework. Elle y consacre mme
un chapitre complet. Alors, on va y aller doucement. Nous nallons ici envisager que la lecture des
donnes. Nous aborderons la modification des donnes dans un prochain chapitre.

CHAPITRE 3. AUTHENTIFICATION
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 31

3.3.1 Configuration de la base de donnes


CodeIgniter permet des configurations complexes de bases de donnes. Nous allons rester simple.
Si vous voulez plus dinformation sur le sujet, vous pouvez consulter laide en ligne.
La toute premire chose faire est de modifier le fichier application/config/database.php
avec les paramtres suivants. Attention, les paramtres non cits ici ne doivent pas tre supprims.

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3 // (...)
4 $db [ default ] = array (
5 // (...)
6 hostname = > localhost , // nom d h te du serveur de base de donn es
7 username = > ocrci , // nom d utilisateur de la base de donn es
8 password = > ocrci , // mot de passe de la base de donn es
9 database = > ocrci , // nom de la base de donn es
10 dbdriver = > mysqli , // pilote du serveur de la base de donn es
11 // (...)
12 );
13 // (...)

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 // (...)

Nous accderons la base de donnes en utilisant le code $this->db .

3.3.2 Constructeur de requte


Nous pourrions crire nos requtes avec des commandes SQL et les excuter. Cest trs simple
avec CodeIgniter :

1 $query = $this - > db - > query ( /* requ te */ ) ;

Personnellement, je prfre utiliser le constructeur de requte (Query Builder). Il sagit dun


objet qui permet de crer sa requte en faisant appel certaines mthodes. Vu comme a, a
pourrait paraitre plus compliqu que dcrire soi-mme ses requtes en SQL et de les excuter. Mais
si celles-ci dpendent fortement de paramtres (comme par exemple pour effectuer des recherches
complexes), le constructeur de requte savre trs utile.

1 $query = $this - > db - > select ( /* colonnes */ )
2 -> from ( /* nom table */ )
3 -> where ( /* condition */ )
4 -> get () ;

CHAPITRE 3. AUTHENTIFICATION
32 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

Figure 3.1 Table des utilisateurs

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.3.3 Rcupration des donnes


Une fois que notre requte de slection est cre et excute, nous pouvons parcourir le rsultat
trs simplement grce sa mthode result() . Supposons que nous voulions parcourir une table
client . IL suffirait de travailler comme dans lexemple ci-dessous.

1 $query = $this - > db - > get ( client ) ;
2
3 foreach ( $query - > result () as $row ) {
4 /* faites ce que vous avez faire ici */
5 }

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.

3.4.1 Table des utilisateurs


Ici, nous allons rester simple. Notre table, illustre par ma figure 3.1 la page 32, contiendra les
noms dutilisateur et les mots de passe des utilisateurs. Elle contiendra galement un identifiant et
un statut pour chaque utilisateur, mais nous ne lutiliseront pas maintenant.
Voici le code SQL pour crer la table pour MySQL. Si vous utilisez un autre serveur de base de
donnes, il faudra peut-tre adapter un peu les requtes. CodeIgniter possde des fonctionnalits
pour crer des tables, mais je nen parlerai pas ici, allons-y doucement.

1 CREATE TABLE IF NOT EXISTS login (
2 id int (11) NOT NULL ,
3 username varchar (32) NOT NULL ,
4 password varchar (128) NOT NULL ,
5 status char (1) NOT NULL DEFAULT A
6 ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ;
7
8 ALTER TABLE login ADD PRIMARY KEY ( id ) ;
9 ALTER TABLE login ADD UNIQUE KEY uk_login ( username ) ;
10 ALTER TABLE login MODIFY id int (11) NOT NULL AUTO_INCREMENT ;

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

63 public function login ( $username , $password ) {


64 $user = $this - > load_user ( $username ) ;
65 if (( $user !== NULL ) && password_verify ( $password , $user - > password ) ) {
66 $this - > _id = $user - > id ;
67 $this - > _username = $user - > username ;
68 $this - > save_session () ;
69 } else {
70 $this - > logout () ;
71 }
72 }
73
74 public function logout () {
75 $this - > clear_data () ;
76 $this - > clear_session () ;
77 }
78
79 protected function save_session () {
80 $this - > session - > auth_user = [
81 id = > $this - > _id ,
82 username = > $this - > _username
83 ];
84 }
85 }

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

Passons maintenant la mthode __construct() . Je suppose que vous laurez devin,


il sagit du constructeur. Nous allons dans un premier temps faire appel au constructeur de
CI_Model . Ensuite, nous allons charger les informations depuis la session en appelant la m-
thode load_from_session() . Si des informations existent, elles seront charges. Attention, si
vous nappelez pas explicitement le constructeur de la classe parente, il ne sera pas excut et vous
vous exposez de srieux problmes. Faites-moi confiance, je lai (involontairement ) test.
Jai aussi dfini une mthode __get() . Il sagit dune des mthodes magique de PHP, et jaime
ce qui est magique. Pour faire court, si vous essayez daccder un attribut qui nexiste pas, cest
cette mthode qui sera appele. Par exemple, si nous essayons daccder lattribut username ,
le modle retournera le rsultat de la mthode get_property_username() car cest ce que nous
avons dfini dans la mthode __get() . Nous aurons ainsi une proprit en lecture seule, car il ny a
pas de mthode pour laffecter. Vous pourriez dire quil suffirait daccder directement la mthode
get_property_username() pour avoir le nom dutilisateur. Ouais ! vous avez raisons. Mais cest
moins fun . Ah ! Noubliez pas dappeler la mthode __get() du parent ( CI_Model ), car
ce dernier utilise le mme mcanisme et si vous ne le faites pas, vous aurez de sacrs surprises (je
lai aussi test involontairement ).
Un autre usage de __get() , cest la possibilit davoir des attributs cacluls . Voyons le
cas de is_connected . Ni le modle, ni la base de donnes ne possdent de champ pouvant dire
si lutilisateur est connect ou non (en fait, on pourrait en avoir un, mais cela ne servirait pas
lexemple. . .). Pour savoir si lutilisateur est connect ou pas, nous testerons si lidentifiant est nul
et retournerons le rsultat. Tout cela de manire totalement transparente.
Les sections suivantes expliqueront comme se connecter, se dconnecter et vrifier si on est
connect.
Pour que cela fonctionne, nous devons galement charger automatiquement notre modle grce
au fichier application/config/autoload.php :

1 <? php
2 // (...)
3 $autoload [ model ] = array ( auth_user ) ;
4 // (...)

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 ) ;

La mthode login() va appeler la mthode load_user() pour retrouver lutilisateur dans


la base de donnes sur base de son nom dutilisateur. Ici, jutilise le constructeur de requte (voir
section 3.3.2 la page 31). Si un utilisateur est trouv, on vrifiera le mot de passe. CodeIgniter,
dans ses recommandations de scurit, invite utiliser les fonctions propres PHP en matire de
scurisation des mots de passes. Ainsi, pour gnrer le mot de passe de lutilisateur que nous avons
cr (voir section 3.4.1 la page 32), jai utilis la fonction password_hash() . Et pour vrifier si
celui fournit par lutilisateur est correct, jutilise la fonction password_verify() . Notez que je ne
sauvegarde pas le mot de passe dans la session, cela nest daucune utilit et il vaut mieux viter de
propager ce genre dinformation.

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

Passons la validation du formulaire en modifiant le fichier


application/config/form_validation.php . Nous allons simplement exiger que le nom
dutilisateur et le mot de passe soient fournis.

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 $config = array (
5 // (...)
6 site / connexion = > array (
7 array (
8 field = > username ,
9 label = > " Nom d utilisateur " ,
10 rules = > required
11 ),
12 array (
13 field = > password ,
14 label = > Mot de passe ,
15 rules = > required
16 )
17 )
18 );

Pour finir, nous ajoutons la mthode connexion() notre contrleur


application/controllers/Site.php pour afficher le formulaire dauthentification et sidentifier
si les donnes du formulaire sont valides.

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 public function connexion () {
7 $this - > load - > helper ( " form " ) ;
8 $this - > load - > library ( form_validation ) ;
9

10 $data [ " title " ] = " Identification " ;


11
12 if ( $this - > form_validation - > run () ) {
13 $username = $this - > input - > post ( username ) ;
14 $password = $this - > input - > post ( password ) ;
15 $this - > auth_user - > login ( $username , $password ) ;
16 redirect ( index ) ;
17 } else {
18 $this - > load - > view ( common / header , $data ) ;
19 $this - > load - > view ( site / connexion , $data ) ;
20 $this - > load - > view ( common / footer , $data ) ;
21 }
22 }
23 }

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 <! -- (...) -- >

Pour le contrleur, nous ne feront quajouter la mthode deconnexion() ci-dessous. Elle va


simplement dconnecter lutilisateur et renvoyer vers la page daccueil.

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Site extends CI_Controller {
5 // (...)
6 function deconnexion () {
7 $this - > auth_user - > logout () ;
8 redirect ( index ) ;
9 }
10 }

3.4.5 Contrle daccs


Jusqu prsent, notre systme dauthentification fonctionne de manire bancale. Nous pouvons
nous identifier et nous dconnecter, mais nous ne pouvons pas voir dans quel tat nous sommes.
Cest normal, nous allons rgler cela grce au contrle daccs.
Pour savoir si un utilisateur est authentifi, nous allons pouvoir utiliser la proprit
is_connected de notre modle.
Nous allons dabord utilise ce contrle pour la vue dentte. En effet, nous avons aussi bien le
lien de connexion et de dconnexion dans le menu. Nous allons ainsi afficher le lien de connexion
si le visiteur nest pas identifi et le lien de dconnexion si un utilisateur est identifi. Nous
pouvons galement en profiter pour ajouter un petit bonjour la personne connecte. La vue
application/views/common/header.php devient ainsi :

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

4 class Site extends CI_Controller {


5 // (...)
6 public function connexion () {
7 $this - > load - > helper ( " form " ) ;
8 $this - > load - > library ( form_validation ) ;
9

10 $data [ " title " ] = " Identification " ;


11
12 if ( $this - > form_validation - > run () ) {
13 $username = $this - > input - > post ( username ) ;
14 $password = $this - > input - > post ( password ) ;
15 $this - > auth_user - > login ( $username , $password ) ;
16 if ( $this - > auth_user - > is_connected ) {
17 redirect ( index ) ;
18 } else {
19 $data [ login_error ] = " chec de l authentification " ;
20 }

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

Nous allons ainsi crer le contrleur application/controllers/Panneau_de_controle.php


comme suit :

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class P an n e a u_ d e _c o n tr o l e extends CI_Controller {
5
6 public function index () {
7 if (! $this - > auth_user - > is_connected ) {
8 redirect ( index ) ;
9 }
10 $data [ " title " ] = " Paneau de configuration " ;
11
12 $this - > load - > view ( common / header , $data ) ;
13 $this - > load - > view ( dashboard / index , $data ) ;
14 $this - > load - > view ( common / footer , $data ) ;
15 }
16 }

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 >

Pour terminer, nous allons modifier la vue application/views/common/header.php pour


ajouter lentre de menu pour notre panneau de contrle.

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 <? php if ( $this - > auth_user - > is_connected ) : ? >
7 < li >
8 < ?= anchor ( p an n e au _ d e_ c o nt r o l e / index , " Panneau de contr le " ) ; ? >
9 </ li >
10 <? php endif ; ? >
11 < li > < ?= anchor ( contact , " Contact " ) ; ? > </ li >
12 </ ul >
13 <! -- (...) -- >
14 </ div >
15 <! -- (...) -- >

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.2 Base de donnes


La premire chose faire, cest de dfinir nos tables dans la base de donnes. La figure 4.1
la page 43 illustre celles que nous allons mettre en place. Il sagit dune construction minimaliste,
mais largement suffisant pour notre tutoriel.
La table Login a dj t cre au chapitre prcdent (voir section 3.4.1 la page 32).
La table Article va contenir nos articles. Chacun de ceux-ci auront un titre, un contenu, une
date et un auteur. Nous avons galement un champ alias qui va servir pour la cration de lURL
et un champ status qui va permettre de dire si larticle est publi ou non. Cela vous permettra
de rdiger des brouillons et de les publier seulement lorsquils seront prts. Nous avons galement

Figure 4.1 Table des utilisateurs et des articles

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 43


44 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

un champ id pour identifier les articles de manire unique dans la table.


Voici le code SQL pour crer la table pour MySQL. Si vous utilisez un autre serveur de base de
donnes, il faudra peut-tre adapter un peu les requtes. Attention, souvenez-vous que vous avez
dj cr la table Login . Si ce nest pas le cas, reportez-vous dabord la section 3.4.1 la page
32.

1 CREATE TABLE IF NOT EXISTS article (
2 id int (11) NOT NULL ,
3 title varchar (64) NOT NULL ,
4 alias varchar (64) NOT NULL ,
5 content text NOT NULL ,
6 date datetime NOT NULL ,
7 status char (1) NOT NULL DEFAULT W ,
8 author_id int (11) NOT NULL
9 ) ENGINE = InnoDB DEFAULT CHARSET = utf8 ;
10
11 ALTER TABLE article ADD PRIMARY KEY ( id ) ;
12 ALTER TABLE article ADD KEY idx_author_id ( author_id ) ;
13
14 ALTER TABLE article MODIFY id int (11) NOT NULL AUTO_INCREMENT ;
15

16 ALTER TABLE article ADD CONSTRAINT fk_article_login_id FOREIGN KEY (


author_id ) REFERENCES login ( id ) ;

4.3 Liste des articles


La premire chose que nous allons faire, cest afficher la liste des articles dj posts. OK, vous
allez dire quil ny a encore rien afficher, mais il faut bien commencer par quelque chose. Et puis,
un aspect qui est souvent nglig, cest la gestion des donnes absentes, et nous allons nous y atteler
ici.
Pour afficher la liste des articles, nous allons devoir crer un modle, un contrleur (qui servira
grer tout le blog) et des vues.

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 ;

Et voici donc notre modle application/models/Articles.php :



1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3

4 class Articles extends CI_Model {


5
6 protected $_list ;
7
8 public function __construct () {
9 parent :: __construct () ;
10 $this - > _list = [];
11 }
12
13 public function __get ( $key ) {
14 $method_name = get_property_ . $key ;
15 if ( method_exists ( $this , $method_name ) ) {
16 return $this - > $method_name () ;
17 } else {
18 return parent :: __get ( $key ) ;
19 }
20 }
21

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

14 <? php if ( $this - > articles - > has_items ) : ? >


15 <? php
16 foreach ( $this - > articles - > items as $article ) {
17 $this - > load - > view ( blog / article_resume , $article ) ;
18 }
19 ?>
20 <? php else : ? >
21 < div class = " col - md -12 " >
22 <p class = " alert alert - warning " role = " alert " >
23 Il n y a encore aucun article .
24 </ p >
25 </ div >
26 <? php endif ; ? >
27 </ div >
28 </ div >

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

Ensuite, il y a article_status . Kesako ? Souvenez-vous, nous avons dfini un


code pour le statut dun article. Pour le rendre plus parlant, jai dfini le modle
application/models/Article_status.php . Ce dernier remplacera le code avec un texte com-
prhensible par les humains.

1 <? php
2 defined ( BASEPATH ) OR exit ( No direct script access allowed ) ;
3
4 class Article_status {
5
6 protected $_status ;
7
8 public function __construct () {
9 $this - > _status = [
10 W = > [
11 text = > Brouillon ,
12 decoration = > warning
13 ],
14 P = > [
15 text = > Publi ,
16 decoration = > primary
17 ],
18 D = > [
19 text = > Supprim ,
20 decoration = > danger
21 ]
22 ];
23 }
24

25 public function __get ( $key ) {


26 $method_name = get_property_ . $key ;
27 if ( method_exists ( $this , $method_name ) ) {
28 return $this - > $method_name () ;
29 } else {
30 return parent :: __get ( $key ) ;
31 }
32 }
33
34 protected function ge t_ pr op er ty _l ab el () {
35 $result = [];
36 foreach ( $this - > _status as $key = > $value ) {
37 $result [ $key ] = < span class =" label label - . $value [ decoration ] . " >
. $value [ text ] . </ span > ;
38 }
39 return $result ;
40 }
41

42 protected function get_ prope rty_te xt () {


43 $result = [];
44 foreach ( $this - > _status as $key = > $value ) {
45 $result [ $key ] = $value [ text ];
46 }
47 return $result ;
48 }
49
50 protected function ge t_ pr op er ty _c od es () {
51 return array_keys ( $this - > _status ) ;
52 }

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

4 class Blog extends CI_Controller {


5
6 function index () {
7 $this - > load - > helper ( date ) ;
8 $this - > load - > model ( articles ) ;
9 $this - > load - > model ( article_status ) ;
10 $this - > articles - > load ( $this - > auth_user - > is_connected ) ;
11
12 $data [ title ] = " Blog " ;
13
14 $this - > load - > view ( common / header , $data ) ;
15 $this - > load - > view ( blog / index , $data ) ;
16 $this - > load - > view ( common / footer , $data ) ;
17 }
18 }

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

Figure 4.2 Page daccueil du blog sans articles

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 Cration dun article


Nous pouvons maintenant afficher la liste (vide) des articles. Tchons de la remplir un peu. . .

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

15 public function __construct () {


16 parent :: __construct () ;
17 $this - > clear_data () ;
18 }
19
20 public function __get ( $key ) {
21 $method_name = get_property_ . $key ;
22 if ( method_exists ( $this , $method_name ) ) {
23 return $this - > $method_name () ;
24 } else {
25 return parent :: __get ( $key ) ;
26 }
27 }
28
29 public function __set ( $key , $value ) {
30 $method_name = set_property_ . $key ;
31 if ( method_exists ( $this , $method_name ) ) {
32 $this - > $method_name ( $value ) ;
33 } else {
34 parent :: __set ( $key , $value ) ;
35 }
36 }
37
38 protected function clear_data () {
39 $this - > _alias = NULL ;
40 $this - > _author = NULL ;
41 $this - > _author_id = NULL ;
42 $this - > _content = NULL ;
43 $this - > _date = NULL ;
44 $this - > _id = NULL ;
45 $this - > _status = NULL ;
46 $this - > _title = NULL ;
47 }
48
49 protected function ge t_ pr op er ty _a li as () {
50 return $this - > _alias ;
51 }
52
53 protected function g e t_ p r op e r ty _ a ut h o r () {
54 return $this - > _author ;
55 }
56

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

69 protected function get_property_id () {

CHAPITRE 4. BLOG
52 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

70 return $this - > _id ;


71 }
72

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

85 public function load ( $id , $show_hidden = FALSE ) {


86 $this - > clear_data () ;
87 $this - > db
88 -> from ( article_username )
89 -> where ( id , $id ) ;
90 if (! $show_hidden ) {
91 $this - > db - > where ( status , P ) ;
92 }
93 $data = $this - > db
94 -> get ()
95 -> first_row () ;
96 if ( $data !== NULL ) {
97 $this - > _alias = $data - > alias ;
98 $this - > _author = $data - > author ;
99 $this - > _author_id = $data - > author_id ;
100 $this - > _content = $data - > content ;
101 $this - > _date = $data - > date ;
102 $this - > _id = $data - > id ;
103 $this - > _status = $data - > status ;
104 $this - > _title = $data - > title ;
105 }
106 }
107
108 public function save () {
109 $data = [
110 alias = > $this - > _alias ,
111 author_id = > $this - > _author_id ,
112 content = > $this - > _content ,
113 status = > $this - > _status ,
114 title = > $this - > _title
115 ];
116 if ( $this - > is_found ) {
117 $this - > db - > where ( id , $this - > _id )
118 -> update ( article , $data ) ;
119 } else {
120 $data [ date ] = date ( Y -m - d H : i : s ) ;
121 $this - > db - > insert ( article , $data ) ;
122 $id = $this - > db - > insert_id () ;
123 $this - > load ( $id , TRUE ) ;
124 }
125 }
126

127 protected function s e t _ p r o p e r t y _ a u t h o r _ i d ( $author_id ) {

CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 53

128 $this - > _author_id = $author_id ;


129 }
130

131 protected function s e t _ p r o p e r t y _ c o n t e n t ( $content ) {


132 $this - > _content = $content ;
133 }
134
135 protected function s e t_ p r op e r ty _ s ta t u s ( $status ) {
136 $this - > _status = $status ;
137 }
138
139 protected function se t_ pr op er ty _t it le ( $title ) {
140 $alias = url_title ( $title , underscore , TRUE ) ;
141 $this - > _title = $title ;
142 $this - > _alias = $alias ;
143 }
144 }

Je reconnais que le code est un peu long, mais il na rien de compliqu.


Comme pour les autres modles, nous avons la mthode __get() et les mthodes
get_property_*() pour accder aux proprits de lobjet, comme nous lavons dj fait aupa-
ravant.
Jai galement utilis la mthode __set() pour pouvoir affecter certaines proprits.
Le principe de fonctionnement est ici identique quavec __get() . Remarquez la mthode
set_property_title($title) . Elle va non seulement affect le contenu de lattribut $_title ,
mais galement celui de $_alias qui est la transposition du titre en URL. La mthode
url_title() est fournie par le helper URL .
La mthode load() permet de charger les donnes dun article sur base de son identifiant.
Notez quil y a un paramtre permettant dautoriser ou pas le chargement dun article non publi,
comme avec la liste des articles. Les donnes rcupres seront ensuite affectes aux attributs du
modle. Les donnes seront rcupres dans la vue article_username dfinie la section 4.3.1
la page 44.
La mthode save() va sauvegarder les donnes du modle dans la base de donnes. Cette m-
thode pourra aussi bien tre utilise pour faire une mise jour quune nouvelle insertion. Attention,
en cas de cration dun nouvel article, nous insrons la date depuis le code PHP. Ce nest pas du
tout une bonne pratique. Normalement, on met le temps courant comme valeur par dfaut pour
le champ date de notre table dans la base de donnes. Cette possibilit nest disponible pour les
serveurs MySQL qu partir de la version 5.6 pour les types datetime et jutilise un version 5.5 3 .
Il y a dautres moyens pour contourner le problme, mais cest un peu compliqu.
Vous constaterez que je recharge les donnes aprs une insertion. Il sagit dune manire dassi-
gner les donnes manquantes et massurer que le modle est correctement sauvegard. Cest un peu
gourmand en ressource (ne le faites pas sur un systme forte charge), mais terriblement efficace.

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 :

3. OK, cest une veille version, mais debian est debian

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

2 < div class = " row " >


3 < div class = " col - md -10 " >
4 < ul class = " nav nav - pills nav - justified " >
5 <? php if ( $this - > auth_user - > is_connected ) : ? >
6 < li role = " presentation " >
7 < ?= anchor ( blog / nouvel_article , " Nouvel article " ) ; ? >
8 </ li >
9 <? php endif ; ? >
10 </ ul >
11 </ div >
12 < div class = " col - md -2 " >
13 <p class = " text - right " >
14 Nombre d articles : < ?= $this - > articles - > num_items ; ? >
15 </ p >
16 </ div >
17 </ div >
18 <! -- (...) -- >

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

Figure 4.3 Formulaire de cration dun article du blog

30 $this - > load - > view ( common / footer , $data ) ;


31 }
32
33 protected function s e t _ b l o g _ p o s t _ v a l i d a t i o n () {
34 $list = join ( , , $this - > article_status - > codes ) ;
35 $this - > form_validation - > set_rules ( title , Titre , required | max_length [64]
) ;
36 $this - > form_validation - > set_rules ( content , Contenu , required ) ;
37 $this - > form_validation - > set_rules ( status , Statut , required | in_list [ .
$list . ] ) ;
38 }
39 }

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

Maintenant, il ne vous reste plus qu aller la page http://localhost/blog/nouvel_article.


html pour afficher le formulaire permettant de crer votre premier article sur votre tout nouveau
blog. Votre formulaire devrait ressembler la figure 4.3 la page 56.

4.5 Affichage dun article


Maintenant que vous avez publi votre premier article, il sagit de lafficher. Pour ce chapitre,
je ne vais pas respecter lordre des deux prcdents (modle, vue, contrleur), car il y a quelques
petites choses expliquer. Alors, attendez bien davoir fini cette partie avant de vouloir afficher
votre page, nous allons faire des trucs sympas.

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 // (...)

Ainsi, http://localhost/blog/<alias>_<id>.html seront rediriges vers http:


//localhost/blog/article/<id>. Notez que nous pourrions mettre nimporte quoi comme
alias, il nest pas pris en compte pour le routage. Il ne sert que pour les moteurs de recherche. Si
vous utiliser lidentifiant dun article avec lalias dun autre, cest larticle dont lidentifiant a t
donn qui sera affich.

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 Modification dun article


Maintenant que nous avons publi et affich un article, nous allons le modifier (je ne sais pas
pour vous, mais moi, il faut toujours que je fasse lune ou lautre erreur lorsque jcris ).
En fait, le processus de modification dun article est similaire celui de sa cration. Nous allons
simplement modifier un peu la vue et le contrleur pour pouvoir utiliser la mme mthode pour la
cration et la modification.

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

33 if ( $this - > form_validation - > run () == TRUE ) {


34 // le mod le Article () n est plus charg ici
35 // l auteur de l article n est plus d fini ici
36 $this - > article - > content = $this - > input - > post ( content ) ;
37 $this - > article - > status = $this - > input - > post ( status ) ;
38 $this - > article - > title = $this - > input - > post ( title ) ;
39 $this - > article - > save () ;
40 if ( $this - > article - > is_found ) {
41 redirect ( blog / . $this - > article - > alias . _ . $this - > article - > id ) ;
42 }
43 }

CHAPITRE 4. BLOG
RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 61

44 $this - > load - > view ( common / header , $data ) ;


45 $this - > load - > view ( blog / form , $data ) ;
46 $this - > load - > view ( common / footer , $data ) ;
47 }
48 // (...)
49 }

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 >

Et pour finir, noublions pas de modifier la vue application/views/blog/index.php pour


que le lien de cration dun nouvel article pointe sur notre nouvelle mthode :

1 < div class = " row " >
2 < div class = " col - md -10 " >
3 < ul class = " nav nav - pills nav - justified " >
4 <? php if ( $this - > auth_user - > is_connected ) : ? >
5 < li role = " presentation " > < ?= anchor ( blog / edition , " Nouvel article " ) ;
? > </ li >
6 <? php endif ; ? >
7 </ ul >
8 </ div >
9 < div class = " col - md -2 " >
10 <p class = " text - right " > Nombre d articles : < ?= $this - > articles - > num_items ;
? > </ p >
11 </ div >
12 </ div >

4.7 Suppression dun article


Pour supprimer un article, il suffit de changer son statut. Mais nous allons crer un bouton de
suppression pour simplifier la manuvre. . . Aussi, je vais vous parler un peu dAJAX (encore un
truc placer dans un entretien dembauche, mme si cest un peu pass de mode). Lide est ici de
demander une confirmation avant de supprimer un article.

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

26 $this - > load - > view ( common / header , $data ) ;


27 $this - > load - > view ( blog / delete , $data ) ;
28 $this - > load - > view ( common / footer , $data ) ;
29 }
30 }

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.

4.7.4 Confirmation AJAX


Je ne vais malheureusement pas vous faire un cours dAJAX ici. Je vais simplement vous dire
quil sagit dune technique permettant denvoyer des requtes au serveur sans recharger toute la
page. Pour (beaucoup) plus de dtails, je vous invite consulter laide en ligne sur le rseau MDN.
Pour raliser notre requte, nous aurons besoin dun script JavaScript. Je ne npancherai pas non
plus sur cette partie, mais plutt sur notre code PHP.
Pour nous simplifier les choses, nous allons crer une fentre modale grce Bootstrap et ajou-
ter un identifiant notre lien de suppression dans la vue de larticle. Modifions donc notre vue
application/views/blog/article.php :

1 < div class = " modal fade " id = " deleteModal " tabindex = " -1 " role = " dialog " aria -
labelledby = " myModalLabel " >
2 < div class = " modal - dialog " role = " document " >
3 < div class = " modal - content " >
4 < div class = " modal - header " >
5 < button type = " button " class = " close " data - dismiss = " modal " aria - label = "
Close " > < span aria - hidden = " true " >& times ; </ span > </ button >
6 < h4 class = " modal - title " id = " myModalLabel " > Suppression de l article </ h4 >
7 </ div >
8 < div class = " modal - body " id = " d ele te Mo da lC on te nt " >
9 </ div >
10 </ div >
11 </ div >
12 </ div >
13 <! -- (...) -- >
14 < ul class = " nav nav - pills nav - stacked " >
15 <! -- (...) -- >
16 < li >
17 < ?= anchor ([ blog , suppression , $this - > article - > id ] , " Supprimer " , [ id
= > menu_delete_article ]) ? >
18 </ li >
19 <! -- (...) -- >
20 </ ul >
21 <! -- (...) -- >

Ensuite, crons un script JavaScript js/article.js :



1 $ ( function () {
2 $ ( # deleteModal ) . on ( hidden . bs . modal , function () {
3 // Efface le contenu de la fen tre modale la fermeture
4 $ ( # de le te Mo da lC on te nt ) . html ( ) ;
5 }) ;
6 $ ( # m e n u_ d e le t e _a r t ic l e ) . click ( function () {

CHAPITRE 4. BLOG
66 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

7 var de le te _a rt ic le _ur l = $ ( this ) . attr ( href ) ;


8 $ . ajax ({
9 url : de le te _a rt ic le _u rl
10 }) . done ( function ( data ) {
11 $ ( # de le te Mo da lC on te nt ) . html ( data ) ;
12 $ ( # cancel_delete ) . click ( function () {
13 $ ( # deleteModal ) . modal ( hide ) ;
14 return false ;
15 }) ;
16 $ ( # deleteModal ) . modal ( show ) ;
17 }) ;
18 return false ;
19 }) ;
20 }) ;

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

Figure 4.4 Confirmation de la suppression darticle avec AJAX

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 }

Dans la mthode article() , jai cr la variable $data[script] (qui sera interprte en


tant que $script dans notre vue) afin dinsrer le script que nous avons cr prcdemment dans
la page de larticle.
Examinons maintenant la mthode suppression() , celle qui nous intresse vraiment. Co-
deIgniter nous fournit la possibilit de dtecter si une requte AJAX a t effectue grce
$this->input->is_ajax_request() . Si cest le cas, nous ne retournons que la vue partielle
application/views/blog/delete_confirm.php (dans notre exemple, la requte AJAX nest
effectue que dans le cas de la confirmation). Notre script js/article.js va rceptionner cette
vue et lafficher dans la fentre modale. Vous devriez avoir un affichage qui ressemble la figure 4.4
la page 67.
En cliquant sur le bouton Supprimer , larticle sera supprim et la page de rsultat saffichera.
Si vous cliquez sur Annuler , la fentre modale sera simplement ferme.

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.

Affichage slectif des boutons de publication et de suppression


Faites en sorte que le bouton de suppression ne saffiche pas si larticle est supprim et que le
bouton de publication ne saffiche pas si larticle est publi.

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 <! -- (...) -- >

Maintenant, ajoutons la mthode publication() 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 {

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.

Affichage slectif des boutons de publication et de suppression

Ici, nous nallons modifier que la vue application/views/blog/article.php . Nous ferons


un test pour chaque bouton concern pour savoir dans quel tat est 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 <? php if ( $this - > article - > status !== P ) : ? >
7 < li > < ?= anchor ([ blog , publication , $this - > article - > id ] , " Publier " ) ? > <
/ li >
8 <? php endif ; ? >
9 <? php if ( $this - > article - > status !== D ) : ? >
10 < li > < ?= anchor ([ blog , suppression , $this - > article - > id ] , " Supprimer " ,
[ id = > menu_delete_article ]) ? > </ li >
11 <? php endif ; ? >
12 < li > < ?= anchor ( blog / edition , " Nouvel article " ) ? > </ li >
13 <? php endif ; ? >
14 </ ul >
15 <! -- (...) -- >

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

2.1 Interactions entre les diffrents lments du patron MVC . . . . . . . . . . . . . . . 4


2.2 Structure originale des rpertoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3 Page daccueil initiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4 Adaptation de larborescence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.5 Page daccueil initiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Validation du formulaire de contact . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.7 Envoi russi dun e-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.8 chec de lenvoi dun e-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.1 Table des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32


3.2 Menu pour un visiteur non connecte . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3 Menu pour un utilisateur connect . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

4.1 Table des utilisateurs et des articles . . . . . . . . . . . . . . . . . . . . . . . . . . . 43


4.2 Page daccueil du blog sans articles . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
4.3 Formulaire de cration dun article du blog . . . . . . . . . . . . . . . . . . . . . . . 56
4.4 Confirmation de la suppression darticle avec AJAX . . . . . . . . . . . . . . . . . . 67

RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 71

Vous aimerez peut-être aussi