J'administre un portail qui date de 2002, et qui avait ete developpe exclusivement en scripting PHP pur, en dehors de tout CMS pre-existant.

Il se connecte a des sources de donnees MySQL a travers une simpe classe AdoDB, legerement remaniee, que j'avais a l'epoque piochee dans le package PHPLib 7. Au passage, je constate avec plaisir que cette superbe librairie est toujours referencee sur Sourceforge, et a meme fait l'objet d'une releae 7.4a en fevrier 2006.

Mon portail comporte sa propre gestion de droits, relativement rudimentaire, basee sur une matrice croisant des groupes (ou roles) avec des droits fonctionnels elementaires, une simple fonction du tive "verifieDroit($groupe,$droit)" assure les controles logiques.

La pluparts de mes fonctionnalites sont codees a travers une page dediee, du type adm_func.php ou usr_func.php, suivant que je traite du backoffice ou du frontoffice du portail. Naturellement, chaque fonctinnalite fait appel a un certain nombre d'inclusions locales, ou de fonctions globales.

Voici les problemes que je rencontre :=> Mes utilisateurs souhaitent des interfaces plus ergnomiques,=> Avec le temps, mon code est devenu plethorique, confus, et intrique,=> La fiabilisation des processus et de l'integrite des donnees devient un vrai casse-tete

Fort de ces constats, mon but est de moderniser les fontionnalites offertes a mes utilisateurs, en mettant en oeuvre des interfaces enrichies avec Flash ou Flex. Toutefsoi, j'ai de nouveaux enjeux a prendre en compte :=> Je ne veux pas refondre tout mon portail d'un seul coup : Il y a trop de dependances liees, et ce serait un travail de romain. J'ai besoin d'une methodologie qui me permette de mettre a niveau mes fonctionnalites progressivement.=> Nous sommes plusieurs developpeurs a intervenir sur le site, et j'ai donc besoin d'une organisation collaborative.=> Les mises a niveau doivent etre validees par mon client sans perturber le site en exploitation : J'ai donc besoin d'une gestion des versions.

Le challenge est piquant, n'est-ce pas ?

Je vous livre ici la demarche que j'ai adoptee, en 4 actes, et en demontre les benefices : Avis bienvenus !

=> ACTE 1 : Mise en place d'un processeur PHP global. Cette simple mesure permet de faire d'une pierre 3 coups :- Je peux mettre en oeuvre un environnement multi-developpeurs- Je peux mettre en oeuvre un versionning de fichiers- Je peux mettre a la disposition de mon client des versions beta de fonctionnalites, sans perturber l'environnement de production.Pas mal non ? La technique est d'une simplicite deconcertante. En outre, elle me permet d'economiser un rigoureux et fastidieux service CVS ou SVN.AVANT : J'invoquais ma fonctionnalite directement par "adm_func.php"APRES : J'ai mis en place un processeur PHP global qui suit la syntaxe suivante :processeur.php?f=adm_func[&d=xxx&v=nnn]ou "f" est le nom de mon fichier "d" est le nom du developpeur (optionnel) "v" est la version (optionnel)Le contenu de mon fichier processeur est le suivant :switch ($d) {case "quad": switch ($f) { case "adm_func": // mes regles de redirection ici, en fonction des numeros de version break; default: if ($v) { $le_fichier=$f."_v".$v.".php"; } else { $le_fichier=$f.".php"; } break; default: if ($v) { $le_fichier=$f."_v".$v.".php"; } else { $le_fichier=$f.".php"; } break;}// In fine, je charge le bon fichier s'il existeif file_exists($le_fichier) { require($le_fichier);} else { echo "Ce fichier n'existe pas."}

En production mon URL est "processeur.php?f=adm_func"En test et beta, mon URL :"processeur.php?f=adm_func&d=quad&v=2"renverra naturellement la nouvelle version de la fonctionnalite, telle qu'elle est developpee par le programmeur "quad", ou dans l'environnement de developpement "quad". Pour les plus malins d'entre vous, vous aurez compris qu'on gagnera du temps et du confort d'utilisation en fixant les variables $d et $v en session cote serveur !

