Affichage des articles dont le libellé est ExtJS. Afficher tous les articles
Affichage des articles dont le libellé est ExtJS. Afficher tous les articles

mercredi 18 mars 2009

IDE pour ExtJS

ExtJS est sans doute l’un des meilleurs Framework AJAX du moments mais développer avec n’est pas partie de plaisir pour les novices et même pour les plus expérimenté vue les nombreuses propriétés, méthodes et événement dont il faut se souvenir et le pire est que la casse et respecté. 

Mais soyez sans crainte ce n’est pas ce qui va vous empêcher de vous y mettre, les IDE ou EDI sont la pour nous décharger de cette tâche, après mes recherche j’ai repéré deux IDE intéressant dont Aptana et Spket

Aptana

logo aptana

Aptana est un IDE complet pour le développement web basé sur eclipse il  offre des support et plugins  pour plusieurs langages et des plugins plusieurs bibliothèques AJAX dont ExtJS,l’installation du plugins est d’une simplicité inouïe, vous n’avez qu’a cocher l’option ExtJS dans le Help Install Aptana Features... .

   aptana log

l’inconvénient avec le plugins d’Aptana est qu’il ne s’install pas sur d’autres plateformes eclipse tel que PDT ou Zend Studio.

Spket.

ide_m

Spket est un puissant EDI JavaScript gratuit pour un usage non commercial ,il peut être installé tout seul (standalone) ou comme plugins pour tous EDI basé sur eclipse d’ou son avantage, il nous offre l’achèvement de code et la coloration syntaxique.

un tutoriel est disponible sur le site officiel nous montrons comment installé l’extension ExtJS,je vais publier prochainement un tutoriel complet sur l’installation du plugins sur PDT eclipse ou Zend Studio.  

lundi 9 mars 2009

Grille ExtJS et Zend Framework (3eme partie)

Dans cette partie nous allons en premier lieux ajouter la fonctionnalité d’édition directement sur notre grille pour ce faite ne devons revenir sur notre ColumnModel pour redéfinir les colonnes en leur rajoutant les éditeurs (editor) adéquat pour chacune d’elle, mais avant tous nous allons déclarer un deuxièmes DataStore pour récupérer la listes des familles.
notre ColumnModel deviendra comme suit:
public/js/grille.js
famillesDataStore = new Ext.data.Store({
    id : 'famillesDataStore',
    proxy : new Ext.data.HttpProxy({
       url : 'index/grille',
       method : 'POST'

      }),
    baseParams : {
     gAction : "gListeFamille"
    },
    reader : new Ext.data.JsonReader({
       root : 'results',
       id : 'id'
      }, [{
         name : 'id',
         type : 'int',
         mapping : 'id'
        }, {
         name : 'Libelle',
         type : 'string',
         mapping : 'Libelle'
        }

      ]),

    sortInfo : {
     field : 'Libelle',
     direction : "ASC"
    }

   });


