NyroBlog
Banniere NyroBlog
Image de Nyro - ?
« octobre 2008
lunmarmerjeuvensamdim
12345
6789101112
13141516171819
20212223242526
2728293031

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

Chips, Twix, and Mix

  • jQuery UI came out in final version and with it, we've got also the ThemeRoller which allow you to create and preview your own theme dymacally online. All the demo aren't yet available, but you can already have a preview of the animations here. My preferred is explode in 36 pieces
  • TinyMCE cam out in version 3.1.0 today. Many bugs fixed.
  • Symfony came out in version 1.1 RC2. Then some posts followed in their blog (and I'm sure others are on their way) regarding the new functionalities of this version
  • phpMyAdmin came out in version 2.11-7-rc1
  • MySQL wrote a post about Falcon (the next engine of MySQL 6) and its particularities by principally comparing to InnoDB. A quick look on this post could be a great idea
  • the iPhone came out in version 2. Wow, it's now coming with 3G, what a new thing! (I have a 2 year old phone which do it...) I personally wait for the first Android which could came at the beginning of the first quarter
  • Google Translate was refreshed last week. Note the new option to choose the origin language: "Detect automatic". I also like the new functionalities like the dictionary and the translated search!
  • All the session of the last Google IO are available here. Take a time to saw some of them ;)

Oh, I almost forgot. Today Firefox 3 came out and a world record is on the road! Go download it!

You can follow the number in real time (wait a little bit before the numbers start to animate) More than 4 millions and an half at this time!

Regarding the sport, today wasn't very cheerful (at least, from my point of view):

  • The French was miserably eliminated in the Euro. Goodbye Domenech.
  • The Lakers failed at the 6th game by loosing with 40 points! A sieve instead of defense and so many shoots missed. The Celtics played very well and was really the best. Kobe said: "The second place is the first place of the loosers..."

Version française de ce billet