=> ACTE 2 : Mise en place d'une nouvelle interface Flash/FlexJe met au feu mes vieilles pages HTML, et je met en oeuvre une nouvelle interface moderne et attractive avec Flash ou Flex. Avec l'un ou l'autre de ces outils, il en resulte un fichier SWF que j'encapsule proprement dans une nouvelle page fonctionnelle a l'aide du cultissime " swfObject". Le contenu type de ma page adm_func_v2.php sera reduit a cela :<code><html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><title>Mon BO PORTAIL - Ma fonctionnalite v2</title></head><body><script type="text/javascript" src="js/swfobject.js"></script> <div id="flashcontent">  Mon portail - Pour visualiser ce contenu, vous devez activer Javascript, et disposer du lecteur Flash version 7 ou plus.</div><script type="text/javascript">   var so = new SWFObject("swf/adm_func.swf", "mon_swf", "800", "600", "7", "#FFFFFF");   so.write("flashcontent");</script></body></html></code>

=> ACTE 3 : Securisation des sessionsNous sommes dans une page qui est securisee, avec 2 niveaux d'accreditation :- Un login utilisateur global- Une verification des droits de cet utilisateurCes informations peuvent tres facilement etre stockees en variable de session tres en amont, et il suffit donc de retransmettre au composant SWF ces donnes de session, stockees dans le tableau unique PHP $_SESSION.-Cote client, on amenage notre fichier HTML comme suit :<?// Je recupere mes en tetes PHP indispensables au seul fonctionnement de mon template HTML $SID=session_id(); // Je recupere l'id de session?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /><title>Mon BO PORTAIL - Ma fonctionnalite v2</title></head><body><script type="text/javascript" src="js/swfobject.js"></script> <div id="flashcontent">  Mon portail - Pour visualiser ce contenu, vous devez activer Javascript, et disposer du lecteur Flash version 7 ou plus.</div><script type="text/javascript">   var so = new SWFObject("swf/adm_func.swf", "mon_swf", "800", "600", "7", "#FFFFFF");      so.addVariable("SID", "<? echo  $SID; // Et je la transmet a Flash ?>");   so.write("flashcontent");</script></body></html>

=> ACTE 4 : Extraction de la couche "business" avec AMFPHPCote serveur, on prepare tout d'abord un service AMFPHP (type svc_verifieSession.php) pour verifier la session : Si le SID renvoye par Flash correspond au session_id courant on renvoie a Flash tout ou partie du tableau $_SESSION. Je suggere pour ma part de renvoyer 2 tableaux filtres, l'un du type userData pour collecter les donnees utiles sur l'utilisateur courant, et un autre du type userDroits pour collecter la matrice de droits. Mais a chacun sa sauce, et tout depend de votre architecture !

Une fois ce cap passe, les grands espaces couverts d'herbe verte et jonches de petales de roses s'ouvrent devant vous : - Preparez un service AMFPHP global intitule svc_adm_func.php,- Remobilisez a ce niveau votre connecteur SQL (dans mon cas, ma connexion MySQL via adoDB ),- Declarez toutes les methodes dont vous aurez besoin pour gerer les transactions entre l'interface utilisateur et la base de donnes.- Codez vos requetes SQL, et verifiez vos echanges de donnees in/out avec votre fidele Charles.

=> CONCLUSION : Les benefices degages- Je n'ai pas perturbe mon environnement existant, et mes nouveaux developpements s'integrent naturellement au fil des jours,- J'ai desormais une architecture multi-utilisateurs avec une gestion de versions de fichiers, certes sommaire mais efficace,- Je mets en oeuvre des interfaces plus riches et conviviales avec Flex et Flash, pour le plus grand bonheur des utilisateurs finaux,- j'ai tres explicitement dissocie ma couche applicative et ma couche data, grace aux services AMFPHP,- J'ai clarifie mon architecture de fichiers et de dependances : Pour une fonctionnalite donnee, j'ai un conteneur HTML ultra leger (adm_func_v2.php), un element SWF qui contient tous les elements d'interface graphique (swf/adm_func.swf), et un service AMFPHP (svc_adm_func.php) qui fournit toutes les methodes necessaires aux transactions de donnees.

Le bonheur c'est simple, non ? Bon courage a tous !

Bookmark and Share