articlesCols = new Ext.grid.ColumnModel([{
    header : 'Ref.',
    allowBlank : false,
    readOnly : true,
    dataIndex : 'ref',
    width : 60,
    hidden : false,
    editor : new Ext.form.TextField({ // rules about editing
     allowBlank : false,
     maxLength : 9,
     maskRe : /([a-zA-Z0-9\s-]+)$/
    })
   }, {
    header : 'Désignation',

    dataIndex : 'designation',
    width : 200,
    hidden : false,
    editor : new Ext.form.TextField({ // rules about editing
     allowBlank : false,
     maxLength : 20,
     maskRe : /([a-zA-Z0-9\s]+)$/
    })
    // alphanumeric + spaces allowed

  } , {
    header : 'Qte',
    readOnly : true,
    dataIndex : 'Qte',
    width : 50,
    align : 'right',
    hidden : false,
    editor : new Ext.form.NumberField({
       allowBlank : false,
       decimalSeparator : ',',
       allowDecimals : true,
       allowNegative : false,
       blankText : '0',
       maxLength : 4
      })

   }, {
    header : 'Prix',
    readOnly : true,
    dataIndex : 'Prix',
    width : 80,
    hidden : false,
    renderer : Ext.util.Format.formatNumber
      .createDelegate(Ext.util.Format),
    align : 'right',
    editor : new Ext.form.NumberField({
       allowBlank : false,
       decimalSeparator : ',',
       allowDecimals : true,
       allowNegative : false,
       blankText : '0',
       maxLength : 11
      })

   }, {
    header : 'Id Famille',
    readOnly : true,
    dataIndex : 'famille',
    width : 50,
    align : 'right',
    hidden : true,
    editor : new Ext.form.NumberField({
       allowBlank : false,
       allowDecimals : false,
       blankText : '0',
       maxLength : 4
      })

   }, {
    header : 'Familles',
    dataIndex : 'LibFamille',
    width : 150,
    editor : new Ext.form.ComboBox({
       store : famillesDataStore,
       typeAhead : true,
       triggerAction : 'all',
       mode : 'remote',
       displayField : 'Libelle',
       listeners : {
        select : {
         fn : function(e, rec) {
          var sm = articlesListGrid
            .getSelectionModel()
            .getSelected();
          sm.set('famille', rec.id);
         }
        }
       },

       listClass : 'x-combo-list-small'// ,

      })
   }, {
    header : 'Date d\'entrée',
    readOnly : true,
    dataIndex : 'date_ent',
    width : 80,
    hidden : false,
    renderer : Ext.util.Format.dateRenderer('d/m/Y'),
    editor : new Ext.form.DateField({
       format : 'd/m/Y'

      })

   }]);

 articlesListGrid = new Ext.grid.EditorGridPanel({
  id : 'articlesListGrid',
  title : 'liste des employe',
  store : articlesDataStore,
  width : 700,
  height : 350,
  cm : articlesCols,
  frame : true,
  clicksToEdit : 1,

  enableColLock : false,

  selModel : new Ext.grid.RowSelectionModel({
     singleSelect : true
    }),
  tbar : [{
     text : 'Ajouter',
     handler : function() {
      articleAction = 'gAjouter';
      var p = new article({
         ref : '',
         designation : '',
         Qte : '0',
         Prix : '0',
         date_ent : (new Date()).clearTime(),
         famille : '0'

        });

      articlesListGrid.stopEditing();
      articlesCols.setEditable(0, true);
      articlesDataStore.insert(0, p);
      articlesListGrid.startEditing(0, 0);
     }
    }]

   
  });
Nous allons définir ici la modification et l'ajout dans une même fonction, ce qui va compliquer un peut les choses mais va nous économisé énormément de code.
Pour pouvoir modifier, c’est simple, un double ou un simple click  (tous dépendra de la propriété clicksToEdit) sur la ligne souhaité et elle passe en mode édition mais pour l’ajout nous aurons besoin d’ajouter un bouton ajouter à notre grille.
Les grille ExtJS nous offre la possibilité de lui ajouter une barre d’outil qui va accueillir tous les boutons dont nous aurons besoin, vous allez voir c’est très simple, mais avant tous nous aurons besoin de déclarer une variable articleAction et une class record qui aurons pour rôle : .
articleAction permet à notre fonction d’enregistrement de déterminer si il s'agit d’un ajout ou d’une modification par défaut la variable et initialisé à “Modifier” et lorsque nous cliquons sur le bouton ajout nous la mettons a jours à “Ajout”.
le record article nous permet d’initialiser le nouvel enregistrement à insérer.
public/js/grille.js
// déclaration et initialisation articleAction.
 var articleAction = 'Modifier';
// déclaration de la classs record.
var article = Ext.data.Record.create([
   // the "name" below matches the tag name to read, except "availDate"
   // which is mapped to the tag "availability"
   {
  name : 'ref',
  type : 'string'
 }, {
  name : 'designation',
  type : 'string'
 }, {
  name : 'Qte',
  type : 'int'
 }, {
  name : 'Prix',
  type : 'float'
 }, {
  name : 'LibFamille',
  type : 'date',
  dateFormat : 'd/m/Y'
 }, {
  name : 'date_ent',
  type : 'date'
 }]);

 ....
 ....

selModel : new Ext.grid.RowSelectionModel({
     singleSelect : false
    }),
  tbar : [{
     text : 'Ajouter',
     iconCls:'ajout'
     handler : function() {
      articleAction = 'gAjouter';
      var p = new article({
         ref : '',
         designation : '',
         Qte : '0',
         Prix : '0',
         date_ent : (new Date()).clearTime(),
         famille : '0'

        });

      articlesListGrid.stopEditing();
      articlesCols.setEditable(0, true);
      articlesDataStore.insert(0, p);
      articlesListGrid.startEditing(0, 0);
     }
    }]

   
  });