Chips, Twix et Mix

  • jQuery UI est sortie en version finale et avec lui et aussi arrivé le ThemeRoller qui vous permet de créer et prévisualiser vos thèmes en ligne dynamiquement. Toutes les démos ne sont pas encore dispo, mais vous avez déjà un aperçu de toutes les animations ici. Ma préférée est le explode in 36 pieces
  • TinyMCE est sorti en version 3.1.0 aujourd'hui. Tout plein de bugs corrigés.
  • Symfony a sorti la RC2 de sa version 1.1. Ont suivi plusieurs billets sur le blog (et d'autres sont en chemin je pense) sur les nouveux éléments de cette version
  • phpMyAdmin est sorti en version 2.11-7-rc1
  • MySQL a édité un billet concernant Falcon (le prochain moteur de MySQL 6) et ses particularité, en le comparant à InnoDB principalement. Un petit coup d'oeil sur ce billet ne vous fera pas de mal
  • l'iPhone est sorti en version 2. Wahou, l'iPhone possède la 3G maintenant, quelle nouveauté. (j'ai quand même un téléphone qui fait ça depuis plus de 2 ans...) Moi j'attends le 1er Android, qui devrait arriver au début du 4ème semestre
  • Google Translate s'est payé un rafraîchissement la semaine dernière. A noter la nouvelle option pour choisir la langue d'origine : "Sélection automatique". On apprécie aussi les nouvelles fonctionnalité de dictionnaire et de recherche traduite !
  • Toutes les conférences du dernier Google IO sont disponible ici. Prenez le temps d'en regarder quelques une ;)

Ah, et j'ai failli oublier, aujourd'hui, Firefox 3 est sorti et un record du monde est en route ! Allez donc le télécharger !

Vous pouvez suivre les chiffres en temps réel (attendez un peu avant que les chiffres commencent à s'animer...) Plus de 100 000 téléchargement pour la France à l'heure où j'écris, et plus de 4 millions et demi au total !

Au niveau sportif, cette journée n'a pas été très joyeuse (enfin, de mon point de vue) :

  • La France qui est lamentablement éliminée de l'Euro. Au revoir Domenech.
  • Les Lakers qui échouent au 6ème match, en perdant avec 40 points de retard ! Une passoire comme défense et énormément de shoot manquées. Les Celtics ont très bien joués et étaient tout à fait supérieur. Kobe a dit : "La 2ème place, c'est la 1ère place des loosers..."

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

Howto update a website to reload the page through Ajax

I deployed in a website an Ajax reload for every pages. This website use a small audio player and the sound was stopped each time a new page was requested. That wasn't so graceful. The result now is exactly the same website reloading the pages through Ajax, without changing accessibility: I didn't modify ehe HTML source.

I did it quickly bu using jQuery. As this method could be useful for others, I will describe step by step how I made it.
The website which I worked on was pretty small: Amandine Café. Nothing better to train himself in a small example and then apply it in big projects

Current Website Analysis

The first thing to do is to navigate in the whole website to deduct the fixed zone and dynamic zone to reload. You have to identify which links will reload which zones, and what will be happen regarding the reloaded page. For instance you have to worry about the possible javascript control which could be a problem. Write down them and we'll take care of that at the end.
This part was pretty fast for me as the website don't use sub navigation and contains only 5 pages. I found 2 zones delimited by 3 div identified with the id header, page, and footer. Only the div#page vary regarding the pages. That will be only this content that I will update with Ajax.

PHP Side Preparation

Before dealing with the javascript code, we'll update the PHP code of our pages. When an Ajax load is made, we won't reload the full page, but only the content to update. For more simplicity and flexibility, we'll use the same URL than the real links. That's mean we have to be able to provide only the requested content in PHP, without the head page, or the fixed div. If you don't want –can't– do that, take a look to the little bonus at the bottom of this post...
The easiest way to do that is to put the fix part in separate files, named randomly header.php and footer.php. These files will be include in every pages; that's may already the case, using the include function. The thing is now to don't show these parts when the request is an Ajax request. Pretty easy, we'll write a PHP function: isAjax. The file includes will occur only if isAjax is false. In others words:
if (!isAjax())
    inlcude('header.php');

The isAjax function is, as you can see, very very hard:
function isAjax() {
    return array_key_exists('HTTP_X_REQUESTED_WITH', $_SERVER);
}
Actually jQuery –also Prototype, I don't know about the others– add a HTTP_X_REQUESTED_WITH element in the request that you can retrieve in the $_SERVER global variable.
We're done with the PHP preparation pages, which are now able to provide light version of your pages especially for the Ajax request.

Javascript Integration

We're moving now on the real Ajax request programmation. To keep the website totally accessible, which will works exactly in the same way without Javascript, We won't modify any current HTML sources. We'll just include jQuery in all the pages and one other javascript file containing the upcoming code.
The script schema will be:
  1. On the page load, intercept all links pointed to .php pages
  2. Add an onclick function to make the Ajax request and stop the page change
  3. On the click, call the page through Ajax with the same URL and then integrate the result where we want.
  4. Stop the click propagation
With jQuery, we're writing that very simply:
$(function() {
    $('a[href*=.php]').click(function() {
       $('#page').load(this.href);
return false;
    });
});
Very short, isn't it?
Of course this code won't work perfectly in every case. In my example I have to update the body id according to the requested page; that's mean the navigation bar link will going brown as expected by the graphic designer. To do so we can use the third parameter of the load function which will be called once the Ajax load is done. Here is how looks like my function:
$(function() {
    $('a[href*=.php]').click(function() {
        $('#page').load(this.href, null, function() {
        $('body').attr('id', this.href.substring(this.href.indexOf('.')));
        });
return false;
    });
});
If you read the code in the live site, that's not at all like that because I occured other problems.

Little Bonus

If you can't–don't want– deploy the PHP cutting for the Ajax request, don't stop right now! Firstly it could be possible to reload the whole page. This solution will be very sad and you'll probably occurs many others problems.
jQuery will help. Indeed, in the URL provided to the load function, you can specifiy a HTML selector to filter the result and show only the part you want to.
In my example the call could become simply:
$('#page').load(this.href+' #page');

I dissuade to use this technique as that's mean you will reload the whole page. So we loose the Ajax utility to reduce data transfer between clients and server.

If it's not that simple?

Give proof of imagination!
As I already thought about this question, I'll give you some example soon. This post is yet consistent and you can start to enjoy. Finally I hope you won't wait me to do that... Or if you have a website where do you want deploy this kind of solution, let me know and I will use it as my example.

Express Yourself!

How did you find this post? Interesting, boring, totally useless, can do better?
Do you have some questions? Suggestions?
Did you read some English mistakes?
Use the comments!

Version française de ce billet