Dans mon dernier article, nous avions passé en revue les éléments nécessaires à notre concept de ‘tag cloud’. Cette semaine, on replonge dans facebooker.
Au menu, mise en place d’une profile box et du Publisher qui va avec.
A l’image de Rails qui propose ActionMailer, une interface claire pour l’envoi d’emails, facebooker propose l’interface Publisher.
Dans ce Publisher, on peut définir des méthodes pour envoyer des notifications, des feeds, ou du contenu à une profile box.
Commençons par générer notre publisher.
1 script/generate facebook_publisher facebook
Nous voilà maintenant avec un Publisher vide et les migrations qui vont avec, migrations qui nous seront utiles lorsque nous voudrons publier des feeds.
Commençons simplement par ajouter le helper de notre application à notre publisher.
1 class FacebookPublisher < Facebooker::Rails::Publisher 2 helper :application 3 end
Ajoutons ensuite une méthode profile_update.
1 def profile_update(user) 2 send_as :profile 3 recipients user 4 profile "Testing..." 5 end
Il suffit alors d’aller ajouter la ligne suivante dans le bas du layout de l’application
1 <%= fb_add_profile_section %>
Qui a pour effet d’ajouter un bouton ‘Add to profile’. Lorsqu’on clique dessus, on voit apparaître une boîte de dialogue nous demandant notre accord.

Et voilà ce que ça donne dans l’onglet ‘Boîtes’ !

Comme vous le savez peut-être déjà, une profile box peut se placer à plusieurs endroits et avoir plusieurs tailles. Un onglet ‘Boîtes’ a été ajouté dans le nouveau profil, qui permet de stocker des ‘profile boxes’ de deux largeurs, 380 pixels pour les larges et 180 pixels pour les petites.
Mais cette boîte peut aussi être ajoutée à votre wall. La taille est, ici, encore différente, 250 pixels de hauteur maximum, la largeur étant également de 180 pixels.
Les tags FBML suivants permettent de définir un contenu spécifique pour chaque largeur.
1 <fb:wide> 2 <fb:narrow>
Dans notre exemple, nous ne différencierons pas les différentes tailles, étant donné que ce que nous devons afficher prend peu de place…
Nous pourrions définir le contenu de notre profile box directement après le mot clé “profile” dans notre méthode profile_update, mais un partiel semble plus approprié.
1 def profile_update(user) 2 send_as :profile 3 recipients user 4 @friend = Friend.find_by_facebook_id user.id 5 profile render :partial => 'profile.fbml.erb', :locals => {:user => @friend} 6 end
Nous envoyons au partiel les informations concernant l’utilisateur. De cette manière on pourra récupérer les tags dudit utilisateur dans le partiel.
Dans le dossier apps/views/facebook_publisher/ fraîchement créé, nous ajoutons notre partiel _profile.fbml.erb :
1 <% if user.tag_list.empty? %> 2 <p>No tags yet...</p> 3 <% else %> 4 <% tag_cloud user.tag_counts(:order => "name"), 5 %w(css1 css2 css3 css4) do |tag, css_class| %> 6 <span class=<%= css_class %>><%= tag.name %></span> 7 <% end %> 8 <% end %>
Les pages de profils sont mises en cache par les serveurs de Facebook, il est donc nécessaire de forcer la mise à jour de contenu dans une profile box, d’où l’importance du Publisher. Nous devons donc, à un instant dans le processus d’utilisation de notre application, faire un “push” du contenu.
Il suffit alors de faire l’appel suivant lorsque quelqu’un vous a taggé ou lorsque vous taggez quelqu’un, en prenant soin bien sûr de donner en paramètre le bon utilisateur. Pour les besoins de l’article et pour voir un résultat directement nous allons placer cet appel dans notre contrôleur Friends, dans l’action show par exemple. Je rappelle que ce n’est que pour les besoins de cet article, dans ce cas la profile box ne sera mise à jour que lorsque l’utilisateur consultera son tag cloud dans l’application, ce qui n’a pas grand intérêt…
1 FacebookPublisher.deliver_profile_update(@facebook_session.user)
Ce qui donne sur notre profil :

Et voilà le travail ! Dans le prochain article, nous nous attarderons sur les feeds.