réalisez votre blog avec le framework codeigniter 3

75
Réalisez votre blog avec le framework CodeIgniter 3 Sébastien Adam 7 juillet 2017

Upload: hoangque

Post on 28-Jan-2017

225 views

Category:

Documents


0 download

TRANSCRIPT

  • Ralisez votre blog avec le framework CodeIgniter 3

    Sbastien Adam

    7 juillet 2017

  • ii RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • Table des matires

    1 Introduction 1

    2 Concepts de base 32.1 Le patron MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    2.1.1 Quest-ce que le patron MVC? . . . . . . . . . . . . . . . . . . . . . . . . . 32.1.2 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32.1.3 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.4 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.1.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

    2.2 Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2.1 Quest-ce quun framework ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2.2 Prsentation de CodeIgniter . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2.3 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.1 Installation standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3.2 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.3 Installation personnalise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.4 Premire page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.4.1 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.4.2 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.4.3 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.4.4 URL Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4.5 HTML Helper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

    2.5 Page de contact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.5.1 Une nouvelle page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172.5.2 Cration du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.5.3 Validation des donnes reues . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5.4 Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.5.5 Envoi de le-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    2.6 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.6.1 noncs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.6.2 Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    2.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    3 Authentification 293.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.2 Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    3.2.1 Sessions de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293.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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303.3.1 Configuration de la base de donnes . . . . . . . . . . . . . . . . . . . . . . . 313.3.2 Constructeur de requte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.3.3 Rcupration des donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

    3.4 Implmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.1 Table des utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.4.2 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.4.3 Authentification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.4.4 Dconnexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.4.5 Contrle daccs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    3.5 Exercice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.5.1 nonc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.5.2 Correction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

    3.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

    4 Blog 434.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.2 Base de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434.3 Liste des articles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

    4.3.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444.3.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464.3.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494.3.4 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    4.4 Cration dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504.4.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504.4.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534.4.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    4.5 Affichage dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.5.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.5.2 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574.5.3 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584.5.4 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

    4.6 Modification dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.6.1 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604.6.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

    4.7 Suppression dun article . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624.7.1 Modle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624.7.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634.7.3 Contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644.7.4 Confirmation AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

    4.8 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.8.1 noncs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684.8.2 Corrections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    4.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    TABLE DES MATIRES

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 partagermon enthousiasme.

    Nous allons ici passer en revue les diffrentes fonctionnalits dun site web, et voir commentles raliser avec CodeIgniter. Nous allons ainsi envisager diffrents aspects comme laffichage dunepage statique, la cration dun formulaire de contact, les sessions, lauthentification et la crationde contenu dynamique.

    Que vous soyez un autodidacte clair, un jeune dveloppeur, ou un dveloppeur plus confirmvoulant valuer CodeIgniter, vous tes au bon endroit !

    Entendons-nous bien, ceci nest pas un cours de dveloppement web. Je vais juste vous prsenterun 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 avoirdes 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 ensortirez trs bien.

    RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 1

    http://www.codeigniter.com/

  • 2 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Trve de bavardages, passons au vif du sujet. . . Pour ce tutoriel, jai utilis mon serveur web detest tournant sous Debian 8.5 (stable). Les versions des logiciels sont les suivantes :

    Apache 2.4.10 PHP 5.6.22 MySQL 5.5.49 CodeIgniter 3.0.6 1

    Vous ntes pas oblig davoir votre propre serveur ddi. Il existe des tas de solutions surinternet vous permettant de faire tourner un serveur web sur votre machine comme XAMPP, etbien dautres. . .

    Je vous recommande de lire ce document avec attention, sinon, vous pourriez passer ct dequelque 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 [email protected]. Attention, je ne corrigerai pas vos travaux, ni ne vous donneraide cours particulier ( moins de trouver un arrangement ).

    Je voudrais enfin terminer cette introduction en remerciant Jean-Michel HOUBRE pour sarelecture de ce document.

    1. Jai commenc la rdaction de ce tutoriel avec la version 3.0.3. Il est donc possible que vous trouviez desrfrences des versions plus anciennes.

    CHAPITRE 1. INTRODUCTION

    https://www.debian.org/index.fr.htmlhttps://www.apachefriends.org/fr/index.htmlmailto:[email protected]://creativecommons.org/licenses/by-nc-sa/4.0/

  • Chapitre 2

    Concepts de base

    2.1 Le patron MVC

    Bon, en thorie, le patron darchitecture logicielle modle-vue-contrleur (plein de motsgrandiloquents) doit faire partie de vos pr-requis. Mais comme cest un concept important, je vaisvite 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 codequi sert accder aux donnes de celui servant la gestion de laffichage et de celui destin grerles requtes des utilisateurs ainsi que les interactions entre laffichage et les donnes. Pour cela, nousutiliserons respectivement des modles, des vues et des contrleurs.

    Si vous faites des recherches sur internet propos du patron MVC, vous allez trouver des tonnesde ressources traitant du sujet et vous risquez vite dtre noy. Aussi, si vous vous lancez dans unediscussion ce propos, vous avez de fortes chances de vous retrouver pris entre les tirs croiss desdiffrentes chapelles. Je vais vous prsenter le point de vue qui, mon sens, est le meilleur : lemien.

    OK, certains ne seront pas daccord avec moi. Sachez seulement quil ny a pas une chapellequi soit meilleure que lautre (sauf la mienne, bien entendu). Ce que je voudrais faire ici, cest vousmontrer comment CodeIgniter intgre cette philosophie de codage. Pour le reste, vous serez de toutefaon 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 vosdonnes. Dans le jargon, on parle de CRUD (Create, Read, Update, Delete). En principe, ailleursdans 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 VueCest 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 pouvonsgalement trouver dans les vues des instructions concernant la programmation. Cest pratiquementinvitable. Cela permet de rendre les pages plus dynamiques.

    2.1.4 ContrleurLe 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 traversdes 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 queseul le contrleur accde au modle. Dautres acceptent que la vue communique directement avecle modle. Cest plus facile, mais cest moins propre. Encore une fois, cest vous de voir quelle estla meilleure pratique.

    2.1.5 ConclusionVoil, 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 vousinvite le creuser un peu plus, cela vous servira toujours.

    Attention, ce que jai prsent ci-avant est vraiment le strict minimum connatre. Si lune oulautre chose nest pas claire pour vous, revenez dessus, cest important.

    2.2 FrameworkMais 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

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 ncessaire, 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, larchitectureMVC est trs largement utilise actuellement dans le monde du dveloppement web. Alors quele concept est assez simple , si vous voulez limplmenter vous-mme, cela va vous prendre uncertain temps (et mme un temps certain ). Lusage du framework est donc une plus-value.

    2.2.2 Prsentation de CodeIgniterAinsi, 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 lestches les plus communes, tout en restant trs simple. Il a en effet t dvelopp avec pour objectifla simplicit et la rapidit.

    CodeIgniter est un framework MVC. Il implmente les modles, les vues et les contrleurs. Lagestion 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 exemplepas lusage systmatique dun modle comme dautres frameworks.

    Aussi, CodeIgniter est facilement extensible. Vous pouvez aisment adapter, ou remplacer, lesfonctionnalits 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 votre application des fonctionnalits qui sont acces-sibles partout. Par exemple, dans un helper, vous avez une fonction qui permet de gnrer lecode HTML pour un lien.

    Les librairies Les librairies sont des classes, et diffrent ainsi des helpers. Nous avons par exempleune 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 besoindune fonctionnalit, demandez-vous dabord si elle nexiste pas dj dans le framework avant de ladvelopper. Pour cela, nhsitez pas explorer la documentation en ligne. Il serait bte de rinventerla roue.

    2.3 Installation

    2.3.1 Installation standardBasta 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

    http://www.codeigniter.com/user_guide/index.htmlhttp://www.codeigniter.com/downloadhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 6 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Figure 2.2 Structure originaledes 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 leurutilit :

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

    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 pageressemblant 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 rpertoirelanguage (par exemple french ) vers le rpertoire application/language de votre frameworket le fichier core/MY_Lang.php de larchive vers le rpertoire application/core .

    2.3.2 ConfigurationCest ici que les choses srieuses commencent.

    CHAPITRE 2. CONCEPTS DE BASE

    http://localhost/http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 fichiersde 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 laconfiguration 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. Nousdevons dfinir la valeur du paramtre $config[base_url] . Comme nous lavons install surnotre machine locale, nous donnerons la valeur http://localhost/ . Bien entendu, si vous avezinstall 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 (voirsection 2.4.1 la page 9).

    Pour ceux qui ont install les fichiers de la traduction franaise, vous pouvez assigner la valeurfrench au paramtre $config[language] .

    Voici donc quoi doit ressembler les paramtres dont nous venons de parler (attention, neffacezpas les autres paramtres, sinon vous tes dans la mouise) :

    1

  • 8 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 9

    2.4.1 RoutageDaprs 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 mthodecorrespondante 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 utilisepar 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 contrlersite (cest dailleurs ce que nous ferons ), ladresse sera celle ci-dessous. Nous navons que lecontrleur 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 pagedaccueil soit (je suis un nostalgique de lHTML ) :

    http://localhost/index.html

    Comme toujours, avec CodeIgniter, tout est simple. Cette opration seffectue en seulementquelques oprations. . .

    Premire tape, donner lextension .html toutes nos pages . Pour cela, nous devons diterle fichier application/config/config.php (o ai-je bien pu entendre parler de ce fichier ?) et etassigner la valeur .html la variable $config[url_suffix] :

    1

  • 10 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Comme dernire tape, nous allons dfinir quelques rgles de routage. Et comme toujours, cela sefera de manire trs simple, grce au fichier application/config/routes.php . Dans ce dernierest cr une variable $route . Il sagit dun tableau associatif o les cls sont les URI que nousdonnons, et les valeurs les appels qui seront effectivement effectus. Ce tableau est parcouru demanire squentielle. Ds quune cl satisfait ladresse donne, elle est utilise. Ainsi, il est possibleque des rgles ne soient jamais atteintes. Si, sur votre site, pour une raison quelconque, ce ne sontpas 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 uncontrleur Site avec une mthode index() . Nous allons ainsi dfinir les rgles suivantes dans lefichier application/config/routes.php :

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 11

    Pour charger la vue, nous passons son chemin partir du rpertoire application/views , sanslextension. 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 lecontenue 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 pourle haut de la page et une autre pour le bas.

    1 8 9

    10

    11 12 16 17 18

    CHAPITRE 2. CONCEPTS DE BASE

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 12 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    19 20 21 22 Toggle navigation 23 24 25 26 27 S bastien Adam28 29 30 31 Accueil 32 33 34 35

    La seconde vue, application/views/site/index.php , permettra dafficher le contenu de lapage en elle-mme.

    1 2 3 4 Ceci est ma page daccueil 5 6 7 8 Bla , bla , bla ...9 Bla , bla , bla ...

    10 Bla , bla , bla ...11

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

    1 2 3 4 Sbastien Adam 20165 6 7 8 9

    10

    Je fois dj les plus presss dentre vous qui ont essay dafficher la page et ce la ne marchetoujours 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 partiepublique du site.

    Vous constaterez galement que dans len-tte et le contenu de la page, jai utilis une variableappele $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

    http://getbootstrap.com/http://getbootstrap.com/http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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. Cestun des concepts-cls de la philosophie du patron MVC. Avec CodeIgniter, ce mcanisme est trssimple, comme tout le reste. Il suffit de dfinir un tableau associatif dans le contrleur et de le passerau Loader . Les cls du tableau associatif seront utilises comme nom de variable dans la vue.

    Voici ce quest devenue notre mthode :1

  • 14 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    13.

    2.4.4 URL HelperBon, 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 fautjamais faire ! En effet, si nous dplaons la structure de notre site, cela perturber fortement lefonctionnement du site.

    Nous pourrions imaginer des tas de manires pour rsoudre ce problme. Mais CodeIgniter ladj fait pour nous (rappelez-vous du rle dun framework ). Il existe le URL Helper qui vanous fournir toute une srie de fonction permettant la gestion des URL. Je vais commencer parvous 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 cesfonctions sera le suivant :

    site_url("index") http://localhost/index.htmlbase_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

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 15

    1 2 Accueil

    2.4.5 HTML HelperDans cette partie, nous allons explorer quelques fonctions du HTML Helper . Et dans cette partie,

    je 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 laversion utilise. Pour le HTML 5, cette balise est trs simple. Mais pour les versions antrieures deHTML, trouver la bonne balise tait parfois un vrai parcours du combattant. Cette fonction nousenlve toute cette problmatique.

    Ainsi, la fonction qui va nous gnrer notre DOCTYPE est doctype() . Voici une exemplepour gnrer celui de HTML 5 :

    1 echo doctype(html5); // affiche :

    La liste des versions valides se trouve dans le fichier application/config/doctypes.php . Jene vous conseille pas dy toucher. Toutefois, si vous utilisez des types qui ne sy trouvent pas, vouspouvez 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 derecherches. En gnral, ces balises ont comme attribut soit name , soit http-equiv ainsi quelattribut 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 : 3 echo meta("viewport", "width=device -width ,initial -scale=1");4 // affiche :

    Cette fonction a toutefois un problme. HTML 5 a introduit lattribut charset , et notrefonction ne permet pas de le gnrer. Vous me direz : ce nest pas grave, on na qu crire labalise 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 dela fonction meta() . Nous pourrions directement modifier le fichier html_helper.php danssystem/helpers . Cest vrai, mais si vous faites a, je viens vous tirer les oreilles. Et lorsquevous 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 dece 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 lehelper, cest notre fichier qui sera charg en premier, et cest notre fonction adapte qui sera utiliseet non celle du framework.

    Voici le contenu de notre fichier :1

  • 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 => $newline13 )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 compatibility22 $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 .= . $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 sont charset , http-equiv , name etproperty . 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 :

    Je ne sais pas pour vous, mais moi, je narrive jamais retenir la syntaxe exacte pour linsertiondune feuille de style dans la page HTML. Cest pourtant une opration que lon doit effectuer trsrgulirement. Mais jai du mal avec cela. CodeIgniter a donc dfini une fonction spcialement pourmoi (enfin, elle existe et je laime beaucoup ) : link_tag() . Voici un exemple de son utilisation :

    1 echo link_tag("css/style.css");2 // affiche :

    Outre les feuilles de style, cette fonction permet galement de dfinir licne du site, les feuillesde 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 destitres :

    1 echo heading("Welcome", 3); // affiche : Welcome

    Cest une fonction toute simple. Le premier paramtre reoit le texte du titre. Le deuximeparamtre reoit le niveau du titre. Sil nest pas donn, le niveau par dfaut est 1 . La fonction

    CHAPITRE 2. CONCEPTS DE BASE

    http://ogp.me/http://www.codeigniter.com/user_guide/helpers/html_helper.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 cesfonctions ? Cest vous de voir. Soit vous prfrez taper votre code HTML vous-mme, soit vousprfrez utiliser les fonctions. On peut juste dire que le rendu des pages sera un poil plus rapidesans les fonctions, mais que ces dernires pourront vous aider si vous avez des doutes quant lasyntaxe de vos balises, ou simplifier des tches rptitives.

    2.5 Page de contactDans 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 pageLa 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 soittermine.

    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 titrede la page et charger les vues. Nous la complterons plus tard.

    1 5 6 7 8

    CHAPITRE 2. CONCEPTS DE BASE

    http://www.codeigniter.com/user_guide/helpers/html_helper.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 18 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Maintenant, si nous allons ladresse http://localhost/contact.html, nous avons notre pageavec 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 lutilisationde la fonction anchor() du helper URL .

    Si vous navez pas le rsultat attendu, revrifier les tapes prcdentes.

    2.5.2 Cration du formulaireIl 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 nousfaciliter 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 FormHelper :

    1 4 5 6 7 8 9

    10

    11 12 13 14 15 16 17 18 19

    CHAPITRE 2. CONCEPTS DE BASE

    http://localhost/contact.htmlhttp://www.codeigniter.com/user_guide/helpers/url_helper.htmlhttp://www.codeigniter.com/user_guide/helpers/form_helper.htmlhttp://www.codeigniter.com/user_guide/helpers/form_helper.htmlhttp://www.codeigniter.com/user_guide/helpers/form_helper.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 19

    20

    21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38

    Pour ce qui est du code HTML, il est assez simple et rptitif. Je me suis bas sur les exemplesde la documentation de Bootstrap. Vous pouvez bien videmment utiliser votre propre frameworkdaffichage (ou pas).

    Il est noter que la plupart des frameworks utilisent leurs propres fonctions. Si vous voulez lesadapter 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 unefois, avec CodeIgniter, tout est trs simple.

    Mais revenons notre vue. Je vous passe lusage de la fonction heading() , cela a dj t vuprcdemment.

    La premire fonction sur laquelle nous allons nous pencher est form_open() . Celle-ci vacrer la balise douverture du formulaire , mais pas uniquement. Le premier para-mtre est la route donnant ladresse o sera envoy le formulaire. Cette route sera calculecomme avec la fonction site_url() . Ainsi, dans notre exemple, contact sera transform enhttp://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 webappel Cross-Site Request Forgery , abrg CSRF (parfois prononc sea-surfing en anglais) ouXSRF. Pour viter cela, on ajoute un champ cach avec un jeton. Si le jeton nest pas prsent, ou esterron, 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

  • 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 utiliseronsla fonction form_close() . Cette dernire ne prend aucun paramtre et va simplement afficher . Vous pouvez aisment vous en passer, ou pas si vous voulez garder une certaine cohrencedans votre code.

    Les autres fonctions ont des noms qui sont assez explicites. form_label() va gnrer la balise , form_input() va gnrer la balise , etc. Pour plus de dtails nhsitez pas consulter laide en ligne.

    2.5.3 Validation des donnes reuesUn 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 : jene vais pas vous faire un cours exhaustif sur la scurit en ligne. Je ne suis dailleurs pas comptentpour cela. Mais je peux vous dire que je me souviens encore aujourdhui de la premire dmonstrationde la vulnrabilit dun de mes sites (et il y a des annes de cela). Alors sil y a un point sur lequelnotre attention doit se porter, cest celui-ci.

    Ainsi, CodeIgniter possde la librairie Form Validation qui soccupe de, je vous le donne enmille , la validation des donnes reues dun formulaire. Il sagit dune librairie assez volue quipermet de raliser la mme chose de diffrentes manires. Nous allons en voir une seule. Ce nestpeut-tre pas celle que vous prfrerez, mais elle me sduit par son ct magique .

    Je vous invite garder la page de documentation sur la librairie de validation ouverte en mmetemps 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 groupede rgles la mthode de notre contrleur (comme dcrit ici). OK, je nai peut-tre pas t trsclair. . . 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 configurationapplication/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-maildoit tre valide. Le contenu de notre fichier doit ressembler ceci :

    1

  • 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 queles rgles sappliquent la mthode contact du contrleur site . Une rgle peut dfinirplusieurs exigences, comme pour le champ email .

    Maintenant, nous crons la vue qui sera affiche en cas de succs. Son contenu nestpas spcialement important, il sagit juste dun message de russite. Voici le code de la vueapplication/views/site/contact_result.php :

    1 2 3 4 5 6 Merci de nous avoir envoy ce mail. Nous y rpondrons dans les meilleurs d

    lais.7 8 9

    10 11

    Pour terminer, il va nous falloir modifier notre contrleur afin de lancer la validation et, suivantque les donnes dentre sont valides ou pas, afficher la page de succs ou nouveau afficher la pagede contact. La validation se fera en appelant la mthode run() de la librairie de validation desformulaires. La mthode de notre contrleur ressemblera ceci :

    1

  • 22 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Voil, maintenant, tant que vous nenvoyez pas de donnes valides, vous restez sur le formulairede contact. Sinon, vous avez une page indiquant que votre message a bien t envoy. Et ce qui estmagique, cest quaucune rgle de validation napparat dans la mthode du contrleur.

    2.5.4 Affichage des erreursSi 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 vousmontrer comment afficher les erreurs survenues. Aussi, les champs seront remplis avec les valeursdj 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 leserreurs 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 emailcomme exemple. Tout dabord, sil y a un message derreur, jajoute la classe has-error au bloccontenant le champ du formulaire. Ensuite, jajoute la valeur du champ reue par le serveur commedeuxime paramtre de la fonction form_input() . Cette dernire remplira le champ avec cettevaleur. 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 dejolies surprises ).

    1 2 3

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 23

    Figure 2.6 Validation du formulaire de contact

    1

  • 24 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    message envoy via le formulaire de votre site vous arrivera. Notez que jai ici directement donnmon adresse e-mail comme destinataire. En respectant les bonnes pratiques, vous aurez mis cetteadresse dans un fichier de configuration. Ainsi si elle doit changer, vous naurez pas parcourir toutvotre code la recherche des corrections effectuer.

    Il se peut que, pour un raison ou une autre, votre e-mail ne puisse pas tre envoy. Commentpeut-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 mthodeprint_debugger() qui va nous afficher ce qui sest pass.

    1

  • 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

    1 2 3 4 5

  • 26 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    application/config/email.php ci-dessous. Pour connatre les paramtres donner, vous devezcontacter le fournisseur de service mail (si vous avez un client de messagerie, il sagit des paramtresdu compte).

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 27

    voir si vous pouvez exploiter les rgles de validation des formulaires.

    2.6.2 CorrectionsVoici les solutions que je suggre pour les exercices proposs. Je vous invite ardemment dabord

    faire les exercices avant de lire ces solutions.

    Page de prsentation

    Pour ajouter une page, il y a trois choses faire : crer la mthode correspondante dans lecontrleur, crer la vue et ajouter lentre dans le menu principal.

    Nous allons modifier notre contrleur application/controllers/Site.php pour lui ajouterla mthode apropos() :

    1 4 5 6 7 bla , bla , bla ...8 bla , bla , bla ...9 bla , bla , bla ...

    10 bla , bla , bla ...11 12

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

    1 2 3 4 5 6 7 8 9

    CHAPITRE 2. CONCEPTS DE BASE

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 28 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Confirmation e-mail

    Le champ de validation de ladresse e-mail se fait en deux tapes : ajouter le champs dans lavue et ajouter la rgle de validation correspondante.

    Modifions notre vues application/views/site/contact.php pour ajouter la demande deconfirmation entre ladresse e-mail et le titre :

    1 2 3 4

  • Chapitre 3

    Authentification

    3.1 IntroductionDans 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 dsle dpart. Ce que je vais vous montrer ici nest pas une scurisation digne de Fort Knox . Il y adautres lments prendre en compte, comme le chiffrement. . .

    Mais avant de rentrer dans le vif du sujet, je dois dabord introduire quelques concepts commeles sessions et les bases de donnes. Bon, OK, vous tes senss maitriser ces domaines, mais on verracomment les grer avec CodeIgniter. Et un petit rafraichissement ne fait pas de tord.

    3.2 Sessions

    3.2.1 Sessions de PHPSi vous ne connaissez pas les sessions de PHP, je vous invite consulter laide en ligne. Pour faire

    court, les sessions permettent votre site de retenir des informations dune page lautre, commele fait dtre identifi ou pas, davoir mis des articles dans son panier ou pas, etc. Ces informationssont stockes sur le serveur web.

    Pour dmarrer une session, on utiliser linstruction session_start() . PHP va alors crer unidentifiant spcial qui va permettre de rcuprer les donnes sauvegardes. Ne vous prenez pas tropla tte pour savoir comment cela fonctionne, PHP fait a trs bien sans vous . Si vous voulezquand-mme comprendre, ou si vous avez des problmes, vous pouvez consulter laide en ligne (cenest pas indispensable, mais cest chaudement recommand ).

    Les donnes sauvegarder devront tre enregistres dans la variable spciale $_SESSION . Ilsagit dun tableau associatif, une structure de donnes trs courante en PHP, qui est accessibledepuis nimporte o dans votre programme. Attention, cette variable naccepte pas tous les typesde donnes. Les donnes scalaires (nombres, chaines de caractres. . .) sont trs bien acceptes. Pourles autres, nhsitez pas faire des tests.

    Voici un petit exemple dutilisation des sessions en PHP :1

  • 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 . Cetteincrmentation ne vaut que pour vous. Si quelquun dautre affiche la page, ou si vous utilisez unautre navigateur, le dcompte sera diffrent.

    3.2.2 Sessions avec CodeIgniterPour utiliser les sessions avec CodeIgniter, nous pourrions trs bien utiliser les mcanismes

    internes de PHP. Cependant, CodeIgniter ajoute certaines fonctionnalits aux sessions. Je ne lesdvelopperai 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 nousallons lutiliser tout le temps, je vous conseille de la charger automatiquement. Modifions ainsi lefichier application/config/autoload.php :

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 31

    3.3.1 Configuration de la base de donnesCodeIgniter 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

  • 32 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Loginidusernamepasswordstatusid: id

    Figure 3.1 Table des utilisateurs

    Les mthodes du constructeur de requte se rapprochent trs fort des commandes SQL. Il enpropose aussi des tas dautres. Si cela vous intresse, nhsitez pas consulter laide en ligne (a yest, je recommence ).

    3.3.3 Rcupration des donnesUne 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 tableclient . 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 ImplmentationVoyons 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 modlepour y accder.

    3.4.1 Table des utilisateursIci, 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 etun statut pour chaque utilisateur, mais nous ne lutiliserons pas maintenant.

    Voici le code SQL pour crer la table pour MySQL. Si vous utilisez un autre serveur de base dedonnes, il faudra peut-tre adapter un peu les requtes. CodeIgniter possde des fonctionnalitspour 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 A6 ) 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

    http://www.codeigniter.com/user_guide/database/query_builder.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 33

    Lidentifiant est de type entier et son incrmentation est automatique. Nous avons galementveiller ce que les noms dutilisateur soient uniques.

    Maintenant ajoutons un utilisateur. Comme nous navons implment aucune interface cesujet, nous devrons le faire via une requte SQL.

    1 INSERT INTO login (username , password , status ) VALUES (admin , $2y$10$UyXEYppMuVnYN3Vd8l/enu3UoLr9zPTOXuQGWiZ/h4GQejoCJvlH., A);

    Oups ! Jen vois qui sont un peu effray par le mot de passe. Ne vous inquitez pas, ce nestpas ce que vous allez devoir taper pour vous identifier. Un bonne pratique (pour ne pas dire uneobligation) 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 encoreun honteux raccourci, disons que cela ralentit fortement le processus de piratage). Le mot de passeest ici password et nous verrons plus tard comment il a t encod.

    3.4.2 ModleComme 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 sauvegarderdans le fichier application/models/Auth_user.php .

    1

  • 34 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    36 protected function get_property_is_connected () {37 return $this ->_id !== NULL;38 }39

    40 protected function get_property_username () {41 return $this ->_username;42 }43

    44 protected function load_from_session () {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 ->db55 ->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 ->_username83 ];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

    http://www.codeigniter.com/user_guide/general/models.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 deCI_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, sivous nappelez pas explicitement le constructeur de la classe parente, il ne sera pas excut et vousvous 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 jaimece qui est magique. Pour faire court, si vous essayez daccder un attribut qui nexiste pas, cestcette 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 nousavons dfini dans la mthode __get() . Nous aurons ainsi une proprit en lecture seule, car il ny apas de mthode pour laffecter. Vous pourriez dire quil suffirait daccder directement la mthodeget_property_username() pour avoir le nom dutilisateur. Ouais ! vous avez raison. Mais cestmoins fun . Ah ! Noubliez pas dappeler la mthode __get() du parent ( CI_Model ), carce dernier utilise le mme mcanisme et si vous ne le faites pas, vous aurez de sacres surprises (jelai aussi test involontairement ).

    Un autre usage de __get() , cest la possibilit davoir des attributs calculs . Voyons lecas de is_connected . Ni le modle, ni la base de donnes ne possdent de champ pouvant diresi lutilisateur est connect ou non (en fait, on pourrait en avoir un, mais cela ne servirait paslexemple. . .). Pour savoir si lutilisateur est connect ou pas, nous testerons si lidentifiant est nulet retournerons le rsultat. Tout cela de manire totalement transparente.

    Les sections suivantes expliqueront comme se connecter, se dconnecter et vrifier si on estconnect.

    Pour que cela fonctionne, nous devons galement charger automatiquement notre modle grceau fichier application/config/autoload.php :

    1

  • 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 pascompliqu.

    Tout dabord, modifions la vue application/views/common/header.php qui sert dentte denos pages pour ajouter le lien vers la page didentification :

    1 2 3 4 5 6 7 8 9

    10 11 12

    Vous pouvez afficher la page daccueil pour vrifier que le lien apparait bien dans le menu. Eta 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 simpleformulaire, similaire la page de contact.

    1 2 3 4 5 6 7 8 9 10

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 37

    Passons la validation du formulaire en modifiant le fichierapplication/config/form_validation.php . Nous allons simplement exiger que le nomdutilisateur et le mot de passe soient fournis.

    1

  • 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 mthodesclear_data() et clear_session() .

    Pour mettre cela en pratique, nous allons simplement crer une entre dans le menu principalet une mthode dans notre contrleur.

    La modification de la vue application/views/common/header.php sera faite comme suit :1 2 3 4 5 6 7 8 9

    10 11 12 13 14

    Pour le contrleur, nous ne ferons quajouter la mthode deconnexion() ci-dessous. Elle vasimplement dconnecter lutilisateur et renvoyer vers la page daccueil.

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 39

    Figure 3.2 Menu pour un visiteur non connec-te

    Figure 3.3 Menu pour un utilisateur connect

    1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15 16 |17 Bienvenue 18 19 20

    Les figures 3.2 la page 39 et 3.3 la page 39 nous montrent les diffrences qui devraientapparaitre 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 mdecinecurative sur notre contrleur. Avant, nous ne vrifions pas si lidentification avait russi ou pas. Nousallons le faire maintenant. Et en cas dchec, nous allons rafficher le formulaire de connexion avecun message derreur. Voici quoi va ressembler le nouveau code de notre mthode connexion() .

    1

  • 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, nousserons redirigs vers la page daccueil. Sinon, un message derreur est dfini. Nous allons modifier lavue application/views/site/connexion.php pour afficher ce message derreur en cas dchecdidentification.

    1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15

    3.5 ExerciceNormalement, 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 mcanismequi vous permet de vous identifier. Si ce nest pas le cas, vous pouvez utiliser le code se trouvantdans le fichier site_base2.7z accompagnant ce document (galement disponible sur mon sitepersonnel).

    3.5.1 noncVoici 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. Cedernier ne va pour linstant rien contenir, et le contrleur ne devra avoir quune page dindex. Parcontre la page ne peut tre accessible que par des personnes identifies. Lentre du menu vers cepanneau de contrle ne sera galement visible que pour les personnes identifies.

    3.5.2 CorrectionVoici 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

    http://www.sebastienadam.be/connaissances/cours/realisez_votre_blog_avec_codeigniter_3.phphttp://www.sebastienadam.be/connaissances/cours/realisez_votre_blog_avec_codeigniter_3.phphttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 41

    Nous allons ainsi crer le contrleur application/controllers/Panneau_de_controle.phpcomme suit :

    1 4 5 6 7 Ceci est mon panneau de contrle8 9

    Pour terminer, nous allons modifier la vue application/views/common/header.php pourajouter lentre de menu pour notre panneau de contrle.

    1 2 3 4 5 6 7 8 9

    10 11 12 13 14 15

    CHAPITRE 3. AUTHENTIFICATION

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 42 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    3.6 ConclusionVoil, 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 fassetomber 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 connectsdes simples visiteurs. Toutes les personnes identifies ont ainsi les mmes droits. Nous pourrionsutiliser les noms des utilisateurs pour les diffrencier et leur donner des droits diffrents, mais cestune trs mauvaise pratique. Il est prfrable dutiliser des groupes et de donner les permissions surces 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 surinternet sont nombreuses.

    CHAPITRE 3. AUTHENTIFICATION

    https://duckduckgo.com/?q=Role+based+access+control&ia=abouthttps://duckduckgo.com/?q=Role+based+access+control&ia=abouthttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • Chapitre 4

    Blog

    4.1 IntroductionMaintenant 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 pasque vous allez crer le prochain gestionnaire de contenu la mode (h, je laurais fait avant voussi ctait si simple ! ), le but de ce chapitre est juste de vous montrer au travers dun exempleconcret comment interagir avec une base de donnes.

    Au niveau des fonctionnalits, nous allons dvelopper un blog basic, mais fonctionnel. Nousallons crer, publier, modifier, supprimer des articles. Avec cela, nous allons couvrir peu prstoutes les oprations lmentaires concernant les bases de donnes. Libre vous, ensuite, de creuserle sujet et daller plus loin.

    4.2 Base de donnesLa 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 lURLet un champ status qui va permettre de dire si larticle est publi ou non. Cela vous permettrade rdiger des brouillons et de les publier seulement lorsquils seront prts. Nous avons galement

    Loginidusernamepasswordstatusid: id

    acc

    Articleidtitlealiascontentdatestatusauthor_idid: id

    acc ref: author_id

    acc

    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 avezdj cr la table Login . Si ce nest pas le cas, reportez-vous dabord la section 3.4.1 la page32.

    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 NULL9 ) 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 articlesLa 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 attelerici.

    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 ModleGnralement, 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 pourla liste des articles, et nous crerons un peu plus tard le modle pour larticle en lui-mme. Si vousvoulez 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. Deplus, nous nafficherons quune partie du contenu de larticle. Cela naurait pas beaucoup de sensdafficher larticle en entier lorsquon liste tous les articles.

    Pour limiter le contenu de larticle, nous allons utiliser une fonction SQL, nous navons pas trople choix (en fait, si, mais cela va beaucoup compliquer les choses, croyez moi sur parole). Si nousvoulons limiter le contenu sur base dun certain nombre de caractres, nous pouvons utiliser lafonction SUBSTRING() , mais il y a de fortes chances pour que le dernier mot soit coup, et ce nesera pas trs joli. Nous pourrions galement utiliser la fonction SUBSTRING_INDEX() en donnant

    CHAPITRE 4. BLOG

    https://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_substringhttps://dev.mysql.com/doc/refman/5.5/en/string-functions.html#function_substring-indexhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 45

    un espace comme dlimiteur, mais alors, l, nous aurons une incertitude quand la taille du texteaffich (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 basede donnes, veuillez vous rfrer sa documentation.

    Pour avoir le nom de lauteur de larticle plutt que son identifiant, il va falloir faire une jointureentre 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 souventeffectue, mme pour afficher les dtails dun article.

    Nous allons donc crer une vue comme suit :1 CREATE VIEW article_username 2 AS3 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

  • 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 jexpliqueensuite.

    Jai utilis la mme mthode __get() que pour le modle servant lauthentification (il faudraque je pense crer une sur-classe avec les mthodes courantes). Si vous avez rat les explicationsla 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 etnum_items qui donne le nombre darticles et has_items qui indique sil y a des articles oupas. Jai galement dfini une mthode load() qui va charger les articles.

    Vous constaterez que la mthode load() prend un paramtre $show_hidden qui est FALSEpar dfaut. Nous laissons ici la possibilit de nafficher que les articles publis ou galement lesbrouillons 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 dappelerla mthode load() . Ensuite, les articles seront accessibles via la proprit items . Les autreslments seront utiles dans les vues (croyez-moi, vous vous en rendrez vite compte ). Si vouscomptez publier votre site, il faudra faire voluer ce modle, notamment pour ajouter des fonctionsde pagination.

    4.3.2 VueJavais 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 vueapplication/views/blog/index.php en premier :

    1 2 3 4 5 6 7 8 9

    10 Nombre darticles:

    11 12 13

    1. Idalement, au lieu de la proprit items , nous utiliserions un itrateur, mais je ne voulais pas vous perdreici.

    CHAPITRE 4. BLOG

    https://en.wikipedia.org/wiki/Iterator_patternhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 47

    14 15 20 21 22 23 Il ny a encore aucun article.24 25 26 27 28

    Nous allons afficher le titre de la page et ensuite le nombre darticle grce la propritnum_items de notre modle (je vous avais dit que a servirait ). Ensuite, nous faisons untest 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 petitconcept intressant placer dans un entretien dembauche : la vue partielle. Certaines personnesen font des pataqus autour de ce concept, mais en ralit, cest trs simple : il sagit dune vueappele partir dune autre vue. Une mme vue partielle peut tre appele partir de diffrentesautres 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 2 3 4 5 6 -7 8 9 -

    10 11 12 13 14 ...15

    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 unutilisateur tape du code HTML, il sera affich et non interprt. Une rgle de base : nafficherjamais tel quel du texte introduit par une utilisateur. Vous pourriez avoir de drles desurprises. . .

    Je vois que certains dentre vous se posent des questions propos de certains lments de cettevue. Cest normal, elle contient des choses que vous navez pas encore vues. Pour ceux qui ne seposent 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 permetde formater facilement une date.

    CHAPITRE 4. BLOG

    http://php.net/manual/fr/function.htmlentities.phphttp://www.codeigniter.com/user_guide/helpers/date_helper.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 48 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    Ensuite, il y a article_status . Kesako ? Souvenez-vous, nous avons dfini uncode pour le statut dun article. Pour le rendre plus parlant, jai dfini le modleapplication/models/Article_status.php . Ce dernier remplacera le code avec un texte com-prhensible par les humains.

    1

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 49

    53 }

    Notre modle contiendra une proprit label qui retournera un tableau des textes des statutsavec un formatage HTML, une proprit text qui retournera un tableau des textes des statuts etune proprit codes qui retourne la liste des codes possibles.

    Vous constaterez que les donnes sont hard-codes 2 dans le constructeur. Sachez que cest unepratique proscrire. Idalement, vous crerez une table dans votre base de donnes pour contenirla 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 ContrleurVoil, 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

  • 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 notreblog. Comme toujours, avec CodeIgniter, cest trs simple. Nous allons juste modifier le fichierapplication/config/routes.php :

    1

  • 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 get_property_alias () {50 return $this ->_alias;51 }52

    53 protected function get_property_author () {54 return $this ->_author;55 }56

    57 protected function get_property_author_id () {58 return $this ->_author_id;59 }60

    61 protected function get_property_content () {62 return $this ->_content;63 }64

    65 protected function get_property_date () {66 return $this ->_date;67 }68

    69 protected function get_property_id () {

    CHAPITRE 4. BLOG

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 52 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    70 return $this ->_id;71 }72

    73 protected function get_property_is_found () {74 return $this ->_id !== NULL;75 }76

    77 protected function get_property_status () {78 return $this ->_status;79 }80

    81 protected function get_property_title () {82 return $this ->_title;83 }84

    85 public function load($id , $show_hidden = FALSE) {86 $this ->clear_data ();87 $this ->db88 ->from(article_username )89 ->where(id, $id);90 if (! $show_hidden) {91 $this ->db ->where(status , P);92 }93 $data = $this ->db94 ->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 ->_title115 ];116 if ($this ->is_found) {117 $this ->db ->where(id, $this ->_id)118 ->update(article , $data);119 } else {120 $data[date] = date(Y-m-dH: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 set_property_author_id($author_id) {

    CHAPITRE 4. BLOG

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 53

    128 $this ->_author_id = $author_id;129 }130

    131 protected function set_property_content($content) {132 $this ->_content = $content;133 }134

    135 protected function set_property_status($status) {136 $this ->_status = $status;137 }138

    139 protected function set_property_title($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 mthodeset_property_title($title) . Elle va non seulement affecter le contenu de lattribut $_title ,mais galement celui de $_alias qui est la transposition du titre en URL. La mthodeurl_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 dumodle. 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 dutout une bonne pratique. Normalement, on met le temps courant comme valeur par dfaut pourle champ date de notre table dans la base de donnes. Cette possibilit nest disponible pour lesserveurs 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 peugourmand en ressource (ne le faites pas sur un systme forte charge), mais terriblement efficace.

    4.4.2 VueComme vue pour la cration dun article, nous aurons un formulaire clas-

    sique comparable aux formulaires de contact et dauthentification. Voici donc la vueapplication/views/blog/form.php :

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

    CHAPITRE 4. BLOG

    http://www.codeigniter.com/user_guide/helpers/url_helper.htmlhttp://creativecommons.org/licenses/by-nc-sa/4.0/

  • 54 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    1 2 3 4 5 6 7 8 9

    10 11 12 13

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 55

    2 3 4 5 6 7 8 9

    10 11 12 13 14 Nombre darticles: 15 16 17 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 pasencore 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

  • 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 set_blog_post_validation () {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 quelutilisateur est bien identifi. Si ce nest pas le cas, nous allons afficher la page daccueil de notreblog (la liste des articles).

    Nous avons dj utilis le fichier application/config/form_validation.php pour validerdes donnes dun formulaire. Mais ici, nous allons faire un peu diffremment. Personnellement, jene conseille pas de mlanger diffrentes techniques dans un mme projet, mais on va dire que cestlexercice 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 unnouvel article et pour la modification dun article. Vous avez raison, on peut le faire avec le fichierde configuration, mais cest un peu brouillon. Deuximement, je rcupre la liste des codes possiblespour le statut partir du modle Article_status .

    Si les donnes du formulaire sont valides, nous chargeons le modle Article , remplissons lesdonnes et le sauvegardons. Si cela a fonctionn, nous affichons la liste des articles.

    CHAPITRE 4. BLOG

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 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 nouveaublog. Votre formulaire devrait ressembler la figure 4.3 la page 56.

    4.5 Affichage dun articleMaintenant 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 quelquespetites choses expliquer. Alors, attendez bien davoir fini cette partie avant de vouloir affichervotre page, nous allons faire des trucs sympas.

    4.5.1 ModleNous 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 mthodearticle() prenant lidentifiant de larticle afficher :

    1

  • 58 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    4.5.3 RoutageNormalement, pour accder notre article, nous devons utiliser ladresse http://localhost/

    blog/article/. 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 trsparlante.

    Nous allons donc optimiser nos adresses pour que nos pages soient mieux rfrences dans lesmoteurs de recherche (en anglais on parle de SEO, Search Engine Optimization). Je vous avais parldu champ alias qui allait tre utilis pour gnrer nos URL. Voici le moment de le mettre enpratique.

    Donc, pour optimiser nos adresses, nous pourrions avoir une URL du style http://localhost/blog/article/. Mais voil, dans notre base de donnes, nous pourrions avoir deux articlesavec 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 enchoisir une : http://localhost/blog/_.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 fichierapplication/config/routes.php :

    1 7 8 9

    10 -11 12 13 -14 15 16 17

    CHAPITRE 4. BLOG

    http://localhost/blog/article/http://localhost/blog/article/https://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherchehttp://localhost/blog/article/http://localhost/blog/article/http://localhost/blog/_.htmlhttp://localhost/blog/_.htmlhttp://localhost/blog/article/http://localhost/blog/article/http://creativecommons.org/licenses/by-nc-sa/4.0/

  • RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3 59

    18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

    Notre vue aura deux parties : larticle en lui-mme et un menu. Pour larticle, nous allonsafficher peu prs les mmes informations que pour notre rsum, sauf quici, nous aurons larticleen entier. Pour le menu, nous aurons un lien vers la page daccueil de notre blog et, pour lespersonnes identifies, un lien pour la cration dun nouvel article.

    Nous allons galement modifier la vue application/views/blog/article_resume.php delarticle afin dajouter un lien pour accder la page de larticle :

    1 4 5 6 7 8 9 -

    10 11 12 -13 14 15 16 17 ... 18

    Nous avons ajout du code PHP pour affecter lURI de larticle dans une variable et utilis cettevariable pour gnrer un lien sur le titre et aprs le rsum de larticle. Maintenant, en affichant lapage daccueil du blog, vous pouvez cliquer sur le titre de larticle visualiser ou sur son lien Lirela suite (si, si, vous pouvez le faire maintenant, a doit marcher ).

    CHAPITRE 4. BLOG

    http://creativecommons.org/licenses/by-nc-sa/4.0/

  • 60 RALISEZ VOTRE BLOG AVEC LE FRAMEWORK CODEIGNITER 3

    4.6 Modification dun articleMaintenant 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 lacration et la modification.

    4.6.1 Contrleur

    Nous allons simplement modifier la mthode nouvel_article() du contrleurapplication/controllers/Blog.php comme suit :

    1

  • 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