<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://chierchia.fr/wp-content/plugins/pretty-rss-feeds/xslt/pretty-feed.xsl" type="text/xsl" media="screen" ?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>cms - Ange Chierchia</title>
	<atom:link href="https://chierchia.fr/tag/cms/feed/" rel="self" type="application/rss+xml" />
	<link>https://chierchia.fr/tag/cms/</link>
	<description>Développeur Web full-stack</description>
	<lastBuildDate>Sun, 13 Oct 2024 10:59:42 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://chierchia.fr/wp-content/uploads/cropped-16350293-SSDKVqo3-32x32.jpg</url>
	<title>cms - Ange Chierchia</title>
	<link>https://chierchia.fr/tag/cms/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
					<title>Développer un CMS avec CodeIgniter #3 : la gestion des pages</title>
					<link>https://chierchia.fr/2010/08/developper-cms-codeigniter-la-gestion-des-pages/</link>
					<comments>https://chierchia.fr/2010/08/developper-cms-codeigniter-la-gestion-des-pages/#respond</comments>
		
		<dc:creator><![CDATA[<span class='p-author h-card'>Ange Chierchia</span>]]></dc:creator>
		<pubDate>Sat, 07 Aug 2010 15:09:15 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[back-end]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://nighcrawl.com/blog/2010/08/developper-cms-codeigniter-la-gestion-des-pages</guid>

					<description><![CDATA[Dans ce nouvel article qui fait suite à « Développer un moteur de site Web avec CodeIgniter » et « Système de login sécurisé — CMS CodeIgniter, partie 2 » nous allons nous intéresser au module de gestion des pages de contenu, le coeur du moteur de site web en somme. Introduction La semaine le mois dernier (désolé) on [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class='e-content'>Dans ce nouvel article qui fait suite à « <a href="http://chierchia.fr/php-mysql/moteur-site-web-developper-cms-codeigniter/">Développer un moteur de site Web avec CodeIgniter</a> » et « <a href="http://chierchia.fr/php-mysql/login-securise-cms-codeigniter-partie-2/">Système de login sécurisé — CMS CodeIgniter, partie 2</a> » nous allons nous intéresser au module de gestion des pages de contenu, le coeur du moteur de site web en somme.<span id="more-1386"></span></p>
<h2 id="introduction">Introduction</h2>
<p>La semaine le mois dernier (désolé) on avait vu comment CodeIgniter construisait les pages de notre site en utilisant le modèle MVC, c’est à dire la séparation du code source en trois couches qui ont chacune une « mission » : accéder aux données stockées dans la base (couche Modèles) traiter les données (couche Contrôleurs), afficher les données (couche Vues).</p>
<p>Nous avions donc créé un contrôleur Admin qui se chargeait de traiter les données renvoyées par notre modèle User_model qui s’occupait de voir si pour les infos de connexion passées via notre vue loginform.php on avait un résultat dans la base, auquel cas, on donnait accès à l’administration du site. Et on s’était arrêté là. Aujourd’hui… la suite!</p>
<h2 id="laccès-aux-données-relatives-aux-pages-du-site">L’accès aux données relatives aux pages du site</h2>
<p>Ayant pris l’habitude de bien séparer les différentes parties des sites que je développe, et parce que c’est plus pratique pour s’y retrouver par la suite, je vous propose de créer un nouveau modèle qui ne s’intéressera qu’à nos données stockées dans notre table pages.</p>
<p>Dans le dossier <em>application/models</em>, créez un nouveau fichier que vous appellerez <em>page_model.php</em> contenant le code suivant:</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>class Page_model extends Model {
  function Page_model(){
    parent::Model();
  }
}
</code></pre>
</div>
</div>
<p>Qui nous permet de  définir notre classe Page_model comme étant un Model. Ensuite, nous allons ajouter différentes méthodes à l’intérieur de cette classe qui nous permettront de modifier les données présentent dans notre table pages. C’est ce qu’on appelle les fonctions CRUD (Create, Read, Update, Delete).</p>
<p>Okay, premièrement on va s’occuper de la fonction d’ajout dans la base.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>function add($data){
  return $this-&gt;db-&gt;insert('pages',$data);
}
</code></pre>
</div>
</div>
<p>Ici, c’est allé super vite n’est-ce pas? En effet dans notre modèle on ne s’occupe que de l’insertion des données dans la base, leur traitement pour savoir si oui ou non les données sont conformes se fera avant ça, dans notre contrôleur.</p>
<p>Pour ce qui est des fonctions de modification, et de suppression, c’est aussi rapide, donc les voici toutes les deux:</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>function update($id,$data){
  $this-&gt;db-&gt;where('id',$id);
  return $this-&gt;db-&gt;update('pages',$data);
}
function delete($id){
  return $this-&gt;db-&gt;delete('pages',array('id'=&gt;$id));
}
</code></pre>
</div>
</div>
<p>Passons maintenant à nos fonction de « lecture » ici, on a deux fonctions, la première servira pour retourner toutes les pages présentent dans la base, alors que la seconde ne retournera qu’une seule page.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>//retourne la liste des pages
function getListe(){
  //SELECT * FROM pages
  $query = $this-&gt;db-&gt;get('pages');

  if($query-&gt;num_rows() &gt; 0){
    $rows = $query-&gt;result();
    return $rows;
  }
}

//retourne l'enregistrement dans la
//base de données correspondant à l'id
//passée en paramètre
function get($id){
  //SELECT * FROM pages WHERE id = '$id'
  $query = $this-&gt;db-&gt;get_where('pages',array('id'=&gt;$id));

  if($query-&gt;num_rows()&gt;0){
    $rows = $query-&gt;result();
    return $rows[0];
  }
}
</code></pre>
</div>
</div>
<h2 id="le-traitement-des-données">Le traitement des données</h2>
<p>Nous en avons fini avec notre modèle, passons à notre contrôleur. Ici on va reprendre notre contrôleur Admin et y ajouter une méthode appelée page… Originale n’est-ce pas ^^.</p>
<p>C’est dans cette méthode que nous allons traiter les données passées à nos formulaires d’ajout/modification des pages, que nous renverrons au modèle rédigé juste avant.</p>
<p>Pour rappel, voilà notre contrôleur Admin là où on s’est arrêté le mois dernier:</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>class Admin extends Controller {

  //constructeur de la classe
  function Admin() {
    parent::Controller();
    $this-&gt;load-&gt;model('user_model');
    $this-&gt;load-&gt;library('form_validation');
  }

  //affiche l'admin si la session existe, sinon le formulaire de login
  function index(){
    if($this-&gt;user_model-&gt;isLoggedIn()){
      redirect('admin/dashboard','refresh');
    } else {
      redirect('admin/login','refresh');
    }
  }

  //traitement du formulaire de login
  function login(){
    if($this-&gt;user_model-&gt;isLoggedIn()){
      redirect('admin','refresh');
    } else {
      //on charge la validation de formulaires
      $this-&gt;load-&gt;library('form_validation');

      //on définit les règles de succès
      $this-&gt;form_validation-&gt;set_rules('username','Login','required');
      $this-&gt;form_validation-&gt;set_rules('password','Mot de passe','required');

      //si la validation a échouée on redirige vers le formulaire de login
      if(!$this-&gt;form_validation-&gt;run()){
        $this-&gt;load-&gt;view('loginform');
      } else {
        $username = $this-&gt;input-&gt;post('username');
        $password = $this-&gt;input-&gt;post('password');
        $validCredentials = $this-&gt;user_model-&gt;validCredentials($username,$password);

        if($validCredentials){
          redirect('admin/dashboard','refresh');
        } else {
          $data['error_credentials'] = 'Wrong Username/Password';
          $this-&gt;load-&gt;view('loginform',$data);
        }
      }
    }
  }

  //affichage de l'adminstration
  function dashboard(){
    if($this-&gt;user_model-&gt;isLoggedIn())
      $this-&gt;load-&gt;view('admin');
  }

  //deconnexion
  function logout(){
    $this-&gt;user_model-&gt;logout();
    redirect('admin','refresh');
  }
}
</code></pre>
</div>
</div>
<p>Ajoutons maintenant notre fonction page. Elle prendra en paramètres deux variables : $action qui nous permettra de savoir qu’est-ce que l’on doit faire lorsqu’on appelle cette fonction, et $id qui donnera l’identifiant de la page à modifier/supprimer dans la base. Voici la structure générale de notre méthode, je détaillerai les différentes étapes par la suite.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>function page($action = 'list', $id = null){
  if($this-&gt;user_model-&gt;isLoggedIn()):
    $this-&gt;load-&gt;model('page_model');

    switch($action){

      case 'list':
        //affichage de la liste des pages
      break;

      case 'edit':
        //affichage du formulaire de modification d'une page
      break;

      case 'update': //mise a jour de la page
        //modification d'une page
      break;

      case 'add': //ajout d'une page
        //création d'un page
      break;

      case 'delete':
        //suppression de la page
      break;
    }

  else:
    redirect('admin/login');
  endif;
}
</code></pre>
</div>
</div>
<p>Ici on attend donc les deux paramètres $action et $id qui ont par défaut les valeurs respectives ‘list’ et null, ainsi si la fonction est appelée sans aucun paramètre, on affichera l’action list, donc la liste des pages, tandis que l’identifiant de page sera nul. Aussi, avant de traiter les données, on s’assure que l’utilisateur est bien loggué en administrateur via la commande $this-&gt;user_model-&gt;isLoggedIn().</p>
<p>Passons à l’écriture des actions possible. Je vais faire les actions list, edit et delete en même temps car elle sont simple et ne nécessites pas vraiment qu’on s’y attarde.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>case 'list': //affichage de la liste des pages
  $data['liste'] = $this-&gt;page_model-&gt;getListe();
  $this-&gt;load-&gt;view('list_page',$data);
break;

case 'edit': //affichage du formulaire de modification d'une page
  if(isset($id) &amp;&amp; $id != 0){
    $data['page'] = $this-&gt;page_model-&gt;get($id);
    $this-&gt;load-&gt;view('edit_page',$data);
  }
break;
case 'delete':
  if(isset($id) &amp;&amp; $id != 0){
    if($this-&gt;page_model-&gt;delete($id)){
      echo "page supprimé";
    }
  }
break;
</code></pre>
</div>
</div>
<p>Ici rien de bien compliqué, si $action est égale à ‘list’, on appelle la méthode getListe() de notre modèle Page que l’on stocke dans la variable $data, de type array, et dont l’identifiant sera ‘liste’. Ensuite on charge la vue list_page en lui passant les données stockées dans la variable $data, ce qui nous permettra, lorsqu’on rédigera cette vue, de récupérer les données de la méthode getListe via la variable $liste. Vous suivez toujours?</p>
<p>Si l’on passe la valeur ‘edit’ à notre variable $action, on vérifie que notre variable $id ne soit pas nulle, et on envoi les données retournées par la méthode get() à notre vue edit_page.</p>
<p>Enfin, si $action vaut ‘delete’ et que $id n’est pas nulle, on appelle la méthode delete() de notre modèle Page.</p>
<p>Okay, maintenant on passe à la modification d’une page, via l’action update. Ici, le principe c’est que via l’action edit on a récupéré les données stockées dans la base et on a peuplé le formulaire de la vue edit_page. Ce formulaire renvoi les données à l’action update, via une URL du style /admin/page/update/$id. On doit donc vérifier si les données renvoyées sont bonne avant de modifier leur valeur dans la base.</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>case 'update': //mise a jour de la page
  if(isset($id) &amp;&amp; $id != 0){
    //définition des règles de validation
    //$this-&gt;load-&gt;helper('form_validation');

    $this-&gt;form_validation-&gt;set_rules('titre_page','Titre','required');
    $this-&gt;form_validation-&gt;set_rules('contenu_page','Contenu','required');

    if($this-&gt;form_validation-&gt;run()){

      //les champs obligatoires sont fournis

      //on créé un tableau dans lequel on passe les infos du formulaire
      $data = array(
        'title' =&gt; $this-&gt;input-&gt;post('titre_page'),
        'content' =&gt; $this-&gt;input-&gt;post('contenu_page'),
      );

      //on regarde si le champs keywords est renseigné
      if($this-&gt;input-&gt;post('keywords_page')){
        $data['keywords'] = $this-&gt;input-&gt;post('keywords_page');
      }

      //on fait la même chose pour le champs description
      if($this-&gt;input-&gt;post('description_page')){
        $data['description'] = $this-&gt;input-&gt;post('description_page');
      }

      //enregistrement dans la base de données
      if($this-&gt;page_model-&gt;update($id,$data)){
        echo "Page mis à jour";
      }

    } else {
      //certains champs obligatoires sont manquants
      redirect('admin/page/edit/'.$id);
    }
  }
break;
</code></pre>
</div>
</div>
<p>Pour l’insertion d’une nouvelle page dans la base de données le principe est le même, sauf que j’ai choisi de réunir les deux étapes de l’appel du formulaire et celle de la vérification des données. Voici ce que ça donne:</p>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>case 'add': //ajout d'une page
  $this-&gt;form_validation-&gt;set_rules('titre_page','Titre','required');
  $this-&gt;form_validation-&gt;set_rules('contenu_page','Contenu','required');

  if($this-&gt;form_validation-&gt;run()){

    //les champs obligatoires sont fournis

    //on créé un tableau dans lequel on passe les infos du formulaire
    $data = array(
      'title' =&gt; $this-&gt;input-&gt;post('titre_page'),
      'content' =&gt; $this-&gt;input-&gt;post('contenu_page'),
    );

    //on regarde si le champs keywords est renseigné
    if($this-&gt;input-&gt;post('keywords_page')){
      $data['keywords'] = $this-&gt;input-&gt;post('keywords_page');
    }

    //on fait la même chose pour le champs description
    if($this-&gt;input-&gt;post('description_page')){
      $data['description'] = $this-&gt;input-&gt;post('description_page');
    }

    //enregistrement dans la base de données
    if($this-&gt;page_model-&gt;add($data)){
      echo "page ajouté";
    }

  } else {
    //certains champs obligatoires sont manquants
    $this-&gt;load-&gt;view('add_page');
  }
break;
</code></pre>
</div>
</div>
<h2 id="le-troisième-tiers-de-notre-application-les-vues">Le troisième tiers de notre application: les vues</h2>
<p>On en a enfin fini avec notre contrôleur! On passe maintenant au troisième tiers de notre application, les vues. Ici je ne vais pas vous donner plus d’explications, les trois vues sont relativement simples a comprendre même en ne connaissant pas trop bien la syntaxe utilisée par CodeIgniter. Voici donc les trois vues list_page.php, add_page.php et edit_page.php.</p>
<h4 id="la-liste-des-pages-présentes-dans-la-base">La liste des pages présentes dans la base</h4>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>foreach($liste as $page):
  echo "&lt;h2&gt;".anchor('admin/page/edit/'.$page-&gt;id,$page-&gt;title)."&lt;/h2&gt;
  ".$page-&gt;content."&lt;div&gt;&lt;small&gt;&lt;strong&gt;Tags:&lt;/strong&gt; ".$page-&gt;keywords."&lt;/small&gt;&lt;/div&gt;
endforeach;
</code></pre>
</div>
</div>
<h4 id="le-formulaire-dajout-dune-page">Le formulaire d’ajout d’une page</h4>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>echo form_open('admin/page/add/');

echo validation_errors();

echo form_input('titre_page',set_value('titre_page'));
echo form_textarea('contenu_page',set_value('contenu_page'));

echo form_submit('','Ajouter');

echo form_close();
</code></pre>
</div>
</div>
<h4 id="le-formulaire-de-modification">Le formulaire de modification</h4>
<div class="language-plaintext highlighter-rouge">
<div class="highlight">
<pre class="highlight"><code>echo form_open('admin/page/update/'.$page-&gt;id);

echo form_input('titre_page',$page-&gt;title);
echo form_textarea('contenu_page',$page-&gt;content);

echo form_submit('','Modifier');

echo form_close();
</code></pre>
</div>
</div>
<h2 id="conclusion">Conclusion</h2>
<p>Après avoir développé notre système de login sécurisé, on a vu ici comment construire simplement et rapidement un module de gestion pour les pages que contiendra notre futur site Web.</p>
<p>Avec ce nouvel article, notre système pourrait très bien s’arrêter là, il est fonctionnel et relativement sécurisé tant au niveau de l’accès par login/mot de passe, qu’au niveau de la vérification des valeurs saisies dans les différents formulaires, du fait que c’est le framework lui-même qui s’occupe de vérifier les données et d’échapper les données avant de les enregistrer dans la base.</p>
<p>La prochaine fois, on vera comment intégrer un éditeur de texte comme TinyMCE à notre CMS afin de pouvoir mettre en forme notre texte facilement, et puis surement d’autre petites choses. Par contre, je ne sais pas encore quand est-ce que je vous pondrait çà </p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chierchia.fr/2010/08/developper-cms-codeigniter-la-gestion-des-pages/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
					<title>Système de login sécurisé – CMS CodeIgniter, partie 2</title>
					<link>https://chierchia.fr/2010/06/login-securise-cms-codeigniter-partie-2/</link>
					<comments>https://chierchia.fr/2010/06/login-securise-cms-codeigniter-partie-2/#respond</comments>
		
		<dc:creator><![CDATA[<span class='p-author h-card'>Ange Chierchia</span>]]></dc:creator>
		<pubDate>Sat, 19 Jun 2010 11:58:15 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[back-end]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://nighcrawl.com/blog/2010/06/login-securise-cms-codeigniter-partie-2</guid>

					<description><![CDATA[Dans mon article précédent, on a vu comment installer et configurer le framework PHP CodeIgniter. Aujourd’hui, on commence le développement de notre moteur de site Web. Au programme, la base de données et le système de login sécurisé. Avant de commencer Cet article est le second d’un ensemble d’article sur la création d’un système de [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class='e-content'><a title="Développer un moteur de site Web avec CodeIgniter" href="http://chierchia.fr/php-mysql/moteur-site-web-developper-cms-codeigniter/">Dans mon article précédent</a>, on a vu comment installer et configurer le framework PHP CodeIgniter. Aujourd’hui, on commence le développement de notre moteur de site Web. Au programme, la base de données et le système de login sécurisé.<span id="more-1388"></span></p>
<h2 id="avant-de-commencer">Avant de commencer</h2>
<p>Cet article est le second d’un ensemble d’article sur la création d’un système de gestion de contenu en utilisant le framework PHP CodeIgniter. Je vous invite donc à <a title="Développer un système de gestion de contenu avec CodeIgniter" href="http://chierchia.fr/php-mysql/moteur-site-web-developper-cms-codeigniter/">lire le précédent article</a> pour partir sur de bonnes bases et avoir une installation saine de CodeIgniter pour l’article actuel.</p>
<p>Okay, on a donc convenu mercredi que l’on partira sur un simple CMS pour l’instant, donc ici pas de gestion de catalogue produit, pas de blog, juste un gestionnaire de pages (bien qu’intégrer un blog ne soit pas franchement différent de ce dernier). Allez, on se lance!</p>
<h2 id="création-de-la-base-de-données">Création de la base de données</h2>
<p>Comme notre CMS sera très simple, on aura pas beaucoup de tables dans notre base de données, et quand je dis pas beaucoup, c’est déjà trop. On aura donc une table users qui nous permettra d’enregistrer les infos de connexion des différents utilisateurs de notre CMS. Ici rien de très compliqué:</p>
<pre class="brush:sql">CREATE TABLE users (
  id int NOT NULL AUTO_INCREMENT,
  username varchar(50) UNIQUE NOT NULL,
  password varchar(255) NOT NULL,
  PRIMARY KEY (id)
);</pre>
<p>On a donc ici un champ <code class="language-plaintext highlighter-rouge">username</code> qui devra être unique, un champ <code class="language-plaintext highlighter-rouge">password</code> pour le mot de passe que l’on cryptera en <code class="language-plaintext highlighter-rouge">SHA1</code>, je n’aime pas trop <code class="language-plaintext highlighter-rouge">MD5</code> même si ça peut faire l’affaire ici.</p>
<p>Ensuite, la dernière table de notre base sera une table dans laquelle on enregistrera le contenu des pages présentent sur le site. La encore rien de compliqué, j’ai même choisi de disposé de champs afin de renseigner les balises meta pour l’indexation des pages dans Google (un peu de SEO ne fait pas de mal).</p>
<pre class="brush:sql">CREATE TABLE pages (
  id int NOT NULL AUTO_INCREMENT,
  title varchar(100) NOT NULL,
  content longtext NOT NULL,
  keywords text NOT NULL,
  description text NOT NULL,
  PRIMARY KEY (id)
);</pre>
<p>J’ai vraiment besoin d’expliquer?</p>
<p>Okay, on va maintenant créer le fichier qui permettra de récupérer les données présentes dans la base de données.</p>
<h2 id="création-du-modèle-users_modelphp">Création du Modèle Users_model.php</h2>
<p>Qu’est-ce que ça veut bien dire? Vous vous rappelez dans le précédent article on a parlé de Modèle MVC, et bien Users_model.php c’est le ‘M’ de ‘MVC’. C’est ici qu’on va écrire nos fonctions « CRUD » (Create, Read, Update, Delete), on utilisera ensuite ces fonction dans notre <strong>C</strong>ontrôleur, qui traitera les données retournées par notre <strong>M</strong>odèle, et les affichera dans la <strong>V</strong>ue.</p>
<p>Allez on se lance, ce sera plus clair quand on aura mit les pieds dans le code. Donc, dans le dossier <em>application/models</em> on créé le fichier u_sers_model.php_ qui contiendra ceci :</p>
<pre class="brush:php">&lt;?php
class User_model extends Model {
     function User_model(){
          parent::Model();
     }
}
?&gt;</pre>
<p>Ici on créé la classe <code class="language-plaintext highlighter-rouge">User_model</code> qui hérite de la classe <code class="language-plaintext highlighter-rouge">Model</code>, puis on instancie la classe avec le constructeur <code class="language-plaintext highlighter-rouge">User_model</code> (on aurai pu aussi utiliser <code class="language-plaintext highlighter-rouge">__constructor</code> pour l’instancier).</p>
<p>On va maintenant créer notre fonction qui vérifiera les infos de login passées au formulaire qu’on verra plus tard. Dans la classe User_model, sous notre constructeur du même nom, ajoutez la fonction suivante :</p>
<pre class="brush:php">function validCredentials($username,$password){
     $this-&gt;load-&gt;library('encrypt');

     $password = $this-&gt;encrypt-&gt;sha1($password);

     //requête préparée, beaucoup plus sécurisé
     $q = "SELECT * FROM users WHERE username = ? AND password = ?";

     $data = array($username,$password);
     $q = $this-&gt;db-&gt;query($q,$data);

     if($q-&gt;num_rows() &gt; 0){
          $r = $q-&gt;result();
          $session_data = array('username' =&gt; $r[0]-&gt;username,'logged_in' =&gt; true);
          $this-&gt;session-&gt;set_userdata($session_data);
          return true;
     } else { return false; }
}</pre>
<h4 id="que-ce-passe-t-il-ici">Que ce passe-t-il ici?</h4>
<p>D’abord on charge la librairie encrypt avec la commande <code class="language-plaintext highlighter-rouge">$this-&gt;load-&gt;library('encrypt')</code> ce qui nous permet d’utiliser les fonctions de cette librairie dans notre modèle. Ensuite on crypte en SHA1 le mot de passe passé en paramètre à la fonction. Enfin, on exécute la requête stockée dans la variable $q avec <code class="language-plaintext highlighter-rouge">$this-&gt;db-&gt;query()</code> en lui passant le tableau $data pour remplacer les points d’interrogation dans notre requête ; c’est une requête préparée, <a title="Connexion à une base de données avec PDO" href="http://chierchia.fr/php-mysql/utiliser-pdo-pour-les-connexion-a-une-bdd/">j’en avais parlé l’an dernier dans un article sur l’Objet PDO</a>.</p>
<p>Si la requête nous renvoi un résultat, on créé deux variable de sessions username et logged_in qui permettra de savoir si on a accès ou non à notre admin. Sinon validCredentials nous retourne false.</p>
<p>On va ajouter aussi une autre fonction pour savoir si on est bien loggué. On pourrait s’en passer mais ça nous évitera quelques lignes de code dans notre contrôleur. Celle ci est simple, ajoutez la fonction suivante à l’intérieur de votre Modèle:</p>
<pre class="brush:php">function isLoggedIn(){
     if($this-&gt;session-&gt;userdata('logged_in'))
     { return true; } else { return false; }
}</pre>
<h2 id="il-reste-encore-du-monde-on-passe-au-contrôleur">Il reste encore du monde? On passe au Contrôleur</h2>
<p>Maintenant qu’on a notre Modèle pour l’accès à la base de données, il est temps de les manipuler ces petites données! Créez un fichier  <em>admin.php</em> dans le dossier a_pplication/controllers_ et mettez y le code suivant:</p>
<pre class="brush:php">class Admin extends Controller {

     //constructeur de la classe
     function Admin() {
          parent::Controller();
          $this-&gt;load-&gt;model('user_model');
     }
}</pre>
<p>Ici comme notre avec notre User_model, on crée une classe Admin qui hérite de la classe Controller, et on l’initialise grace à son constructeur, dans lequel on charger notre modèle User_model, ce qui nous permettra d’utiliser ses fonctions dans notre contrôleur Admin.</p>
<p>Maintenant que notre contrôleur est instancié, on va ajouter les fonctions (ou méthodes) qui nous permettrons d’envoyer les données du formulaire de login à notre Modèle et ainsi définir si on a accès ou non à notre backoffice.</p>
<p>La première fonction qu’on va inclure dans notre classe Admin, et la fonction index() qui nous servira de page d’accueil. En gros lorsqu’on accédera à l’adresse http://localhost:8888/cms/index.php/admin, c’est notre fonction iindex() qui sera appelée.</p>
<pre class="brush:php">function index(){
     if($this-&gt;user_model-&gt;isLoggedIn()){
          redirect('admin/dashboard','refresh');
     } else {
          redirect('admin/login','refresh');
     }
}</pre>
<p>Ici on vérifie si on est bien loggué, dans ce cas on redirige à l’adresse http://localhost:8888/index.php/admin/dashboard qui est le tableau de bord de notre CMS, sinon on redirige au formulaire de login.</p>
<p>Parlons du formulaire de login. Pour traiter les données soumises au formulaire, on va créer une méthode login() dans notre contrôleur.</p>
<pre class="brush:php">function login(){
     if($this-&gt;user_model-&gt;isLoggedIn()){
          redirect('admin','refresh');
     } else {
          //on charge la validation de formulaires
          $this-&gt;load-&gt;library('form_validation');

          //on définit les règles de succès
          $this-&gt;form_validation-&gt;set_rules('username','Login','required');
          $this-&gt;form_validation-&gt;set_rules('password','Mot de passe','required');

          //si la validation a échouée on redirige vers le formulaire de login
          if(!$this-&gt;form_validation-&gt;run()){
               $this-&gt;load-&gt;view('loginform');
          } else {
               $username = $this-&gt;input-&gt;post('username');
               $password = $this-&gt;input-&gt;post('password');
               $validCredentials = $this-&gt;user_model-&gt;validCredentials($username,$password);

               if($validCredentials){
                    redirect('admin/dashboard','refresh');
               } else {
                    $data['error_credentials'] = 'Wrong Username/Password';
                    $this-&gt;load-&gt;view('loginform',$data);
               }
          }
     }
}</pre>
<p>Ici on vérifie d’abord si on est loggué, dans ce cas on redirige vers l’admin, sinon on traite le formulaire. On charge la librairie <code class="language-plaintext highlighter-rouge">form_validation</code>, qui va nous permettre d’accéder à des fonctions de validation de champs déjà toute prête, notamment la fonction <code class="language-plaintext highlighter-rouge">set_rules</code> qui nous permettra de définir quels champs sont obligatoire, quel type de données accepter, etc. Lorsque nos règles d’acceptation sont validées, on vérifie que les login/mot de passe passés en paramètres retournent un résultant dans la base de données, via notre fonction <code class="language-plaintext highlighter-rouge">validCredentials()</code> qu’on a définit dans notre modèle <em>User_model</em>. Si un résultat est retourné, la fonction <code class="language-plaintext highlighter-rouge">validCredentials</code> créée la variable de session <code class="language-plaintext highlighter-rouge">logged_in</code> et nous redirige vers le dashboard.</p>
<p>Dernière méthode de notre contrôleur, la fonction dashboard() qui se chargera d’afficher notre tableau de bord.</p>
<pre class="brush:php">function dashboard(){
     if($this-&gt;user_model-&gt;isLoggedIn())
          $this-&gt;load-&gt;view('admin');
}</pre>
<p>Passons maintenant à nos deux « vues », loginform et admin. Ce sont les deux fichiers que l’on appelle avec la fonction $this-&gt;load-&gt;view() dans notre contrôleur. Dans le dossier <em>application/views</em> créez les fichier <em>loginform.php</em> et <em>admin.php</em>. La vue admin n’ayant pas trop d’intérêt pour l’instant, on va juste voir la vue loginform, qui nous permettra de voir comment créer facilement un formulaire avec CodeIgniter.</p>
<pre class="brush:php">&lt;?php
echo form_open('admin/login');
     echo form_label('Login','username');
     echo form_input('username',set_value('username'));

     echo form_label('Mot de passe','password');
     echo form_password('password');

     echo form_submit('submit','Connexion');
echo form_close();
echo validation_errors();
echo @$error_credentials;
?&gt;</pre>
<p>Ici on ouvre un tag <code class="language-plaintext highlighter-rouge">&lt;form&gt;</code> qui enverra le formulaire à la méthode <code class="language-plaintext highlighter-rouge">login()</code> du contrôleur <code class="language-plaintext highlighter-rouge">Admin</code>. Puis on affiche les erreurs de validation si il y a lieu avec la fonction <code class="language-plaintext highlighter-rouge">validation_errors()</code> et les erreurs de login/mot de passe avec notre variable <code class="language-plaintext highlighter-rouge">$error_credentials</code>.</p>
<p>Eh voilà, votre formulaire de login sécurisé est terminé!</p>
<h2 id="conclusion">Conclusion</h2>
<p>Ici on a vue comment bien utiliser l’architecture trois tiers qui permet de séparer la couche présentation (nos Views), de la couche métier (notre Controller) et de la couche réseau (notre Model). Ainsi, si l’on veut changer de système de gestion de base de données et passer sur une base Oracle plutôt que MySQL, nous n’aurons qu’a changer les méthodes écrient dans notre modèle User_model.</p>
<p>Dans le prochain article, on s’attardera sur LE coeur de notre système, à savoir la gestion des pages. Allez, bon week-end!</p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chierchia.fr/2010/06/login-securise-cms-codeigniter-partie-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
					<title>Développer un moteur de site Web avec CodeIgniter</title>
					<link>https://chierchia.fr/2010/06/moteur-site-web-developper-cms-codeigniter/</link>
					<comments>https://chierchia.fr/2010/06/moteur-site-web-developper-cms-codeigniter/#respond</comments>
		
		<dc:creator><![CDATA[<span class='p-author h-card'>Ange Chierchia</span>]]></dc:creator>
		<pubDate>Wed, 16 Jun 2010 19:09:06 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[back-end]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[codeigniter]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://nighcrawl.com/blog/2010/06/moteur-site-web-developper-cms-codeigniter</guid>

					<description><![CDATA[Aujourd’hui, on va voir comment créer un moteur de site Web, aussi appelé système de gestion de contenu, en utilisant le très bon (est facile à utiliser) Framework CodeIgniter. Comme la tâche va être longue, j’ai prévu d’étaler cet article en plusieurs parties. On commence donc aujourd’hui avec la première partie du développement de notre [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class='e-content'>Aujourd’hui, on va voir comment créer un moteur de site Web, aussi appelé système de gestion de contenu, en utilisant le très bon (est facile à utiliser) Framework CodeIgniter. Comme la tâche va être longue, j’ai prévu d’étaler cet article en plusieurs parties. On commence donc aujourd’hui avec la première partie du développement de notre CMS utilisant CodeIgniter.<span id="more-1389"></span></p>
<h2 id="introduction">Introduction</h2>
<p>Pourquoi choisir d’utiliser un framework PHP pour développer un tel projet? La raison est simple : pourquoi perdre son temps à réinventer la roue quand on a la possibilité d’utiliser des fonctions déjà toutes prêtes? Un framework est donc fort utile dans ce type de projet, surtout pour tout le back-end du site, ce que l’utilisateur ne voit pas, et sur lequel nous les développeurs, passons pas mal de temps à développer pour rendre la vie facile à l’utilisateur du site.</p>
<p>Pourquoi CodeIgniter comme base de travail? Pour moi qui n’avais pas l’habitude d’utiliser des frameworks PHP (j’aime bien me compliquer la vie), j’ai trouvé que CodeIgniter était le plus simple à prendre en main pour moi qui n’avais pour dire jamais fais de PHP Objet (ouh! le nul!).</p>
<p>Aussi, un framework permet de passer plus de temps sur le développement pur plutôt que de perdre son temps sur des petites choses bien chiantes comme il faut (la validation de formulaire me sort par les trous de nez!).</p>
<h2 id="quelles-fonctionnalités-pour-notre-cms">Quelles fonctionnalités pour notre CMS?</h2>
<p>Avant de se lancer à la va vite dans le développement, il faut se demander à quoi servira notre moteur de site, est-ce qu’on gère un blog, un catalogue de produit, ou bien un simple site vitrine? Étant actuellement entrain de développer un site permettant d’afficher un catalogue de produits, j’aurai tendance à vouloir vous proposer de partir sur cette idée. Pour commencer je vous propose de nous concentrer sur une simple vitrine (ce qu’il y a de plus simple), et on verra ensuite pour le catalogue de produit.</p>
<p>Notre système devra donc comprendre:</p>
<ul>
<li>un accès sécurisé au back-end.</li>
<li>un gestionnaire de page</li>
<li>on devra pouvoir uploader des images</li>
<li>pourquoi pas pouvoir modifier le design du site?</li>
</ul>
<h2 id="installer-et-configurer-codeigniter">Installer et configurer CodeIgniter</h2>
<p><img decoding="async" class="aligncenter size-full wp-image-881" title="download_ci" src="https://chierchia.fr/contents/uploads/2010/06/download_ci.jpg?fit=603%2C143" alt="" data-recalc-dims="1" /></p>
<p>Aujourd’hui on va simplement préparer le terrain en téléchargeant et en installant le framework sur notre serveur Web. Rendez-vous sur le site du framework et <a title="Télécharger CodeIgniter" href="http://codeigniter.com/downloads/" target="_blank" rel="noopener">télécharger la version actuelle de CodeIgniter</a>, au moment ou j’écris c’est la version 1.7.2.</p>
<p><img decoding="async" class="size-full wp-image-885 alignright" title="screenshot 2010-06-1620.33.20" src="https://chierchia.fr/contents/uploads/2010/06/screenshot-2010-06-1620.33.20.jpg?fit=210%2C509" alt="" data-recalc-dims="1" /></p>
<p>Dézipper le contenu de l’archive et transférez les dossiers de CodeIgniter à la racine de votre serveur. Vous devriez avoir une arborescence comme présenté à droite:</p>
<p>Les dossiers important ici sont le dossier <em>system</em>, qui renferme tout les fichiers nécessaires au fonctionnement de CodeIgniter, et le dossier <em>application</em>, qu’il est possible de sortir du dossier <em>system</em> pour une meilleure organisation. Aussi on pourra se passer du dossier <em>user_guide</em> qui n’est qu’une version local du guide utilisateur disponible sur le site de CodeIgniter.</p>
<p>Vous remarquerez aussi les dossiers <em>controllers</em>, <em>models</em> et <em>views</em>, ce sont nos trois dossiers de travail. Eh oui, CodeIgniter utilise le Modèle MVC (Modèle-Vue-Controleur) aussi appeler application trois tiers, ce qui permet de séparer les opérations d’accès à notre base de données des opérations de traitement de ces données, ainsi que l’affichage de ces même données.</p>
<p>Passons maintenant à la configuration de CodeIgniter.</p>
<p>Ici c’est très simple, il suffit de modifier la variable <code class="language-plaintext highlighter-rouge">$config['base_url']</code> du fichier <em>application/config/config.php</em> en renseigner l’adresse de notre serveur.</p>
<pre class="brush:php">$config['base_url'] = "http://localhost:8888/codeigniter/";</pre>
<p>On va ensuite configurer l’accès à la base de données. Pour cela, direction <em>application/config/database.php</em> et renseigner les lignes suivantes avec vos informations de connexion.</p>
<pre class="brush:php">$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "root";
$db['default']['database'] = "database_ci";
$db['default']['dbdriver'] = "mysql";</pre>
<p>Et voilà! Si vous vous rendez à l’adresse où vous avez installer CodeIgniter vous devriez avoir une joli page « Hello World » si vous avez bien suivi les étapes ci dessus.</p>
<p>Allez, je vous laisse ici pour aujourd’hui, la prochaine fois on s’intéressera à la création de la base de données et au système de login sécurisé.</p></div>
]]></content:encoded>
					
					<wfw:commentRss>https://chierchia.fr/2010/06/moteur-site-web-developper-cms-codeigniter/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