Dans l’événement click du bouton (handler ) nous avons initialisé la variable articleAction et le record article.
Nous allons maintenant écrire notre fonction EnregistrerArticle qui va se charger de transmettre au serveur les données et l’action a entreprendre (ajout ou modification).
public/js/grille.js
function EnregistrerArticle(e) {

  Ext.Ajax.request({
   waitMsg : 'Enregistrement en cours...',
   url : 'index/grille',
   params : {
    gAction : articleAction,
    ref : e.record.data.ref,
    designation : e.record.data.designation,
    Qte : e.record.data.Qte,
    Prix : e.record.data.Prix,
    famille : e.record.data.famille, 
    date_ent : e.record.data.date_ent.format('Y-m-d')

   },
   success : function(response) {
    var result = eval(response.responseText);
    switch (result) {
     case 1 :
      articlesDataStore.commitChanges(); 
      articlesDataStore.reload();
      articleAction = 'Modifier';
      // reload our datastore.
      break;
      case 2 :
        Ext.MessageBox.alert('un article du même code exist déja !');
      break;
     default :
      Ext.MessageBox.alert('les données ne sont pas enregistré...');
      break;
    }
   },
   failure : function(response) {
    var result = response.responseText;
    Ext.MessageBox.alert('Erreur',result);
   }
  });
 }
  articlesListGrid.on('afteredit', EnregistrerArticle);
 
Dans la dernière ligne du code ci-dessus nous affectons à notre fonction a l’événement 'afteredit' qui se produit juste après qu'une cellule de notre grille est modifié notre fonction d’enregistrement.
nous avez terminé les modification sur notre fichier grille.js, maintenant nous allons repassé a notre contrôleur afin qu’il puisse répondre aux requête d’édition et d’ajout. 
Application/controllers/index.php
case "gListeFamille" :
      $famille = new familles();
         $resultat = $famille->fetchAll()->toArray(); 
        
      break;
case "gAjouter" :
      $article = new Articles ();
      $id = $formData['ref'];
      $row = ($article->find($id));
      if (empty($row['ref']))
      {
      unset($formData['gAction']);
        $article->insert($formData);
       $resultat = 1; 
      }
      else 
      {$resultat = 2;} // un Article du meme code exist déja
      // $resultat = .....     
      break;
      
     case "gModifier" :
                        
      $article = new Articles ();
      $id = $formData['ref'];
      $row = ($article->find($id));
      
      unset($formData['ref']);
      unset($formData['gAction']);
      $where = $article->getAdapter()->quoteInto('ref = ?', $id);
      $article->update($formData,$where);
      $resultat = 2;
     
      break;
 
Nous pouvons dès a présent testé notre code, vous pouvez constaté qu’il est belle et bien possible de modifier et d’ajouter des enregistrement.
Nous arrivons a la fin de cette partie qui est un peut complexe,si nous avons déclarer notre clé primaire auto-incrémenté les chose serais plus simple.
Dans la prochaine et dernière partie nous verrons comment ajouter à notre grille une barre de pagination et recherche rapide,si vous avez des problèmes faire fonctionner votre grille ou des commentaires je serai ravi d’y réponde.

jeudi 26 février 2009

Grille ExtJS et Zend Framework (2eme partie)

Dans cette partie nous allons construire et afficher notre grille, pour ce faite nous avons besoin de définir ces propriétés et sa source de données (DataStore dans le jargon ExtJS).

DataStore

Le DataStore est un tableaux de données qui peut être charger depuis n’importe quel source de données (XML, JSON...etc) ,pour que notre grille puisse afficher des données elle doit être impérativement attacher un DataStore, à un moment donnée si nous voulons changer le contenu de notre grille nous devrons changer celui du DataStore.

Pour commencer nous allons créer un nouveau fichier javascript grille.js dans le dossier js et nous lui ajouterons les fragments de  code qui suivent à la filé .

public/js/grille.js
var articlesDataStore;
var articlesCols;
var articlesListGrid;
var articlesListWindow;

