Le dernier billet J'ai 80 articles en stock à ce jour!

Tuto: Faire une application Facebook 3/3 0

juin22

Tutoriel

Facebook

Facebook

Pour cette troisième et dernière partie de ce tutoriel, nous allons écrire le mécanisme de l’application en question à savoir afficher une question aléatoire depuis un fichier XML et enregistrer la réponse par le biais d’une requéte AJAX dans la base de donnée MySQL.

Pour se faire nous allons déjà créer notre document XML qui contiendra les questions et faire ensuite un fichier qui servira de serveur pour nos requetes AJAX puis enfin styler le tout avec un peu de CSS.

Le langage XML

Le langage XML

Voici la structure de notre document XML qui contiendra les questions, gardez en tête que XML est un language de balisage non strict, ce qui signifie que c’est vous qui inventez les balises et leurs attributs.

< ?xml version="1.0" encoding="ISO-8859-1"?> 
<form>
	<question>
		<id>0</id>
		<txt>
			<fr>
				 Combien font 2+2?
			</fr>
		</txt>
		<txt_reponses>
			<fr>
				<reponse idr="0_1">Je trouve pas ma calculette...</reponse>
				<reponse idr="0_2">4</reponse>
				<reponse idr="0_3">Je m'en fout!</reponse>
			</fr>
		</txt_reponses>
	</question>
 
	<question>
		<id>1</id>
		<txt>
			<fr>
				 XML est il un language de balisage strict?
			</fr>
		</txt>
		<txt_reponses>
			<fr>
				<reponse idr="1_1">Pire tu meurs</reponse>
				<reponse idr="1_2">XM quoi???</reponse>
				<reponse idr="1_3">Je m'en fout!</reponse>
			</fr>
		</txt_reponses>
	</question>
 
</form>

Voici un exemple pour le fichier XML, chaque balises question contient une sous balise « id»  qui doit être incrémenter à chaque nouvelle questions, tout comme pour les reponses avec l’attribut « idr»  qui contient l’ID de la question suivi du numéro de la réponse pour s’y retrouver plus tard. J’ai entouré la question et les réponses d’une balise « fr»  pour vous montrer qu’il est possible de proposer les traductions directement dans le fichier XML ce qui évite d’atteindre les limites de la balise fb:intl qui est l’outil de traduction Facebook.

php_attitude

php_attitude

Notre fichier XML remplis passons maintenant au fichier qui répondra à nos requêtes AJAX. Pour commencer une fonction qui récupère une question aléatoire dans notre fichier XML et qui l’affiche à votre visiteur dès que ce dernier clique sur commencer.

< ?php
require_once 'inc/facebook.php'; // On commence par appeler l'API fb
require_once 'lib/db_connect.php'; // On se connecte à la bdd
// Et ici toutes vos classes
 
$appapikey = 'votre API once again';
$appsecret = 'Votre API secret once again';
$facebook = new Facebook($appapikey, $appsecret);
 
// Toutes les variables d'URL pour simplifier la maintenance de l'appli
$appname = 'Ici le nom de votre appli (URL)';
$fb_path = 'http://apps.facebook.com/';
$app_path = $fb_path.$appname.'/'; // Verifiez que le resultat mene bien vers votre appli
$callbackurl = 'Ici votre callback URL';
 
// Ces deux variables recupéreront l'ID et la langue de l'utilisateur dans la requete AJAX
$user_id = $_POST['fb_sig_user']; 
$lang = $_POST['fb_sig_locale']; 
 
// Par exemple avec ca notre appli gére le francais et l'anglais
if ($lang == 'fr_FR') {
	$l = 'fr';
} else {
	$l = 'en';
}
 
