NyroBlog
Banniere NyroBlog
Image de Nyro - ?
« mai 2010
lunmarmerjeuvensamdim
12
3456789
10111213141516
17181920212223
24252627282930
31

nyroFwk, Framework PHP - Présentation

Ceci est un brouillon d'introducion à la documentation de nyroFwk. Toutes remarques, suggestions ou questions pour l'améliorer est la bienvenue !

Vendredi dernier, j'ai mis en ligne l'API et le svn (user : anon / passe : anon) de nyroFwk.

Bon c'est très bien tout ça, mais qu'est-ce que c'est ?

Pour commencer, petit extrai de wikipedia : Un framework est un kit de composants logiciels structurels, qui définissent les fondations ainsi que les grandes lignes de l'organisation de tout ou partie d'un logiciel.

Oui, mais des frameworks PHP, il en existe des tas, non ?
Oui, on peut signaler symfony, Zend Framework et CakePHP ici. J'ai testé ces 3 là plus ou moins fortement. Chacun a ses avantages et ses inconvénients. Mais aucun ne répondait exactement à mes besoins et habitudes de développements. Alors quand quelque chose ne me convient pas, moi, je le refais, tout simplement (comme nyroModal par exemple)

Alors qu'est-ce que je n'aime pas ou j'aime dans ces frameworks ?
  • CakePHP : la gestion des bases de données et des objets associés. A l'époque où j'avais testé, on était obligé de modifier les objets lorsqu'on avait des relations entre différents objets. Et puis je n'ai jamais réussi a vraiment faire quelque chose de bien avec. Pas forcément réellement tout testé non plus, je dois bien l'avouer. Là où CakePHP marque des points, c'est dans la génération automatique de l'administration et toutes les fonctionnalités ajax super simple à implémenter.
  • Zend Framework : Je ne l'ai jamais concrètement utilisé car il me paraissait trop énorme. Ce framework a absolument tout ce dont on peut rêver. L'organisation des fichiers, de la documentation et de tout ce qui va autour de ce framework est géniale.
  • Symfony : c'est celui que j'ai le plus utilisé (et que j'utilsie encore). J'aime bien la génération automatique des objets de base de données, même si je trouve cela dommage de devoir regénérer ça à chaque modification de la base de donnée. J'aime pas le grand nombre de fichiers de configuration et encore moins tous les différents formats possibles. Pourquoi s'embetter et donc ralentire le processus avec des fichiers YAML alors qu'un simple tableau PHP fait très bien l'affaire ? La barre de débuggage peut être très utile. La séparation des classes de chaque controller pose problèmes ; dans certains cas, on est obligé de réécrire le code...
Et puis il y a plein d'autres choses qui ne sont pas dans ces frameworks, comme :
  • Gestion simple de formulaire permettant d'ajouter des champs, de vérifier s'il est valide, de le remplir, de récupérer les valeurs, etc...
  • Intégration des règles d'opitimisations de yahoo developper simplement et de base
  • Gestion des images souples, rapide et efficace
  • Intégration d'un éditeur WYSIWYG simple
  • Gestion des fichiers envoyés par les utilsiateurs sécurisée (ie : possibilité de restreindre l'affichage de ces fichiers qu'aux utilsiateurs connectés)
  • Tout est objet
Vous l'aurez compris, ces éléments sont intégrés de base dans nyroFwk.

Dans mon framework, chaque objet a sa propre configuration, qui hérite de toutes la configuration de ses parents. Chaque configuration est définie de base par le framework mais est modifiable pour chaque site très simplement. Suivant les besoins, on peut aussi modifier la configuration de chaque classe suivant le controller (front ou admin). Prenons un exemple, plus parlant. La classe response_http_html gère tout ce qui sera envoyé au navigateur lorsque la page demandée est en HTML. Elle hérite de la classe reponse_http, qui elle hérite de la classe reponse_abstract qui hérite de object. La définition de cette classe est dans le fichier nyro/response/http/html.class.php. Sa configuration est dans le fichier nyro/response/http/html.cfg.php est conteint (extrait) :
$cfg = array(
    'meta'=>array(
        'robots'=>'index, follow',
        'description'=>'nyro project',
        'keywords'=>'nyro, project',
        'language'=>request::get('lang'),
    ),
);
On définit donc les balises meta par défaut de toutes les réponses HTML. A noter que la langue ici est dynamique sera en rapport avec la langue demandée par l'utilisateur (explications plus tard).

Cette configuration est là pour définir des éléments par défaut, mais doit bien évidemment être modifié pour chaque site. Pour ce faire, chaque site aura un dossier personnel dans lequel il doit définir ses classes propres aux sites, mais aussi toutes ces configurations. Ce dossier se nomme par défaut my dans nyroFwk et est placé juste à côté du dossier nyro.

Dans ce dossier propre à chaque site, on peut aussi redéfinir chaque classe de nyroFwk. En effet, à la demande de chaque classe, le framework va vérifier si le fichier correspondant à la classe existe dans le dossier my au bon endroit. Sinon, il cherchera dans le dossier de base du framework. Un mécanisme similaire est utilisé pour les configurations. Au lieu de remplacer la configuration, on va fusionner les configurations successives de la classe, en gardant bien sûr le plus spécifique. Par exemple, pour nyrodev.com, le fichier my/response/http/html.cfg.php ressemble à (extrait) :
$cfg = array(
    'meta'=>array(
        'title'=>'nyroDev, Analyste Développeur Web (PHP, jQuery)',
        'description'=>'Cédric Nirousset, nyroDev : Conception, Analyse et Développement de sites web (PHP, jQuery).',
    ),
);
Je redéfinis les balises meta title et description pour mon site public.

Les configurations sont un point très important pour nyroFwk. C'est pourquoi il est possible de définir encore plus finement ces configurations. Tout d'abord, on peut spécifier le controller de la configuration si on veut être plus précis. Pour mon site, l'administration porte le nom de controller 'admin' et le site public 'front' (par défaut dans nyroFwk). Pour l'administration, on n'a pas besoin des meta description par exemple. C'est la raison pour laquelle le fichier de configuration du site public ne se nomme pas comme je l'ai indiqué plus haut, mais en réalité my/response/http/html.front.cfg.php. Vous avez remarquer le front en plus qui indique que l'on veut l'affciher que pour le site public. Juste à côté, le fichier my/response/http/html.admin.cfg.php existe pour définir les éléments pour l'administration.

Avec ce système, on a déjà quelque chose de tout à fait souple. Mais ce n'est pas fini ! nyroFwk gère les sites multilangues de base. Son fonctionnement est :
  • On définit une langue par défaut
  • On définit les langues disponibles
  • Si l'URL demandé est du type : monsite.com/LANG/maPage avec LANG une langue définit, alors on passe dans la langue demandée.
Bien, et alors, le rapport avec les fichiers de configuration ? Simple, en plus de la spécification par rapport au controller, les fichiers de configuration permettent aussi de spécifier une configuration spécifique pour la langue demandée. Exemple pour mon site qui est aussi disponible en anglais, le fichier my/response/http/html.front.en.cfg.php contient :
$cfg = array(
    'meta'=>array(
        'title'=>'nyroDev, Analyst Developper Web (english) (PHP, jQuery)',
        'description'=>'Cédric Nirousset, nyroDev: Conception, Analysis and Development of websites (PHP, jQuery).',
    ),
);
Ce mécanisme est utilisé à plusieurs endroits dans nyroFwk pour définir des messages à l'utilisateurs. Et comme vous l'avez remarques, ces fichiers sont de vrais fichier PHP. Donc rien ne vous empêchera, quand vous serez plus à l'aise avec le framework, d'utiliser des classes avec des fonctions statiques pour faire d'autres choses comme par exemple utiliser la base de donnée pour modifier ces éléments...

Et n'oubliez pas : les configurations sont successives et n'écrasent pas les autres configurations, aussi bien des classes parentes, mais aussi des configurations du controller et de langue. Ainsi, pour la classe response_http_html, la configuration est le résultat de la fusion des configurations (le plus bas étant le plus prédominant) :
  1. nyro/object.cfg.php
  2. nyro/object.fr.cfg.php
  3. nyro/object.front.cfg.php
  4. nyro/object.front.fr.cfg.php
  5. my/object.cfg.php
  6. my/object.fr.cfg.php
  7. my/object.front.cfg.php
  8. my/object.front.fr.cfg.php
  9. nyro/response_abstract.cfg.php
  10. nyro/response_abstract.fr.cfg.php
  11. nyro/response_abstract.front.cfg.php
  12. nyro/response_abstract.front.fr.cfg.php
  13. my/response_abstract.cfg.php
  14. my/response_abstract.fr.cfg.php
  15. my/response_abstract.front.cfg.php
  16. my/response_abstract.front.fr.cfg.php
  17. nyro/response_http.cfg.php
  18. nyro/response_http.fr.cfg.php
  19. nyro/response_http.front.cfg.php
  20. nyro/response_http.front.fr.cfg.php
  21. my/response_http.cfg.php
  22. my/response_http.fr.cfg.php
  23. my/response_http.front.cfg.php
  24. my/response_http.front.fr.cfg.php
  25. nyro/response_http_html.cfg.php
  26. nyro/response_http_html.fr.cfg.php
  27. nyro/response_http_html.front.cfg.php
  28. nyro/response_http_html.front.fr.cfg.php
  29. my/response_http_html.cfg.php
  30. my/response_http_html.fr.cfg.php
  31. my/response_http_html.front.cfg.php
  32. my/response_http_html.front.fr.cfg.php
Bien sûr, ces fichiers ne sont utilisés que s'ils existent ! Et ceci avec n'importe quelle classe du framework.

Mais je dois créer un fichier pour chaque classe qui en a besoin ? Au début, c'était le cas oui. Mais je me suis aperçu que cela pouvoit devenir très vite long et fastidieux. Ce mécanisme existe toujours et est toujours utilisé car dans certains cas indispensable, mais il existe un autre moyen. En effet, la configuration de la classe nyro permet de modifier la configuration de n'importe quelle classe dans un seul et même fichier de configuration. Par exemple, on aurait pu définir les éléments montrés précédemment dans le fichier my/nyro.front.cfg.php de cette façon :
$cfg = array(
    'response_http_html'=>array(
        'meta'=>array(
            'title'=>'nyroDev, Analyst Developper Web (english) (PHP, jQuery)',
            'description'=>'Cédric Nirousset, nyroDev: Conception, Analysis and Development of websites (PHP, jQuery).',

        ),
    ),
'une_autre_classe'=>array(
'uneAutreConfig'=>'yeah'
),
);
Cette configuration est utilisé en dernier lieu pour créer la configuration de chaque classe.

Vous avez d'ailleurs remarqué la classe object ? Toutes les classes instanciables héritent de cette classe, ce qui permet une gestion centralisée et uniforme des configurations et de la création des objets.

Bon, voilà déjà pour la configuration.

Pour revenir sur les fonctionnalités du framework, voici une liste (sans doute non exhaustive) de ce que gère pour l'instant nyroFwk :
  • Programmation orientée objet
  • Configuration avancée et très souple des classes
  • Gestion des sites multilingues
  • Gestion des bases de données multilingues avec récupération automatique des données propre à la langue
  • Configuration de base de donénes multiples
  • Gestion des utilsiateurs et de leur connexion, vérifications des accès, etc...
  • Gestion des formulaires avancées et souples : validation, affichage, etc...
  • Manipulation des images simplement, avec souplesse et efficacement
  • Création de formulaires directement depuis la structure de la base de données (gestion des données liées et en relation)
  • Création de l'administration automatique
  • Minimisation en un seul fichier compressé des fichiers JavaScript et CSS nécessaire à la page
  • Application d'un maximum de règle d'optimisations données par Yahoo
  • Barre de débogage
  • Editeur WYSIWYG (tinyMce) très simplement intégrable
  • jQuery et jQuery UI intégré
  • Ajax ready : différents templates s'il s'agit d'une requêtes ajax
  • Extensibilité simple et accrue : tout peut être redéfini
  • etc...
Fiou, ça n'a pas été une mince affaire de rédiger tout ça... J'espère que ça vous donne déjà une meilleure idée de ce qu'est nyroFwk et que vous aurez envie d'en savoir plus...

nyrodev.com has a nice refresh

I was a long time since this one was on the boxes, it finally cames out: the new version of my website is online!

Aymeric aka Miho designed it; I think it's very clear and let a good place for the content with a great readability.

I developed it using my own framework which optimizes every to the server by compressing every HTML pages. It also merges and compresses CSS and JavaScript after removing all the comments and useless whitespaces. With that my website gains a A-grade with YSlow - only one F for not using CDN and one B for contents without cookies.

I also enjoyed make it accessible without reloading the page using AJAX and jQuery. I used jQuery address which works perferctly. And nyroModal is also in the party to show the references. Of course all pages are accessible without JavaScript for a better ranking.

In the same time I left phpMyVisites to use Google Analytics, using the manual tracker for Ajax pages.

Finally, I want to thnaks the following personns:

  • Miho for the design
  • My mother for the French corrections
  • Chonchon for the English corrections
  • Florian for the new logo

To celebrate this, I created a facebook group and I'm twitting again more often. Don't hesitate to join the group or follow me!

If you have any remarks, suggestions or anything else to say about the new wbesite, the comments are here for you!

nyrodev.com se refait une beauté

Elle traînait dans le cartons depuis plus d'un an, elle arrive enfin : la nouvelle version de mon site est enfin en ligne !

C'est Aymeric aka Miho qui a réalisé le graphisme que je trouve très clair et laissant bien la place pour le contenu avec une bonne lisibilité.

Je l'ai développé en utilisant mon propre framework qui optimise toutes les requêtes vers le serveur en compressant les pages HTML, mais aussi les CSS et les JavaScript. Ces derniers sont aussi fusionnés en une seule URL pour limiter au maximum le nombre de requêtes vers le serveur. Grâce à ça, le site obtient le grade A avec YSlow - un seul F pour ne pas utiliser un CDN, et un B pour les contenus sans cookies.

Je me suis aussi amusé à rendre tout le site accessible sans recharger de page en utilisant AJAX et jQuery. J'ai utilisé le plugin jQuery address qui fonctionne à la perfection. Enfin, nyroModal est aussi de la partie pour afficher les références. Bien sûr, l'ensemble du site reste accessible sans javaScript pour permettre un meilleur indexage.

J'en ai aussi profité pour quitter phpMyVisites pour intégrer Google Analytics, utilisant la tracker manuel lors des changements de pages avec Ajax.

Enfin, je tiens à remercier les personnes suivantes :

  • Miho pour le graphisme
  • Ma mère pour les corrections de français
  • Chonchon pour les corrections d'anglais
  • Florian pour le nouveau logo

Pour l'occasion, j'ai créé un groupe facebook et je me mets à twitter plus régulièrement. N'hésitez pas à rejoindre le groupe ou me suivre !

Si vous avez des remarques, suggestions ou n'importe quoi à dire sur le nouveau site, les commentaires sont là pour vous !

Internship Finished

That's it, my internship is over since last Friday.

Almost one year by Fluidesign to program, develop, integrate, learn.

I really progressed in JavaScript and Ajax Ajax with jQuery that I can't leave anymore. I also learnt many about HTML/CSS integration, thanks to PJ to whom I always asked his mind.

Anyway, it was one year of happiness with fabulous people. The last weeks looked like holidays for everybody (too bad, they're going to work on Monday...).

To not forget all the website I worked in, here is an alphabetical listing of them with a tweak description of what I've done.

You could think it's not a lot for one year. But as I said, It's Hospilaty took me a lot of time because it's really huge.

One more time, I'd like to thanks all the Fluidesign team who was really great during all my internship.

Now I still have 3 weeks in USA. A friend is coming on Monday and we'll travel for a roadtrip which will unforgettable. (Yes you probably got it, you'll probably have more posts with a lot of text and photos...)

Version française de ce billet

Stage terminé

Voilà, mon stage s'est terminé vendredi dernier.

Presqu'un an au total passé chez Fluidesign à programmer, développer, intégrer, apprendre.

J'ai beaucoup progresser en JavaScript et Ajax avec jQuery que je ne peux plus quitter. J'ai aussi beaucoup appris en intégration HTML/CSS grâce à PJ à qui je demandais toujours son avis.

Bref, un an de bonheur avec des gens fabuleux. Les dernières semaines avait un petit air de vacances pour tout le monde (je plains ceux qui reprennent le boulot lundi).

Pour ne pas oublier tous les sites sur lesquels j'ai travaillé, je vais les lister ici (par ordre alphabétique) avec une description de ce que j'ai fait dessus.

Alors oui, on peut se dire que ce n'est pas beaucoup pour un an de travail. Mais comme je l'ai dit, It's Hospilaty m'a pris énormément de temps car il est absolument immense.

Encore une fois, je profite de ce message pour remercier toute l'équipe de Fluidesign qui a été plus que géniale durant mon stage.

Maintenant, il me reste 3 semaines aux USA. Un ami arrive lundi et à nous l'aventure, pour un roadtrip qui s'annonce inoubliable. (oui, vous l'aurez compris, vous aurez surement encore des postes avec plein de textes et plein de photos...)

English Version of this post

nyroModal 1.1 release

2 weeks since my last English post, 1 month before my real new post (the last was only translation of older posts). During this time I was busy to translate these posts, busy at work in Fluidesign, busy to live in LA.

During the last days, I developed my first own jQuery plugin: nyroModal.

nyroModal

Why a new plugin of this kind when there is already too many?

4 answers:

  • There is no too much using jQuery, most of them use Prototype/Scriptaculous
  • Most of them aren't too customizable as expected
  • When you find a bug, it's difficult to contact the developer -who often ask some Paypal donations- or understand the code to fix it
  • Because it's still pleasant for his ego to realize the things by himself

My plugin provides all the features I saw in the differents plugins I tried. In bulk:

  • Ajax Request
  • Display an hidden DOM element
  • Image
  • Gallery
  • Form
  • Iframe

But I also added some stuff I don't believe see elsewhere, or not enough:

  • You can target the content inside an Ajax request or a form
  • Forms works with a file upload
  • Background color is modifiable dynamically
  • Display an error message if needed
  • Ability to resize from an Ajax Request

Moreover I took care about the ability to customize the modal, to allow everybody to change the way the elements are animated. There is alos many possible callbacks to done every JavaScript action tou need. Thus every animation function could be fully rewritten and everything is documented: all available settings and the full modal process to allow each developer to understand how it works et to do what ever he want. I probably create more callback than necessary but better more than not enough!

And yes, it's already the 1.1 version because I showed it to my Fluidesign colleagues and all told me the transition -especially for the gallery- didn't look so good. So I created 2 new animations callback the same evening to get round of that.

If you have any suggestions, bug, improvement idea or if you use it, don't hesitate to let a comment. I'll be glad to answer it.

PS : I know, I didn't search too far for the name...

Version française de ce billet

sortie de nyroModal 1.1

Bientôt un mois que je n'ai pas publié de billet en français. Occupé à traduire des billets en anglais, occupé à développer chez Fluidesign, occupé à vivre à Los Angeles.

Et puis ces derniers temps, je me suis aussi attelé à développer mon premier plugin jQuery : nyroModal.

nyroModal

Alors pourquoi un nouveau plugin de ce genre alors qu'il en existe déjà tant ?

4 réponses :

  • Il n'en existe pas tant que ça sous jQuery, la plupart étant sur Prototype/Scriptaculous
  • La plupart ne sont pas autant personnalisable qu'il ne le laisse entendre
  • Lorsqu'on trouve un bug, il est difficile de contacter le développeur (qui demande souvent un peu de Paypal) ou d'appréhender le code d'un autre pour le corriger
  • Parce qu'il est toujours plaisant pour son égo de réaliser les choses soi-même.

Mon plugin reprend donc l'ensemble des fonctionnalités que j'ai pu voir dans les différents plugins que j'ai testés. En vrac :

  • Requête Ajax
  • Affichage d'un élément du DOM caché
  • Image
  • Galerie
  • Formulaire
  • Iframe

Mais j'ai aussi ajoutés des choses que je ne crois pas avoir vu ailleurs, ou pas assez souvent :

  • Il est possible de cibler l'élément affiché au sein d'une requête Ajax ou d'un formulaire
  • Les formulaires fonctionnent même avec un upload de fichiers
  • La couleur de fond est paramétrable dynamiquement
  • Affichage d'un message d'erreur si besoin
  • Possibilté de modifier la taille de la modale depuis une requête Ajax

De plus, j'ai beaucoup prêté attention à la personnalisation, pour permettre à chacun de modifier la façon dont sont animés les éléments. Il y a aussi de nombreux callback possible pour effectuer toutes les actions JavaScript dont vous avez besoin. Ainsi, toutes les fonctions d'animations sont entièrement redéfinissable et tout est documenté : l'ensemble des paramètres disponibles et le processus complet de la modale pour permettre à toute personne de comprendre comment il fonctionne et d'en faire ce qu'il en veut. J'ai sans doute créer plus de callback que nécessaire, mais de cette façon tout est possible.

Et oui, on en est déjà à la version 1.1 puisque je l'ai montré à mes collègues de bureau et tous m'ont dit que les transitions (pour la gallerie notamment) n'était vraiment pas bon. J'ai donc créer deux nouvelles fonctions d'animation le soir même pour pallier à cela.

Si vous avez une suggestion, un bug, une idée d'amélioration ou si l'utiliser sur votre site, n'hésitez pas à laisser un commentaire. J'y répondrai avec plaisir.

PS : hé oui, je ne suis pas allé chercher bien loin pour le nom...

English version of this post