Ext.onReady(function(){
   Ext.QuickTips.init();

Dans ce bout de code nous avons déclarer les variables dont nous aurons besoin plus bas, si vous avez remarqué le code ExtJS commence toujours par Ext.OnReady,cette méthode nous assure que tous les éléments ont été chargé avant de commencer a exécuté les scripts.

Nous allons maintenant définir notre DataStore.

public/js/grille.js
articlesDataStore = new Ext.data.Store({
       id: 'articlesDataStore',
    proxy: new Ext.data.HttpProxy({       // on vas utiliser une requette Http
                url: 'index/grille',  //url de l'action qui gère notre grille
                method: 'POST'       //on va utiliser la méthode poste pour notre requette
    
            }),
       baseParams:{gAction: "gListe"},  //on défini les paramètre à transmettre au l'action
         reader: new Ext.data.JsonReader({   
         root: 'results',
         totalProperty: 'total',
         id: 'id'
       },
    [ 
         {name: 'ref', type: 'string', mapping: 'ref'},
         {name: 'designation', type: 'string', mapping: 'designation'},
         {name: 'Qte', type: 'int', mapping: 'Qte'},
         {name: 'Prix', type: 'float', mapping: 'Prix'},
         {name: 'famille', type: 'string', mapping: 'famille'},
   {name: 'Libelle', type: 'string', mapping: 'Libelle'},
         {name: 'date_ent', type: 'date', mapping: 'date_ent'}
         
       ]),
       
       sortInfo:{field: 'ref', direction: "ASC"}
    
     });

Nous avons déterminés ci-dessus le proxy, BaseParams, reader et la  définition des champs du DataStore dont:

Proxy : définit la méthode, url et le type de requête à transmettre à notre Action dans notre cas (POST, ‘index/grille’ et Http).

BaseParams : c’est les données qui seront transmise via la requête, dans notre cas nous envoyons une variable gAction avec la valeur gListe.

reader : définit la structure et lit les valeurs des données de retour transmises par l’action grille.

Attention la casse est respecté dans les noms de colonnes, le mapping doit être tel qu'il est définit dans votre base de données et le champ name au dataIndex du ColumnModel.

ColumnModel

dans le ColumnModel nous allons définir l’apparence et le comportement de chaque colonne de la grille

public/js/grille.js
  articlesCols = new Ext.grid.ColumnModel([
  {
   header: 'Ref.',
   readOnly: true,
   dataIndex: 'ref', 
   width: 60,
   hidden: false
  },
  {
   header: 'Désignation',
   readOnly: true,
   dataIndex: 'designation', 
   width: 200,
   hidden: false
  },
  {
   header: 'Qte',
   readOnly: true,
   dataIndex: 'Qte', 
   width: 50,
   align:'right',
   hidden: false
  },
  {
   header: 'Prix',
   readOnly: true,
   dataIndex: 'Prix', 
   width: 80,
   hidden: false,
   renderer: Ext.util.Format.formatNumber.createDelegate(Ext.util.Format),
            align:'right',
  
  },
  {
   header: 'Familles',
   readOnly: true,
   dataIndex: 'famille',
   width: 50,
   hidden: true
  },
  {
   header: 'Familles',
   readOnly: true,
   dataIndex: 'Libelle',
   width: 150,
   hidden: false
  },
  {
   header: 'Date d\'entrée',
   readOnly: true,
   dataIndex: 'date_ent', 
   width: 80,
   hidden: false,
   renderer:Ext.util.Format.dateRenderer('d/m/Y')
  }
  ]);

Malheureusement ExtJS 2.0 n’inclut pas de base un moyen de formatage pour les monétaires ou pour le groupage des numériques par millier, alors les membres de la communauté ExtJS on développé une extension qui nous permettra de formater notre colonne Prix.

lien de téléchargement de l’extension.

Nous  devrons mettre cette extension dans notre dossier js et insérer le script dans le l’entête de notre layout

Comme nous avons terminé de définir le DataStore et le ColumnModel, nous somme enfin prêts à créer notre grille, dans notre exemple nous avons choisi de mettre celle-ci dans une fenêtre flottante mais ce n’est pas une nécessité, vous la placer dans n’importe quel conteneur.  

public/js/grille.js
 
      articlesListGrid =  new Ext.grid.EditorGridPanel({
          id: 'articlesListGrid',
       title:'liste des employe',
          store: articlesDataStore,     // Définition du lien avec le DataStroe
       cm: articlesCols,        // affectation des colonnes  
       enableColLock:false,
       selModel: new Ext.grid.RowSelectionModel({singleSelect:false})

       });
       
  articlesListWindow = new Ext.Window({  //nous mettons notre grille dans une fenêtre flottante
      id: 'articlesListWindow',
      title: 'list articles',
      closable:true,
      width:700,
      height:350,
      plain:true,
      layout: 'fit',
     items: articlesListGrid  
    });
  
  articlesDataStore.load();
 
  articlesListWindow.show();   // Display our window
  
 
});