Le composant datagrid fait encore parler de lui. Bien pratique pour monter des interfaces d'administration et de data mining, il pose néanmoins pas mal de problèmes de formatage aux utilisateurs occasionnels.

=> Le grand classique des problèmes évoqués est de pouvoir afficher des conten us multi-lignes dans les cellules. Heureusement, vous avez déjà du localier la note technique qui y répond chez Adobe : http://www.adobe.com/support/documentation/en/flash/fl8/samples.html . le principe est d'utiliser l'API "CellRenderer", et cela fonctionne plutôt pas mal.

=> Mais la deuxième question corollaire est un peu plus ardue : Comment mettre en oeuvre des têtes de colonnes multi-lignes cette fois-ci ? Pas pareil ...

Nous avons été amenés, Lily et moi, à chercher une solution à l'occasion d'un projet de catalogue produits compilé sous Zinc. Cette solution, la voici :=> On verrouille le redimensionnement des colonnes du datagrid,=> Sur un calque situé au-dessus du datagrid, on dessine des têtes de colonnes sur mesure, avec aucune difficulté pour placer les titres sur plusieurs lignes.=> Dans ce clip, et sur chaque cellule de tête de colonne, on place un bouton transparent : Ils vont permettre de récupérer l'affichage du curseur doigt au survol, et de reprogrammer les comportements de tri de colonne.=> Pour trier les colonnes dynamiquement, il suffit d'agir sur le tableau qui sert de dataProvider au datagrid : Flash propose une méthode rès pratique, "Array.sortOn()". Imaginons ainsi que mon dataset comporte 3 champs comme suit :

ma_liste = [{nom:"quad", prenom:"damage", ville:"marseille"}, {nom:"lily", prenom:"virus", ville:"lyon"} ];

Si l'on souhaite trier suivant le nom, il suffit d'exécuter la commande

ma_liste.sortOn("nom");

Par défaut le tri est ascendant, et pour préciser l'ordre inverse, il suffit d'indiquer

ma_liste.sortOn("nom", Array.DESCENDING);

Simple, non ?

La dernière étape consiste alors à raffraichir explicitement l'affichage du datagrid en indiquant :

mon_datagrid.dataProvider=ma_liste;

La cerise sur le gâteau est ensuite d'ajouter les petites flèches visuelles indiquant le sens de tri, mais çà, vous savez faire ...

[swf src=http://web.infostrates.fr/infolabs/media/blogs/quad/datagrid_multiline_header.swf width=300 height=300 id=test version=7]

Les sources de l'exemple sont ici : datagrid_multiline_header.zip

Bookmark and Share

J'explique le problème, nous sommes dans ce cas de figure :

=> Vous développez une application avec Flash ou Flex, que vous allez compiler avec Director ou Zinc.=> Votre logiciel comporte des fonctionnalités pour lesquelles vous utilisez le composant datagrid de Flash.=>Vous utilisez un EXE principal, a partir duquel vouc chargez dynamiquement en "loadMovie" des contenus SWF.

Alors vous allez inmanquablement rencontrer sous Windows des artefacts visuels lorsque vous allez successivement afficher et faire disparaitre des composants datagrid de la scene, apres avoir interagi avec lui : Un leger contour bleu rectangulaire se materialise alors, et ne partira plus de l'ecran, malgre tous vos efforts sur la feuille de style. Il s'agit d'un bug du flah player de Windows, qui est extremement genant.

Une parade radicale consiste a systematiquement decharger ("unloadMovie") le clip complet de la scene, mais ce n'est franchement pas tres pratique de fonctionner comme cela.

Alors, je vous livre la feinte qui resoud le probleme : Ne placez plus les composants datagrid directement sur la scene de vos clips, mais encapsulez-les toujours dans un clip hote, c'est tout et ca fonctionne !

A noter que cette petite plaisanterie de feu Macromedia s'observe egalement dans la categorie UI, comme l'accordeon, la checkbox, etc ...

Post scriptum : Concernant l'utilisation des composants datagrid, je vous conseille un excellent site francophone : http://philflash.inway.fr=> A stocker d'urgence dans vos signets developpeurs.

Bookmark and Share

Si comme nous ce sujet vous interesse, voici un site a mettre sur ecoute ...

http://www.brightworks.com/technology/adobe_flex/with_php.html

Bookmark and Share

Sephiroth, dont nous avons fait notre Flash Gourou depuis de nombreuses annees, nous livre ces derniers jours une extension Firefox extremement utile : Un Flash Switcher, ou comment basculer de Flash 7 a Flash 8 ou Flash 9, poour des raisons de controle qualite, en seul clic.

Gloire te soit rendue Alessandro Crugnola !

XPI pour Windows : http://www.sephiroth.it/weblog/archives/2006/10/flash_switcher_for_firefox.php

XPI pour Mac OS X : http://www.sephiroth.it/weblog/archives/2006/11/flash_switcher_for_osx.php

Bookmark and Share

Les petits gars de 2advanced refont parler d'eux.

Voici une picorette qui devrait donner des idées à nos commerciaux ;-)