// Donner la premiere question, en vérifiant que l'ID de l'utilisateur soit bien numérique
if ((isset($_POST['start'])) && (isset($_POST['fbid'])) && (is_numeric($_POST['fbid']))) {
	$fbid = $_POST['fbid'];
	// On charge notre fichier XML et le transforme en objet avec SimpleXML
	$xml = simplexml_load_file('q.xml');	
	// On compte les questions
	$i = -1;
	foreach($xml->xpath('//question/id') as $id) {
		$i++;
	}	
	// On choisit une question aléatoire
	$id_next = mt_rand(0,$i);
	// On charge des variables avec les reponses et la question
	$question =  $xml->xpath('//question[id="'.$id_next.'"]/txt/'.$l.'');
	$rep = $xml->xpath('//question[id="'.$id_next.'"]/txt_reponses/'.$l.'');
	// on renvoi tout ca
	echo '
	<div class="reponse" id="reponse">
		<!-- Ce div sert à afficher un chargement entre 2 question -->
		<div id="loader" style="display: none;">
			<h2><fb :intl>Chargement en cours...</fb></h2>
		</div>	
		<div id="question_reponse">
			<h1>'.$question_.'</h1>	
			<br />
	';
	// Pour chaque réponse on fait un bouton avec notre futur fonction Ajax
	// Il contient l'ID de la prochaine question, l'id de la reponse cliqué
	// et l'id de l'utilisateur
	foreach($rep[0] as $reponse) {
		echo '<button onclick="next_question(\'questionnaire_wrap\',\''.$id_next.'\',\''.$reponse->attributes()->idr.'\',\''.$fbid.'\'); return false;">'.$reponse.'</button>
		&nbsp;&nbsp;';
	}
	echo '
	</div>	
	';
}
?>
</div>

Voila ce bout de code des plus commenté prend place dans le dossier lib, dans un fichier que l’on nommera server.php par exemple. Elle se chargera d’envoyer la première question et de mettre notre appli sur les rails. Voici maintenant un autre bout de code qui vous permettra d’enregistrer la réponse et de donner la question suivante.