Nous avons terminé la conception de notre grille mais tous de même nous ne pourrons pas encore l’afficher, nous devons d’abord effectuer quelques modifications sur l’action grille de notre contrôleur Index comme nous l’avons prédis dans la première partie.

Application/Controllers/IndexController.php
    switch ($gAction) {
     case "gListe" :
       $data = array();
       $rows =$article->lister();
            foreach ($rows as  $key=>$row)
                    {
                     $date =new Zend_Date($rows[$key]['date_ent'] ,Zend_Date::ISO_8601);
                     $rows[$key]['date_ent'] =$date->toString('MM/dd/yyyy');
                    
                     }
        $data['results'] = $rows;
                          $data['total'] = count($rows);
                          $resultat = Zend_Json :: encode($data);
      break;

  

Nous avons défini ici la traitement à effectuer lorsque en reçoit la requête POST quand gAction = gListe comme suit.

  1. Récupération de la liste des articles.
  2. Conversion des dates du format MySQL en format JavaScript  YYYY-MM-DD =>  mm/dd/yyyy.
  3. encodé le tous en JSON.

Dans cette exemple nous avons défini tous les traitements dans notre action ce qui n’est pas très judicieux, le mieux est de définir des fonctions dans notre model auxquelles nous ferons appel pour mieux respecter le concept MVC et de décharger notre action pour une meilleur clarté de notre code.

Nous rajoutons maintenant la touche finale en appelons le script grille.js dans notre vue Index.

Application/views/scripts/index.phtml
<script type="text/javascript" src="<?php echo $this->baseUrl();?>/public/Js/grille.js"></script>

Nous arrivons a la fin de cette partie qui consiste à afficher la grille mais ce n’est pas encore fini, dans la partie suivante nous allons lui rajouter un peut de punch en lui ajoutant les fonctionnalités d’édition,d’ajout et de suppression.

dimanche 22 février 2009

Grille ExtJS et Zend Framework (1er Partie)

 
Préambule
Dans ce tutoriel nous allons réaliser une grille ExtJS dans le model MVC de Zend Framework en  corrélation avec Zend_Zb_Table,  celle-ci  ne va pas se contenté d’afficher nos données mais elle nous permettra aussi de modifier, ajouter, supprimer ou encore d’effectuer des recherches, entre autre elle sera doté d’une barre de pagination.
le présent tutoriel a été testé avec la version 1.7.4 de Zend Framework et de la version 2.0 d’ExtJS.
Comme cet article risque d’être un peut long nous allons le scinder en plusieurs parties.  
Pré-requis :
Nous supposons que vous avez  une assez bonne maitrise de PHP , du model MVC  de Zend Framework ainsi que des connaissances de base en Ajax.  
Mise en œuvre
Pour commencer nous allons créer un nouveau projet Zend Framework avec la structure conventionnel (voir ce tutoriel Débutez avec Zend Framework approche MVC) , acquérir et installer ExtJS comme décrit dans ce billet.
Base de données (conception).
Pour notre tutoriel nous prendrons comme exemple une liste d’articles en stock pour ce faite nous aurons besoin d’une base de données avec deux tables (articles et famille d’articles).
Table articles
Champs Type Commentaires
ref VARCHAR (20) PK Référence
designation VARCHAR(50) Désignation de l’article
qte INT(11) Quantité en stock
prix DOUBLE (14,2) Prix unitaire
famille INT code famille d’article
date_ent DATE date de 1er entrée

Table familles
Champs Type
id INT(11)
libelle VARCHAR(30)

le scripts ci-dessous va nous permettre de créer et ajouter quelques données exemple à nos deux tables .
Script sql
--
-- Structure de la table `articles`
--

CREATE TABLE IF NOT EXISTS `articles` (
  `ref` varchar(20) NOT NULL,
  `designation` varchar(50) NOT NULL,
  `Qte` int(11) NOT NULL,
  `Prix` double(14,2) NOT NULL,
  `famille` int(11) NOT NULL,
  `date_ent` date NOT NULL,
  PRIMARY KEY (`ref`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Contenu de la table `articles`
--

INSERT INTO `articles` (`ref`, `designation`, `Qte`, `Prix`, `famille`, `date_ent`) VALUES
('3112-0006', 'Enveloppes F25', 5, 20.00, 1, '2009-01-20'),
('3114-0001', 'Cartouche d''encre A45', 5, 200.00, 2, '2009-02-02'),
('3117-0007', 'lecteur DVD', 3, 1400.00, 3, '2009-02-20');

-- --------------------------------------------------------

--
-- Structure de la table `familles`
--

CREATE TABLE IF NOT EXISTS `familles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `Libelle` varchar(30) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `familles`
--

INSERT INTO `familles` (`id`, `Libelle`) VALUES
(1, 'Fournitures de bureau'),
(2, 'Consommables informatique'),
(3, 'Matériels informatique'),
(4, 'Pèces de rachange');
maintenant que notre base de données a été créer nous la allons nous connecter à celle-ci, dans votre bootstrap vous rajouter le fragment de code suivant.

Application\bootstrap.php.
 ....... 
 ......

$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => 'localhost',
    'username' => 'root',
    'password' => '',
    'dbname'   => 'zfextjs'
));
Zend_Db_Table::setDefaultAdapter($db);
 ........
 ........
Nous avons utilisé cette méthode de connexion dans un but de simplicité n’étant pas la meilleur, nous vous conseillons d’utiliser un fichier de configuration distinct comme c’est défini dans  ce cours .Présentation du Zend Framework - Premiers pas. que je vous recommande fortement si vous ne l’avez pas déjà fait
Nous allons maintenant créer nos deux class qui vont encapsuler nos tables.
Application\models\Articles.php.
<?php
class Articles extends Zend_Db_Table {
 protected $_name = 'articles';
 protected $_primary = array ('ref' );
 
 public function lister() {
  $select = $this->select ();
  $select->from ( 'articles', '*' )
    ->setIntegrityCheck ( false )
    ->join ( 'familles', 'familles.id=articles.famille', 'Libelle' );
  return $this->fetchAll ( $select )->toArray();
 }

}
Application\models\Familles.php
class familles extends Zend_Db_Table
{
    protected $_familles = 'familles';
}
Maintenant nous allons nous intéresser à notre contrôleur, suivant l’action de l’utilisateur  notre grille envoi au contrôleur une requête post a travers un champs que nous allons nommé gAction et d’après ça valeur  nous déterminerons l’action à entreprendre sur notre base de données, nous définissons les valeur possible de gAction comme suit: 
  • gListe          : pour lister les données
  • gAjouter      : pour insérer un nouvel enregistrement.
  • gModifier     : pour modifier un enregistrement existant.
  • gSupprimer : pour supprimer un enregistrement
  • gChercher   : pour faire une recherche
Application\controllers\IndexController.php
 class IndexController extends Zend_Controller_Action {
 
 function indexAction() {
  $this->view->title = "liste des articles";
 
 }
 
 function grilleAction() {
  
  $this->_helper->layout->disableLayout ();
  $this->_helper->removeHelper ( 'viewRenderer' );
  
  if ($this->_request->isPost ()) {
   
   Zend_Loader::loadClass ( 'Zend_Filter_StripTags' );
   $f = new Zend_Filter_StripTags ( );
   $gAction = $f->filter ( $this->_request->getPost ( 'gAction' ) );
   if (! empty ( $gAction )) {
    
    $article = new Articles ();
    
    switch ($gAction) {
     case "gliste" :
      // Action lister....
      // $resultat = .....     
      break;
     case "gAjouter" :
      
      // $resultat = .....     
      break;
     case "gModifier" :
      //....
      

      break;
     case "gSupprimer" :
      
      break;
     case "gChercher" :
      
      break;
     default :
      break;
    }
    
    $this->getResponse ()->clearBody ();
    $this->getResponse ()->setHeader ( 'Content-Type', 'text/x-json' );
    $this->getResponse ()->setBody ( $resultat );
   }
  
  }
 }
}
c’est pas fini sinon ça sera trop beau, nous allons revenir plusieurs fois sur ce contrôleur afin de renseigner toutes les actions au fil de l’avancement du tutoriel. 
nous arrivons à la fin de cette première partie qui a consisté à préparer le Zend Framework à accueillir et répondre aux requêtes de notre grille  dans la second partie nous allons nous focaliser sur son affichage.