http://www.page-flip.com/

Bookmark and Share

Dans nos métiers, beaucoup de livrables sont des fichiers SWF, destinés au web où à l'intégration dans des projets multimedia. Dès lors qu'il s'agit de les faire valider part le client se pose le problème du format d'envoi :=> Envoyez un SWF et le client ne saura pas qu'en faire. Au mieux, il va l'ouvrir avec son navigateur web, mais l'image sera distordue par le passage en pleine fenêtre (sauf si vous avez spcifié allowscale=false).=> Envoyez lui un projecteur EXE, et là ce sont 1 Mo supplémentaires qui sont ajoutés à votre malheureux fichier de 200 ko !

Une bonne alternative consiste à inviter le client à s'équiper d'un lecteur gratuit, adapté à sa plate-forme de travail :=> Sur PC/Zindoz : SWFPlayer=> Pour Mac OS X : Eltima Flash Player

Avec ce type de logiciel, votre client pourra sereinement visionner vos animations, dans leur taille d'origine, et dans le respect de toute l'interactivité programmée. Qui plus est, ces logiciels proposent des barres de progression, avec boutons play/pause.

On peut étendre ce raisonnement aux fichiers vidéos FLV, pour lesquels il existe de nombreux lecteurs gratuits. Le plus connu sous Zindoz est le lecteur RIVA.

Bookmark and Share

Il parait que Google indexe les fichiers Flash depuis Avril 2004 ? Je tombe des nues ! Il n'est jamais trop tard pour s'informer ... Voici l'objet du delit :

Pour restreindre votre recherche aux objets SWF, il suffit d'ajouter a votre requete la chaine suivante : "blablabla filetype:swf" , magique !

Pour en savoir plus :=> http://www.internet-marketing-analysts.com/Google-Flash_tutorial/=> http://www.adobe.com/licensing/developer/search/faq/

Bookmark and Share

Alors que l'on passe nos journees a torturer la scene Flash et l'editeur actionscript a des fins souvent plus utilitaristes qu'esthetiques, il est plus que jamais utile de nous inviter les uns les autres a la creativite pure. Et contrairement a l'opinion commune, la creativite ne se limite pas a la manipulation experte de brushes, filtres, et autres effets de calques. Elle peut se glisser dans 3 petites lignes de code.

Jugez plutot ! => http://www.levitated.net/gravityIndex.html

Du code open source a charger, et de la graine a prendre ...

Un grand bravo a ce groupement d'artistes numeriques, qui m'ont emerveille depuis le fin fond de leur Nouveau Mexique natal !

 

Bookmark and Share

Vous avez peut etre remarque que certaines de vos animations Flash peuvent solliciter tres fortement le CPU de votre ordinateur, et il y a plusieurs raisons a cela :

- Des scripts qui tournent en boucle, dans le style d'evenements "onEnterFrame" mal geres,- De trop nombreux sprites en mouvement sur la scene avec des effets de teinte ou d'alpha.

Quoi qu'il sen soit, surveillez de pres les charge lors de vos phases d'optimisation.

Sur Mac OS X, je vous suggere un excellent utilitaire : iStat Pro, qui a la bonne idee de se presenter sour la forme d'une application et d'un widget Dahboard.

C'est un peu le frere jumeau de son excellent et malheureusement defunt homologue Windows, WinPulse.

Bookmark and Share
eZ Publish™ copyright © 1999-2012 eZ Systems AS