// Recuperer la reponse et donné la question suivante
// On verifie que la requte AJAX contiens tout ce dont on a besoin
if ((isset($_POST['id_question'])) && (isset($_POST['reponse'])) && (isset($_POST['fbid'])) && (is_numeric($_POST['fbid'])) && (is_numeric($_POST['id_question']))) {
	// On charge des variables
	$fbid = $_POST['fbid'];
	$last_question = $_POST['id_question'];
	$last_reponse = mysql_real_escape_string($_POST['reponse']);
	// On enregistre dans la bdd
	$requete = 	("INSERT INTO `form`
				(`fb_id`, `victime_id`, `question_id`, `reponse`, `timestamp`)
				VALUES ('$user_id', '$fbid', '$last_question', '$last_reponse','$timestamp')");
	$send = mysql_query($requete,$connection) OR DIE(mysql_error());	
	// on charge notre fichier XML en objet
	$xml = simplexml_load_file('q.xml');
	// compter le nombre de question
	$i = -1;
	foreach($xml->xpath('//question/id') as $id) {
		$i++;
	}	
	$id_next =  $last_question + 1;
	// verifier que la question suivante existe sinon on repart a zero
	if ($id_next > $i) {
		$id_next = 0;
	}
	$question =  $xml->xpath('//question[id="'.$id_next.'"]/txt/'.$l.'');
	$rep = $xml->xpath('//question[id="'.$id_next.'"]/txt_reponses/'.$l.'');
	// et on renvoi la question suivante
	echo '
	<div class="reponse" id="reponse">
		<!-- Ce div sert à afficher un chargement entre 2 question -->
		<div id="loader" style="display: none;">
			<h2><fb :intl>Chargement en cours...</fb></h2>
		</div>	
		<div id="question_reponse">
			<h1>'.$question_.'</h1>	
			<br />
	';
	// Pour chaque réponse on fait un bouton pour notre futur fonction Ajax
	// Il contient l'ID de la prochaine question, l'id de la reponse cliqué
	// et l'id de l'utilisateur
	foreach($rep[0] as $reponse) {
		echo '<button onclick="next_question(\'questionnaire_wrap\',\''.$id_next.'\',\''.$reponse->attributes()->idr.'\',\''.$fbid.'\'); return false;">'.$reponse.'</button>
		&nbsp;&nbsp;';
	}
	echo '
	</div>	
	';
}
</div>

Voila pour notre fichier server.php, on peut imaginer des envois de notification ou feed dans les réponses qu’il retourne, ce n’est évidemment qu’un exemple à vous de le faire évoluer. Il ne nous reste plus qu’a créer notre fonction AJAX en FBJS (le javascript Facebook) pour nous relier avec notre fichier server.php et styler le tout avec un peu de CSS.

Ajax

Ajax

Voici le contenu de notre fichier index.php qui est à la racine de notre application.
< ?php
// On active le login pour récupérer l'id de l'utilisateur
$login = true;
// On affiche le menu de notre appli
$tabs = true;
// On appel notre header.php
require_once('header.php');
 
// La balise FBML fb:name permet de récupérer via l'id le nom et le prénom de l'utilisateur
echo '<h1>Bienvenue <fb :name uid="'.$user_id.'" />!!
<div id="load_prant">	
	<!-- Ce div sert à afficher un chargement entre 2 question -->
	<div id="loader" style="display: none;">
		<h2><fb :intl>Chargement en cours...</fb></h2>
	</div>	
</div>	
<div id="questionnaire_wrap">
	<div class="reponse" id="reponse">
		<a href="#" onclick="start_question(\'questionnaire_wrap\',\'ok\',\''.$fbid.'\'); return false;">Commencer le questionnaire</a>	
	</div>
</div>	
<!-- Ceci est une variable FBJS vide pour vider le contenu dun div lors des chargements -->
<fb :js-string var="empty"></fb> 
';
// Au clique de ce lien on commence le questionnaire $fbid contient l'ID utilisateur
// voir le header.php pour plus d'infos
 
// Et enfin nos 2 fonctions Ajax
?>
<script type="text/javascript">
<!--
function start_question(div,start,fbid) {
	// On affiche le message de chargement
	document.getElementById('loader').setStyle({display: 'block'});
	// On vide le contenu de #questionnaire_wrap
	document.getElementById('questionnaire_wrap').setInnerFBML(empty); 
	// On initialise la requete AJAX
	var ajax = new Ajax(); 
	// La reponse sera en FBML (le html fb) mais on aurai pu l'avoir en Json
	ajax.responseType = Ajax.FBML; 
	// Une fois la requete envoyé et la réponse de server.php recu
	ajax.ondone = function(data) { 
		var loader = document.getElementById('loader'); 
		// On supprime les noeuds enfants de #load_parent dans l'arbre DOM
		// vu qu'il sera renvoyé par le server.php
		document.getElementById('load_parent').removeChild(loader);
		// On affiche le resultat dans la variable div qui contient l'id du div questionnaire_wrap
		document.getElementById(div).setInnerFBML(data); 		
	} 
	// Laisser à 1 pour envoyer avec la requete la langue et l'ID utilisateur
	// Plus pleins d'autres infos
	ajax.requireLogin = 1;
	// On envoi les donnés
	// start vaut "true" il sera verifier en php avec if ($_POST['start']) {...}
	// Et fbid contient l'ID utilisateur recuperer dans header.php
	var params={"start":true,"fbid":fbid}; 
	// Verifier bien le chemin vers votre server.php
	ajax.post('<?php echo $callbackurl; ?>lib/server.php',params); 
}
 
function next_question(div,idQuestion,reponse,fbid) {
	// On affiche le message de chargement
	document.getElementById('loader').setStyle({display: 'block'});
	// On vide le contenu de #questionnaire_wrap
	document.getElementById('questionnaire_wrap').setInnerFBML(empty); 
	var ajax = new Ajax(); 
	ajax.responseType = Ajax.FBML; 
	ajax.ondone = function(data) { 
		var reponse = document.getElementById('reponse'); 
		reponse.setInnerFBML
		// On affiche les donnés
		document.getElementById(div).setInnerFBML(data);
		// On cache le loader 
		document.getElementById('loader').setStyle({display: 'none'});
	} 
	ajax.requireLogin = 1;
	var params={"id_question":idQuestion,"reponse":reponse,"fbid":fbid};
	ajax.post('< ?php echo $callbackurl; ?>lib/server.php',params); 
}
--> 
</script>
 
< ?php
// On appel notre footer.php
require_once('footer.php');
?>

Voila l’application est désormais préte il ne reste plus qu’a la styler un peu avec du CSS.

Cascading style sheet

Cascading style sheet

Pour utiliser CSS dans vos applications Facebook, il y a de nombreuses techniques, je vais vous en montrer une simple. Elle consiste à créer un fichier style.php dans votre dossier lib et de l’inclure dans vos librairies du fichier header.php, voici le contenu de ce fichier.

< ?php
function get_style() {
	echo '<style type="text/css">
	/* ICI votre code CSS */
	';
}
?>

Après l’avoir inclus dans votre header.php, n’oubliez d’exécuter la fonction avec « get_style();» 

Vous voila prêt à écrire vos propres applications Facebook, gardez en tête d’alléger au maximum vos applications car pendant les montés en charges Facebook a du mal à suivre et surtout de les sécuriser. Le succès d’une application réside dans la viralité de cette dernière c’est à dire sa capacité à se rendre indispensable pour les utilisateurs et à se répandre sur les profils des utilisateurs de Facebook. L’API facebook regorge de fonctions pour vous faciliter le travail et le wiki est une mine d’informations à ne surtout pas négliger.

Je met à votre disposition la source de cet fabuleuse application qui ne sert pas à grand chose si ce n’est de vous faire comprendre le fonctionnement d’une application Facebook.

Télèchargez la source de l'appli

Télèchargez la source de l'appli


La chronique du libre 07/06/09 0

juin7

Actu

Jolicloud alpha

Jolicloud alpha

Jolicloud est un OS basé sur Linux Debian et Ubuntu. Il affiche une interface des plus léché, la capacité de gérer une machine tactile, et toutes les innovations que l’on retrouve dans toutes les distros GNU/Linux récentes.

Pour le moment en version Alpha ce prometteur OS est à surveillez de très prés. Son interface est une d’une simplicité à toute épreuve et son système de gestion des paquets (Deb) est lui aussi des plus éprouvés.

Launchpad

Launchpad

Launchpad est une plateforme de développement et de support de projets développé par Canonical, C’est la même solution qui gère les évolutions et le suivie des bug de la distribution Linux Ubuntu. Ainsi comme l’avait promis Mark Shuttleworth le code source de cette application web sera rendu open source.

Une sélection d’applications libres que vous devriez connaitre!

20 plugins pour jQuery 0

juin3

Ressources

jquery-plotting-plugin

jquery-plotting-plugin

Ce plugin vous permet aisément de générer des courbes ou encore des barres avec affichage de tooltip et de nombreuses options pour personnaliser l’affichage.
En savoir plus sur la page officielle du projet: http://www.jqplot.com/

Validation des formulaires

Validation des formulaires

Et voici un plugin pour enrichir vos formulaires d’inscription ou de contact. Il vous permettra d’optimiser l’expérience utilisateur mais aussi de valider en temps réel les saisies de l’utilisateur. Ce plugin nous viens de Position Absolute: http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/.

Arborescence en JS

Arborescence en JS

Pour afficher vos arborescences facilement et de façon sympa, ce plugin jQuery parse un fichier Json, XML ou encore des éléments de l’arbre DOM pour créer une arborescence. Site officiel: http://www.jstree.com/

Des menus sympas

Des menus sympas

Pour votre inspiration voici 36 liens sur des tutos pour créer des menus originaux et qui se dégrade correctement (dans l’ensemble) le tout en utilisant le framework jQuery. Vus sur 1stwebdesigner.com: http://www.1stwebdesigner.com/resources/36-eye-catching-jquery-navigation-menus/

Jmodal

Jmodal

Et pour terminer voici une sélection de 15 plugins jQuery parmis les plus pratiques, à noter celui qui vous permet de réaliser des fenêtres modales comme sur Facebook pour enrichir vos interfaces utilisateurs. Vu sur Dreamcss: http://www.dreamcss.com/2009/05/15-awesome-jquery-plug-in.html

A quoi ressemble Linux en 2009? 0

mai29

Dossier

GNU/Linux

GNU/Linux

On parle de plus en plus du logiciel libre, des licences GNU et de Linux ces derniers temps, mais pourquoi utilise t’on ces technologies libres au bureau, à la maison, dans les centres de donnée ou encore dans des lieux publics? A quoi ressemble Linux?

Pour le commun des mortels, Linux c’est un système d’exploitation compliqué et réservé qu’a une certaine « élite»  d’utilisateurs. La réalité est tout autres, pour utiliser une distribution Linux doté d’une interface graphique tel que Fedora, Debian, Mandriva ou encore Ubuntu, il ne faut strictement connaitre aucune ligne de commande, mais simplement savoir cliqué sur des icônes et des boutons, et oui ce n’est pas plus compliqué que ça.

Pour commencer voici ce à quoi ressemble Linux en 2009.

Un bureau en 3d

Un bureau en 3d

workspaces

workspaces

Le mode expose

Le mode expose

Pour comprendre comment fonctionne Linux, il faut tout d’abord penser simple. En effet lorsque vous avez un besoin, vous trouverez toujours un programme qui convient, sous Linux un programme est appelé un paquet. Ces paquets vous les trouvez dans des dépôts. Pourquoi un tel fonctionnement? C’est simple cela permet de corriger et de maintenir les programmes plus simplement et surtout c’est sécurisé, en effet sous windows vous téléchargez tout et n’importe quoi en prenant un programme, car il est facile de packagé un logiciel avec d’autres logiciels malveillants ou espion. Les logiciels qui se trouvent dans les dépôts fonctionnent, sont souvent mis à jour et sont surtout vérifiés.

Lanceur d'application

Lanceur d'application

Pour lancer une application, vous trouverez un menu de lancement des programmes trié par catégorie comme partout ailleurs, mais vous pouvez aussi utiliser une dock (la barre comme sous Mac OS ou encore le raccourci alt+f2 qui vous permettra de lancer une application en tapant ses premières lettres.

Linux propose de nombreuses innovations et de nombreux avantages pour n’importe quel type d’utilisateur. Je suis surpris tout les jours par sa souplesse d’installation et d’utilisation, connecter un ordinateur sous Linux à un réseau, il trouvera directement tout les partages de fichier MacOS et Windows. Ouvrez votre lecteur de musique vous trouverez toute la musique partagée sur le réseau. La communication entre machine n’a jamais étè aussi simple.

TSclient

TSclient

Pour se connecter et administré des machines autres que Linux sur un réseau ou internet il existe de nombreux outils comme « tsclient»  qui vous permet de vous connecter à une machine sous Windows via le protocole Microsoft Terminal server.

Gwibber

Gwibber

Les distributions Linux récentes sont sociables, de nombreux outils vous permettent de suivre et d’interagir avec vos comptes Facebook, Twitter ou autres. Ouvrez un client de messagerie tel que Pidgin et vous pourrez communiqué en direct avec vos amis sur Facebook très simplement.

Pour conclure, Linux représente beaucoup d’avantages pour les utilisateurs lambda, les développeurs et certains professionnels. Cependant gardez en tête que certains logiciels propriétaires comme l’environnement de développement Flash ou encore le lecteur de musique Itunes ne fonctionne pas sous Linux on trouve d’excellentes alternatives et c’est ça la force de Linux. Soumettez un bug, il sera corrigé très rapidement, dans une des nombreuses mises à jour quotidienne. Une faille de sécurité est trouvé, elle est corrigé dans les heures qui suivent. Linux repose sur une fidèle communauté d’utilisateurs qui aiment et font évoluer le logiciel libre et ce système d’exploitation au quotidien pour atteindre la perfection.

Quelques liens vers les principales distributions qui vous permettent de tester en live (sans changement sur votre ordinateur) Linux:

Ubuntu: La distribution GNU/Linux la plus célèbre, elle est basé sur Debian.

Fedora: Une autres excellente distribution GNU/Linux

Debian: La plus robuste à mon sens

Mandriva: La plus « user friendly»  mais reste payante dans sa version complète.

Cette liste est très loin d’être exhaustive, vous pouvez trouver énormément d’autres distributions GNU/Linux. Pour en savoir plus, consultez l’onglet vidéo pour voir tout ça à l’action!

video

Voici à quoi ressemble GNU/Linux en 2009, ici n’est présenté que quelques aspects de Linux sous l’environnement graphique Gnome, ce n’est pas le seul loin de là, c’est simplement celui que j’utilise.








Tuto: Faire une application Facebook 2/3 1

mai24

Tutoriel

Attention au bigint (20) pour stocker l'identifiant Facebook

Attention au bigint (20) pour stocker l'identifiant Facebook

Il vous faudra un serveur de base de donnée type MySQL, pour s’y connecter nous allons faire une fonction adéquate ainsi que pour récupérer des données relative à un ou plusieurs utilisateurs.

< ?php
$bdd="fb_app_test";
 
$connection = mysql_connect("localhost", $bdd,"motdepasse");
// test la connection
if ( ! $connection )
  die ("connection impossible");
  // Connecte la base
  mysql_select_db($bdd) OR DIE('Erreur de la base de donnée');
?>

Une fois connecté on récupère facilement des données depuis une fonction de ce type

// ******** VERIFICATION **********
// verifier que le user existe
function is_user($user_id, $connection) {
	$requete= ("SELECT COUNT(*) NBR_ENTREE FROM `users`
					WHERE `fb_id`='".$user_id."'");
	$send = mysql_query($requete,$connection) OR DIE('Erreur de la requête MySQL');
	$row = mysql_fetch_object($send);
	$nb = $row->NBR_ENTREE;
	if ($nb > 0) {
		$isuser = true;
	} else {
		$isuser = false;
	}
	return $isuser;
}
// Recuperer plusieurs champs
// $data est un array qui contient les valeur a recup
// $table contient la table à interroger
function get_datas($user_id, $connection, $datas, $table, $where, $where_this) {
	$liste = implode(',', $datas);
	$requete = 	("SELECT $liste
				FROM `$table`
				WHERE `$where`='$where_this'") ;
	$send = mysql_query($requete,$connection) OR DIE(mysql_error());	
	$data =  mysql_fetch_array($send);
	return $data;
}

Il ne reste plus qu’a se faire une petite batterie de fonctions simples et utiles, une classe. Toutes ces librairies devront êtres inclus dans le header.php avec la fonction require_once();.

Le wiki FB

Le wiki FB

Pour découvrir l’API Facebook plus en détail je ne peut que vous conseiller de découvrir le wiki officiel et ses forums. Enfin pour gérer vos applis ca se passe sur la page des developpeurs Facebook.

Pour utliser le FBML (Fb markup Language), je vais vous présenter les fonctionnalités les plus utilisés, mais vous trouverez tout dans le wiki et le forum.

Pour se familiariser avec l’API, je vais vous présenter les fonctions les plus utilisés:

// Envoyer une notification
try {
	$facebook->api_client->notifications_send($cible, $text, $mode);	
} catch (Exception $e) {
	error_log($e->getMessage());
}
// Envoyer un feed (sur le profile de l'utilisateur
try {	
	// X est en train de repondre
	$template_bundle_id = XXXXXXXXX;
	$tokens = array( 'actor'=>$user_id);
	//There is no target for the story in this example, but if there was, 
	//$target_ids would be an array of user ids 
	$target_ids = array(); 
	$body_general = ''; 
	$facebook->api_client->feed_publishUserAction( $template_bundle_id,
													json_encode($tokens),
													implode(',', $target_ids),
													$body_general);
}
catch (Exception $e) {
	error_log($e->getMessage());
}

A noter qu’il faut toujours employé la structure try{} et catch{} lorsque l’on appel l’API Facebook afin de ne pas afficher d’erreur en cas de problèmes et surtout pour analyser et éventuellement stocker dans des logs les erreurs rencontrés. Pour construire des feed, tout se passe sur cette page dédiée de la documentation.

API REST FB

API REST FB

Nous venons de rentrer dans le vif du sujet, pour la troisième et dernière partie de ce tutoriel, nous construirons une page pour que vos futurs utilisateurs puissent partager l’application. Nous allons aussi utiliser XML pour stocker et rapatrier des données, apprendre à utiliser les requêtes Ajax et styler notre appli avec un peu de CSS, le tout dans une archive à télècharger.