Citation

J’ai toujours rêvé d'un ordinateur qui soit aussi facile à utiliser qu'un téléphone. Mon rêve s'est réalisé : je ne sais plus comment utiliser mon téléphone.

Bjarne Stroustrup

jeudi 17 janvier 2013

FuelPHP Pas à pas #6 - 1er model

Afficher des pages, c'est bien mais il faut y mettre du contenu. Dans le modèle MVC, le contenu est géré par le "model", le M de MVC.
On va créer un contrôleur qui affiche une liste de fruits et leur description.

Création du modèle

Le modèle permet de gérer les données. La logique est en général mise dans les modèles. Ce sont eux qui accèdent aux données (base de données via ou non un ORM, fichier....)
Le code de la classe Model_Fruits (APPPATH/classes/model/fruits.php) est :

<?php
class Model_Fruits extends Model{

   private static $datas = array('pomme' => 'rond, jaune ou vert, ou rouge',
                          'banane' => 'long et jaune',
                          'orange' => 'rond et orange',
                          'mandarine' => 'comme une petite orange');

   public static function get_list(){
      return array_keys(static::$datas);
   }

   public static function get_fruit($name){
      if(array_key_exists($name, static::$datas)){
         return array('name' => $name, 'descr' => static::$datas[$name]);
      }
      return '';
   }
}


Elle étend la classe Model, qui ne fait strictement rien (regardez les sources), ce qui nous laisse tout le loisir de choisir quoi faire et comment faire. Comme c'est un tout premier exemple, les données sont stockée dans un tableau static.
La classe possède 2 méthodes, une pour récupérer la liste des fruits et l'autre pour avoir les informations sur un fruit en particulier.

Création du contrôleur

Le contrôleur APPPATH/classes/controller/fruits.php aura 2 actions, index et view :

<?php
class Controller_Fruits extends Controller_Template {
   /**
   * Action par defaut. Affiche la liste des fruits
   *
   */
   public function action_index(){
      $this->template->title = 'Fruits';
      $v = View::forge();
      $v->fruits = \Model_Fruits::get_list();
      $this->template->set_safe('content',$v->render('fruits/list'));
   }
   public function action_view(){
      $v = View::forge();
      $data = \Model_Fruits::get_fruit($this->param('fruit'));
      if ($data==''){
         Session::set_flash('error','fruit introuvable: '.$this->param('fruit'));
         Response::redirect('fruits');
         return;
      }
      $v->set($data);
      $this->template->title = 'Fruit : '.$data['name'];  
      $this->template->set_safe('content',$v->render('fruits/descr'));
   }
}


L'action index se contente d'envoyer la liste des fruits à la vue "fruits/list".
L'action view récupère les informations du fruit sélectionné et les transmet à la vue "fruits/descr". Si le fruit n'existe pas, un message d'erreur est construit et stocké dans l'objet Session via une variable "flash" et une redirection vers /fruits est faite. Une variable "flash" est une variable dont la durée de vie est très brève, elle est effacé après la prochaine requête.
On pouvait aussi lancer l'exception  HttpNotFoundException qui aurait alors provoqué l'affichage de la page d'erreur 404
Il reste à écrire les différentes vues utilisées.

Création des vues

Comme le contrôleur hérite de Controller_Template, il utilisera le template déjà écrit dans le chapitre 5. Mais on va apporter une petite modification à ce template:

<?php echo Html::doctype('xhtml1-strict');?>
<html>
<head>
   <meta charset="utf-8">
   <title><?php echo $title; ?></title>
</head>
<body>
   <h1 style="background-color: red"><?php echo $title; ?></h1>
<?php if (Session::get_flash('error')): ?>
            <div class="alert-message error">
               <p>
               <?php echo implode('</p><p>', e((array) Session::get_flash('error'))); ?>
               </p>
            </div>
<?php endif; ?>
   <?php echo $content; ?>
</body>
</html>


Notez la partie faisant appel à Session::get_flash, cette méthode permet d'afficher un message, ici un ou plusieurs messages d'erreurs.
Il reste à gérer l'affichage des informations sur les fruits:

APPPATH/views/fruits/list.php:

<?php foreach($fruits as $fruit): ?>
<?php echo Html::anchor('fruits/view/'.$fruit,$fruit)."</br>"; ?>
<?php endforeach;?>


APPPATH/views/fruits/descr.php:

<?php echo $name. ' : ' . $descr; ?></br>
<?php echo Html::anchor('fruits','Liste des fruits')?>


On peut tester le résultat à l'adresse : http://localhost/fuelphp/public/fruits et ca ne marche pas... car lorsque on clique sur un fruit on obtient un message d'erreur.
Il reste en effet à modifier le fichier APPPATH/config/routes.php pour que la requête prenne le nom du fruit en paramètre. Dans le fichier APPPATH/config/routes.php il faut ajouter:

 'fruits/view/:fruit' => array('fruits/view', 'name'=>'pomme'),

qui définie la pomme comme fruit par défaut.

Aucun commentaire:

Enregistrer un commentaire