Interfaçage CakePHP/ExtJS

On ressort un vieil article des archives, toujours d'actualité dans le principe!

Ces deux frameworks sont très bien l'un et l'autre, voyons comment on peut simplement profiter des deux en même temps.
Tous les chemins donnés ci après sont absolus (si "/" au début) ou relatifs au répertoire app du projet CakePHP.
Ce billet sera complété à l'occasion...

Les ingrédients de base

Rendre ExtJS visible à CakePHP

ExtJS et CakePHP ayant chacun leur propre structure, il n'est pas aisé de les faire coïncider sans hacker le code de ExtJS. Une solution peut être de mettre ExtJS dans app/webroot/js et de manipuler les redirections, mais ce n'est la meilleure solution. Le mieux est certainement d'installer ExtJS quelque part sur votre serveur, disons dans DocumentRoot/ext par exemple, hors de cake donc, de cette façon ExtJS est réutilisable par d'autre projets et aucune modif d'aucune sorte n'est nécessaire.
Concrètement cela revient à ajouter dans le fichier views/layouts/default.thtml (ou votre vue par défaut) ces lignes :

<!-- Inclusion des elements externes extjs -->
<link rel="stylesheet" type="text/css" href="http://www.mondomaine.com/ext/resources/css/ext-all.css" />
<script language="Javascript" src='/ext/adapter/ext/ext-base.js'></script>
<script language="Javascript" src='/ext/ext-all.js'></script>
<script language="Javascript" src='/ext/build/locale/ext-lang-fr.js'></script>

Faire communiquer ExtJS et CakePHP

Conventions d'utilisation de CakePHP

En plus des conventions internes à CakePHP et en vue d'une application utilisant beaucoup Ajax, on peut définir les conventions suivantes :

  • le nom de toute fonction utilisée en "mode" Ajax débutera par "ajax", par exemple ajaxLoad;
  • le nom de toute vue utilisée pour rendre le résultat d'une fonction en "mode" Ajax débutera par "ajax", par exemple ajax_result.thtml;
  • dans le nom des fichiers, on n'utilisera pas de majuscules mais juste des "_";
  • on choisira "thtml" comme extension des fichiers vues.

Conventions d'utilisation de ExtJS

On définit ces conventions :

  • tout comme pour les vues, on stockera tous les scripts utilisés par les vues d'un modèle dans un dossier du nom du modèle (au pluriel) dans webroot/js;
  • on privilégiera la réutilisation des éléments communs stockés dans un dossier views/shared, comme par exemple une vue ajax_result.thtml qui peut être commune à plusieurs modèles.

De ExtJS vers CakePHP

Dans ce sens, on utilise les conventions de CakePHP dont les données pour un objet $A sont stockées dans $A->data et récupérées directement depuis les formulaires contenant des champs nommés.
Mais ça va être long à détailler comme ça, prenons tout de suite un exemple avec une petite application servant à basculer des ressources logicielles dans un état "maintenance", "secours" ou "opérationnel". On va regarder ici uniquement la partie définition des logiciels utilisés par les ressources.

L'application complète gére d'autres objets en plus des logiciels, mais le principe reste le même, aux associations près.

La liste des sources pour la partie gestion des logiciels est celle-ci :

  • controllers/bascul_logiciels_controller.php : le controleur des logiciels
  • models/bascul_logiciel.php : le modele de comportement d'un logiciel
  • views/bascul_logiciels/ajax_liste.thtml : le template de retour de la liste des logiciels
  • views/shared/ajax_result.thtml : le template retour d'un appel Ajax
  • webroot/js/bascul_logiciels/index.js : UI de gestion des logiciels

En fait, l'application est découpée en sous éléments et c'est le modèle bascul qui les met en oeuvre, voici le controller, la vue et le script correspondant (pas de modèle) :

  • controllers/bascul_controller.php : controleur des bascules
  • views/bascul/index.thtml : template de la page principale de l'application
  • webroot/js/bascul/index.js : UI de gestion de l'application

De CakePHP vers ExtJS

Dans ce sens, on peut utiliser un fichier XML contenant les informations à passer rempli du côté CakePHP et lu par un objet XMLReader du côté ExtJS. Comme on peut le voir dans la fonction getStoreLogiciels, on peut utiliser un champ "artificiel" nommé displayfield qui servira à désigner la variable à afficher dans les combobox.

Soumettre un formulaire avec ExtJS

Il y a deux méthodes. Soit on utilise la soumission "standard" dans ExtJS, comme dans la fonction editOneLogiciel, et alors la réponse rendue au format JSON est directement exploitable dans le script (le parsing de la réponse est implicite). Soit on utilise une requête Ajax.Request qu'on gère soi même, et alors il faut décoder explicitement la réponse comme dans la fonction delLogiciel.

Fichier joint

En fichier joint, j'ai mis cette mini-application presque complète, il y a des références à l'application englobante via les fonctions "checkMenu" et "checkProfil" qu'il faut définir pour implémenter des contrôles d'affichage ou d'accès par exemple.
La structure de la base est donnée (pour une base postgres) dans le fichier config/database.sql.


Documents joints :

Vos réactions

Poster un nouveau commentaire

Le contenu de ce champ sera maintenu privé et ne sera pas affiché publiquement.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • Images can be added to this post.
  • Internal paths in double quotes, written as "internal:node/99", for example, are replaced with the appropriate absolute URL or relative path.

Plus d'informations sur les options de formatage

CAPTCHA
Cette question sert à tester si vous êtes un visiteur humain plutôt qu'une soumission automatique de spam.
Image CAPTCHA
Enter the characters shown in the image.

Accès Directs

Soyez informés