
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Waanser &#187; PHP</title>
	<atom:link href="http://www.waanser.com/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.waanser.com</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Wed, 07 Jul 2010 21:54:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Web-Service en SOAP avec php</title>
		<link>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html</link>
		<comments>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 20:10:23 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>
		<category><![CDATA[WEB 2.0]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2346</guid>
		<description><![CDATA[Dans cet article, nous allons apprendre à faire notre premier web-service SOAP en 15 minutes top chrono ! Pour suivre, il est indispensable d&#8217;utiliser eclipse, car celui-ci possède un mode graphique pour la création de web-service qui va nous faciliter la vie. Le fonctionnement Avant toutes choses, je vais vous expliquer rapidement le fonctionnement d&#8217;un [...]]]></description>
			<content:encoded><![CDATA[<p>Dans cet article, nous allons apprendre à faire notre premier web-service SOAP en 15 minutes top chrono !</p>
<p>Pour suivre, il est indispensable d&#8217;utiliser eclipse, car celui-ci possède un mode graphique pour la création de web-service qui va nous faciliter la vie.</p>
<h2>Le fonctionnement</h2>
<hr/>
 Avant toutes choses, je vais vous expliquer rapidement le fonctionnement d&#8217;un Web-Service.</p>
<p>Vous savez certainement qu&#8217;un <span style="color:green"> Web-Service est un programme qui permet la communication et l&#8217;échange de données entre des applications et des systèmes totalement différents.</span><br/> <br/>Pour que le Web-Service puisse communiquer avec n&#8217;importe quels systèmes, il faut utiliser un même format de données.  Pour nous, ça sera le <span style="color:blue"> <strong>SOAP</strong></span>(c&#8217;est un protocole procédural basé sur du XML). Dans ce format, il faut aussi bien définir les données qui seront reçues et envoyées par le Web-Service.<br/><br/> Ne vous inquiétez pas si cela vous paraît trop abstrait, on va tout expliquer avec un exemple. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
Par exemple grâce à Web-Service, on pourrait faire communiquer une application java d&#8217;un téléphone portable avec une application en php. (ça fait rêver &#8230; <img src='http://www.waanser.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</p>
<p>Voici une petite illustration du fonctionnement de ce Web-Service :<br />
<br/><br />
<strong>Première étape : </strong><br />
 L&#8217;application java va faire appel au web-service en envoyant un message <strong>WSDL </strong>(en SOAP).<br />
<br/><br />
<a href="http://media.waanser.com/2009/11/etape1.jpg"><img src="http://media.waanser.com/2009/11/etape1.jpg" alt="etape1" title="etape1" width="718" height="196" class="alignnone size-full wp-image-2351" /></a></p>
<hr/>
<strong>Deuxième étape : </strong><br />
Le serveur de Web-Service reçoit la demande, effectue un traitement en fonction de celui-ci et renvoie la réponse dans un format <strong>WSDL</strong>.<br />
<br/><br/></p>
<p><a href="http://media.waanser.com/2009/12/etape2.jpg"><img src="http://media.waanser.com/2009/11/etape2.jpg" alt="SOAP PHP" title="etape2" width="680" height="175" class="size-full wp-image-2354" /></a><br />
<br/><br />
Qui avait dit que c&#8217;était compliqué les web-service <img src='http://www.waanser.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ?<br />
<br/><br />
Fini la théorie passons à la pratique, nous allons faire un Web-Service qui nous donne le jour en fonction de la date que l&#8217;on envoie.</p>
<h2>Création du wsdl</h2>
<hr/>
Par exemple, on envoie le 13/11/2009 et le web-service nous renverra vendredi. Si on fait un schéma, cela va donner ça.<br />
<br/></p>
<p><a href="http://media.waanser.com/2009/11/soapws.jpg"><img src="http://media.waanser.com/2009/11/soapws.jpg" alt="soapws" title="soapws" width="721" height="314" class="alignnone size-medium wp-image-2361" /></a></p>
<p>Nous allons créer un nouveau projet que nous appellerons <strong>MonWebService </strong>(il n&#8217;y a pas plus clair ^^).<br />
<br/><br />
On va commencer par faire <strong>le format WSDL </strong>(fichier soap) de notre web service.</p>
<hr/>
<p><a href="http://media.waanser.com/2009/12/ws11.jpg"><img src="http://media.waanser.com/2009/12/ws11-300x247.jpg" alt="ws11" title="ws11" width="300" height="247" class="alignnone size-medium wp-image-2372" /></a><br />
<br/><br />
On le nomme <strong>monFormat.wsdl</strong></p>
<p>Pour nous aider, Eclipse nous construit automatiquement un format wsdl par défaut, nous allons le reprendre et le paramétrer. Mais avant tout, je vais vous parler rapidement de l&#8217;interface. <br/></p>
<hr/><br/><br />
En bas à Gauche, vous avez remarqué 2 onglets :<br />
 &nbsp;&nbsp;&nbsp;&nbsp;<strong>Desing </strong>=> l&#8217;interface<br />
 &nbsp;&nbsp;&nbsp;&nbsp;<strong>Source </strong>=> le format wsdl que l&#8217;interface génère<br />
Rassurez vous, nous aurons pas à toucher au fichier source, on va créer notre format <strong>wsdl </strong>seulement avec l&#8217;interface <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br/><br />
Vous devriez voir ça, normalement :</p>
<hr/>
<p><a href="http://media.waanser.com/2009/12/ws3.jpg"><img src="http://media.waanser.com/2009/12/ws3.jpg" alt="eclipse affichage defaut wsdl soap webservice" title="ws3" width="600" height="100" class="size-medium wp-image-2381" /></a></p>
<p>C&#8217;est avec la boîte à gauche que l&#8217;on définit l&#8217;adresse du serveur du web-service ( c&#8217;est là où tout le traitement php va se faire), Dans le champ de saisie, il faudra mettre : <strong>http://localhost/MonWebService/serveur.php</strong></p>
<hr/>
A droite, ce sont les <strong>différents services</strong> (ou opérations) que le web-service propose.<br/><br />
Dans notre exemple, nous proposons qu&#8217;un seul service. On va l&#8217;appeler <strong>QuelJour</strong>.<br />
Le nom de l&#8217;opération par défaut est <strong>NewOperation </strong>en double cliquant dessus on peut le renommer.<br/><br />
C&#8217;est d&#8217;ailleurs  ce que l&#8217;on va faire en le renommant <strong>QuelJour</strong>.</p>
<hr/>
Juste en dessous, on voit 2 lignes :</p>
<p><strong>Input </strong>qui représente les données que va recevoir le Web-Service<br />
<strong>Output </strong>qui représente les données que va envoyer le Web-Service<br />
<br/><br />
Tout le monde suit ? <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
Nous allons définir le paramètre d&#8217;entrée. </p>
<p>En entrée, on aura besoin d&#8217;une <strong>chaine de caractère(string)</strong>.<br />
Pour se faire, on fait un clique droit sur case la plus à droite de la <strong>ligne input</strong>, dans le menu contextuel<br />
On clique sur <strong>Set Type</strong> puis<strong> Existing Type</strong> et là on sélectionne <strong>string</strong>.<br />
<br/><br />
On réitère cette opération pour le paramètre de sortie.</p>
<hr/>
Ce qui va donner :<br />
<a href="http://media.waanser.com/2009/12/w2.jpg"><img src="http://media.waanser.com/2009/12/w2.jpg" alt="webservice wsdl interface eclipse" title="w2" width="600" height="100" class="size-medium wp-image-2374" /></a><br />
<br/><br />
Voilà nous avons définit notre format de web service !</p>
<hr/>
<h2>Du serveur au client</h2>
<p>On va s&#8217;attaquer à notre serveur, préparez vos doigts ça va coder !</p>
<p>On va le nommer<strong> serveur.php</strong><br />
<span style="color:red">Attention</span>, le chemin de votre fichier doit être le même que celui que vous avez paramétré dans votre web-service. <br/><br />
Ex : <span style="color:green">http://localhost/MonWebService/serveur.php</span> => <span style="color:green">C:\wam\www\MonWebService\serveur.php</span></p>
<p>Voici le code source, les commentaires parlent d&#8217;eux-même :<br />
<br/></p>
<pre class="brush: php">
// Pour supprimer le cache du web-service
ini_set(&#039;soap.wsdl_cache_enabled&#039;, 0);
// Pour définir le temp maximal d&#039;éxecution de notre web-service
ini_set(&#039;default_socket_timeout&#039;, 180);

// Nom de notre web-service
class Server {
     // Le service QuelJour que l&#039;on a définit dans notre format wsdl
    function QuelJour($parm) {
    	return &#039;Web-Service ok&#039;;
    }
}
// On tente d&#039;instancier la classe soapServer
// Si cela s&#039;avère impossible, on affiche une erreur
try {
    $server = new SoapServer(&#039;monFormat.wsdl&#039;,  array(&#039;trace&#039; =&gt; 1,&#039;encoding&#039;	=&gt; &#039;ISO-8859-1&#039;));
    // On définit la classe qui va gérer les requêtes SOAP (pour nous c&#039;est la class Server)
    $server -&gt; setclass(&#039;Server&#039;);
    $server-&gt;setPersistence(SOAP_PERSISTENCE_REQUEST);
} catch (Exception $e) {
    echo &#039;erreur&#039;.$e;
}
// Si l&#039;appel provient d&#039;un Web-Service
if ($_SERVER[&#039;REQUEST_METHOD&#039;] == &#039;POST&#039;) {
	try {
		$server -&gt; handle();}
	catch (Exception $e) {
    echo &#039;erreur&#039;.$e;
	}
}
// Facultatif seulement pour montrer les fonctions disponibles par le web-service
else {
    echo &#039;&lt;strong&gt;This SOAP server can handle following functions : &lt;/strong&gt;&#039;;
    echo &#039;&lt;ul&gt;&#039;;
    foreach($server -&gt; getFunctions() as $func) {
        echo &#039;&lt;li&gt;&#039; , $func , &#039;&lt;/li&gt;&#039;;
    }
    echo &#039;&lt;/ul&gt;&#039;;
}
</pre>
<p><br/><br />
Si tout se passe bien et si on se rend sur cette adresse :</p>
<p>http://localhostMonWebService/serveur.php</p>
<p><br/><br />
On devrait voir :<br />
<img src="http://media.waanser.com/2009/12/ws4.jpg" alt="web service php serveur soap wsdl" title="ws4" width="449" height="82" class="size-full wp-image-2385" /></a><br />
<br/><br />
Tout marche ? On est trop fort \o/</p>
<hr/>
Pour l&#8217;instant, on va juste afficher un message qui indique que le web-service fonctionne bien. (eh oui, on commence simple pour faire plus compliquer ensuite <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )<br />
<br/><br />
Côté client, nous allons créer un fichier <strong>client.php</strong></p>
<pre class="brush: php">
// Pour supprimer le cache du web-service
ini_set(&#039;soap.wsdl_cache_enabled&#039;, 0);

// Nouveau Client SOAP
try {
    // Nouvelle instance de la classe soapClient
   $client = new SoapClient(&#039;http://localhost/MonWebService/monFormat.wsdl&#039;, array(&#039;trace&#039; =&gt; 1));
   $parm = date(&#039;Y-m-d&#039;);
    // Appel de la méthode QuelJour du service web
   try{
    $oReturn =  $client -&gt; __soapCall(&#039;QuelJour&#039;, array(&#039;string&#039; =&gt;$parm));
	} catch (SoapFault $fault) {
    	trigger_error(&quot;SOAP Fault: (faultcode: {$fault-&gt;faultcode}, faultstring: {$fault-&gt;faultstring})&quot;, E_USER_ERROR);
	}
        // affiche le résultat
	var_dump($oReturn);
} catch (SoapFault $fault) {
    echo &#039;erreur : &#039;.$fault;
}
</pre>
<hr/>
On a plus qu&#8217;à se rendre sur <strong>http://localhostMonWebService/client.php</strong> pour voir notre message.<br />
<br/><br />
Eh voilà la mécanique est en place, on va pouvoir améliorer notre web-service, mais là on ne va rien apprendre, ce n&#8217;est que du php <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
<br/><br />
On va revenir sur notre serveur (fichier <strong>serveur.php</strong>), dans la fonction <strong>QuelJour</strong><br />
pour traiter la chaîne en paramètre.<br />
<br/><br />
Notre fonction va donc devenir : </p>
<pre class="brush: php">
    function QuelJour($parm) {
    	$aJour[1] = &#039;Lundi&#039;;
    	$aJour[2] = &#039;Mardi&#039;;
    	$aJour[3] = &#039;Mercredi&#039;;
    	$aJour[4] = &#039;Jeudi&#039;;
    	$aJour[5] = &#039;Vendredi&#039;;
    	$aJour[6] = &#039;Samedi&#039;;
    	$aJour[0] = &#039;Dimanche&#039;;
    	return $aJour[date(&quot;w&quot;,strtotime($parm))];
    }
</pre>
<hr/>
<h2>Debugger un web-service</h2>
<p>Le debugage d&#8217;un web-service est toujours difficile. Le client interprète directement la réponse du web-service et si la réponse n&#8217;est pas correctement formaté (qui ne respecte pas le format wsdl du web-service), il affiche une erreur du type : <br/><br />
<span style="color:red">( ! ) Fatal error: SOAP Fault: (faultcode: Client, faultstring: looks like we got no XML document) in /var/www/MonWebService/client.php on line 17 Call Stack #TimeMemoryFunctionLocation 10.000158584{main}( )../client.php:0 20.002180708trigger_error ( )../client.php:17</span></p>
<hr/>
Mais il ne renvoie pas l&#8217;erreur php du serveur. Je suis d&#8217;accord avec vous, ce n&#8217;est pas facile la vie d&#8217;un développeur :&#8217;(<br />
Pour savoir, ce que renvoie exactement le serveur, nous allons utiliser l&#8217;application <strong>SOAPUI</strong><br />
<br/><br />
Une fois installée, vous allez créer un projet. Pour ceci vous allez dans<br />
<strong>File </strong>→ <strong>New soapUIProject</strong>.</p>
<hr/>
Là, une fenêtre apparaît, vous cliquez sur parcourir (browse&#8230;), vous sélectionnez votre fichier wsdl<br />
(<strong>monFormat.wsdl</strong>) puis <strong>OK</strong>.<br/><br />
<a href="http://media.waanser.com/2009/12/ws5.jpg"><img src="http://media.waanser.com/2009/12/ws5.jpg" alt="web service xsql soapui" title="ws5" width="180" height="47" class="size-full wp-image-2390" /></a></p>
<hr/>
Dans le menu <strong>projects</strong>, vous déroulez votre arborescence <strong>monformat </strong> jusqu&#8217;à voir le nom de la fonction que vous voulez tester, (pour nous c&#8217;est <strong>Queljour</strong>).<br/><br />
Clique droit puis<strong> New Request</strong> et SoapUI créer votre interface pour communiquer avec les web-service.<br />
<br/><br />
Si vous avez bien suivit, voila ce que vous devriez voir :<br />
<br/><br />
<a href="http://media.waanser.com/2009/12/ws6.jpg"><img src="http://media.waanser.com/2009/12/ws6.jpg" alt="webservice debug entete http" title="ws6" width="650" height="90" class="size-full wp-image-2391" /></a><br/><br />
Vous avez plus qu&#8217;à faire les tests et récupérer directement le résultat du web service. </p>
<p><strong>Les erreurs : </strong><br />
<br/><br />
Pendant le développement de différents de web-services, je suis tombé sur des erreurs de toute part, malheureusement je ne les ai pas tous mémorisé mais voici un début de liste qui pourrait vous aider. Si vous aussi vous êtes embétez un petit commentaire et on pourra certainement vous aider. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
SoapFault exception: [HTTP] Not Found in /var/www/lab/customer.php:10 Stack trace: #0 [internal function]: SoapClient->__doRequest(&#8216;__call(&#8216;getServerDate&#8217;, Array) #2 {main}<br />
=> wsdl trouve pas le serveur</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/web-20/2346-web-service-en-soap-avec-php.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Installer et utiliser Pear</title>
		<link>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html</link>
		<comments>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html#comments</comments>
		<pubDate>Wed, 01 Jul 2009 19:25:27 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2237</guid>
		<description><![CDATA[Pear est une bibliothèque php qui permet de gérer les installations des librairies php. Nous allons voir dans ce tutoriel comment installer PEAR et faire une première utilisation. Installation Pour l&#8217;installation, nous allons commencer à ouvrir une invite de commande dos. Et commencer par faire : set PATH=%PATH%;C:\wamp\php Normalement dans votre dossier php, vous avez [...]]]></description>
			<content:encoded><![CDATA[<p>Pear est une bibliothèque php qui permet de gérer les installations des librairies php.<br />
Nous allons voir dans ce tutoriel comment installer PEAR et faire une première utilisation.</p>
<h2>Installation</h2>
<p>Pour l&#8217;installation, nous allons commencer à ouvrir une invite de commande dos.<br />
Et commencer par faire :</p>
<p>set PATH=%PATH%;C:\wamp\php</p>
<p>Normalement dans votre dossier php, vous avez un dossier PEAR, il faut s&#8217;y rendre. </p>
<p>Par exemple, pour wamp il faut taper :     cd C:\wamp\php\PEAR</p>
<hr/>
<p>Vous trouverez un fichier <strong>php go-pear.phar</strong>, il suffit de l&#8217;exécuter :</p>
<p>php go-pear.phar</p>
<p>Et là, l&#8217;installation se lance <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="attachment_2238" class="wp-caption alignnone" style="width: 453px"><a href="http://media.waanser.com/2009/06/pear.jpg"><img src="http://media.waanser.com/2009/06/pear.jpg" alt="installation pear" title="pear" width="443" height="110" class="size-full wp-image-2238" /></a><p class="wp-caption-text">installation pear</p></div>
<p>Si vous voulez que l&#8217;installation de pear concerne toutes les sessions d&#8217;utilisateurs, il faut mettre system.</p>
<hr/>
<p>Un récapitulatif des chemins de configuration de pear est affiché, vous pouvez laisser la configuration par défaut, elle est très bien.</p>
<div id="attachment_2239" class="wp-caption alignnone" style="width: 575px"><a href="http://media.waanser.com/2009/06/pear1.jpg"><img src="http://media.waanser.com/2009/06/pear1.jpg" alt="installation pear" title="pear1" width="565" height="306" class="size-full wp-image-2239" /></a><p class="wp-caption-text">installation pear</p></div>
<p>Dernière étape, on accepte de modifier notre fichier php.ini pour qu&#8217;il prenne en compte notre bibliothèque PEAR.</p>
<div id="attachment_2240" class="wp-caption alignnone" style="width: 542px"><a href="http://media.waanser.com/2009/06/pear2.jpg"><img src="http://media.waanser.com/2009/06/pear2.jpg" alt="pear installation" title="pear" width="532" height="104" class="size-full wp-image-2240" /></a><p class="wp-caption-text">pear installation</p></div>
<p>Eh voilà c&#8217;est installé <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </p>
<div id="attachment_2241" class="wp-caption alignnone" style="width: 440px"><a href="http://media.waanser.com/2009/06/pear3.jpg"><img src="http://media.waanser.com/2009/06/pear3.jpg" alt="pear installation" title="pear3" width="430" height="119" class="size-full wp-image-2241" /></a><p class="wp-caption-text">pear installation</p></div>
<hr/>
<h2>Première utilisation</h2>
<p>Nous allons installer la librairie <strong>DATE</strong></p>
<p>Dans un premier temps nous allons faire :</p>
<p>set PATH=%PATH%;C:\wamp\php\PEAR</p>
<p>Il faut aller ensuite sur <a href="http://pear.php.net/packages.php">http://pear.php.net/packages.php</a>.</p>
<p>Date and Time -> Date -> Download.</p>
<hr/>
<p>On va récupérer la commande pour le téléchargement :</p>
<div id="attachment_2242" class="wp-caption alignnone" style="width: 284px"><a href="http://media.waanser.com/2009/06/pear4.jpg"><img src="http://media.waanser.com/2009/06/pear4.jpg" alt="utilisation pear" title="pear4" width="274" height="100" class="size-full wp-image-2242" /></a><p class="wp-caption-text">utilisation pear</p></div>
<p>Pour moi, il faut taper :</p>
<p>pear install Date-1.5.0a1</p>
<hr/>
Si vous avez une erreur du type :</p>
<p>PEAR Fatal error: Allowed memory size of 8388608 bytes exhausted</p>
<p>Il faut modifier votre fichier C:\wamp\php\php.ini, aller dans l&#8217;attribut memory_limit = 8M<br />
et remplacer par : memory_limit = 256M</p>
<p>Comme ça, on est tranquille <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
<pre class="brush: php">
// on fait appel a notre librairie PEAR
set_include_path(get_include_path() . &quot;;C:\wamp\php\PEAR\pear&quot;);

require_once &#039;DATE.php&#039;;
$now = new Date();

//UNIX timestamp:
echo $now-&gt;getTime().&#039;&lt;br/&gt;&#039;;

//format de date iso
echo $now-&gt;getDate();
</pre>
<p>Et voilà, vous savez utiliser PEAR <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/2237-tutoriel-installer-pear.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Layout et connexion à une base avec Zend</title>
		<link>http://www.waanser.com/php/zend-framework/2201-layout-et-connexion-a-une-base-avec-zen-zend_db.html</link>
		<comments>http://www.waanser.com/php/zend-framework/2201-layout-et-connexion-a-une-base-avec-zen-zend_db.html#comments</comments>
		<pubDate>Tue, 09 Jun 2009 21:39:16 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2201</guid>
		<description><![CDATA[Notion fondamentale de zend framework, nous allons voir dans cet article comment organiser le contenu de nos pages avec l&#8217;utilisation des layouts. Nous allons aussi faire une première approche de Zend_Db, la classe de zend qui manipule la base de données. Les layouts Dans cet article, nous allons reprendre le code source du tutoriel précédent. [...]]]></description>
			<content:encoded><![CDATA[<p>Notion fondamentale de zend framework, nous allons voir dans cet article comment organiser le contenu de nos pages avec l&#8217;utilisation des layouts. Nous allons aussi faire une première approche de <strong>Zend_Db</strong>, la classe de zend qui manipule la base de données.<span id="more-2201"></span></p>
<h2>Les layouts</h2>
<p>Dans cet article, nous allons reprendre <a href='http://media.waanser.com/2009/04/zenfacile.rar'> le code source</a> du tutoriel précédent.</p>
<p>Pour éviter d&#8217;avoir à recopier les mêmes morceaux de code pour chaque page, il est important de bien savoir structurer nos pages (définir une entête,un corps, un pied de page &#8230;). Avec Zend cette organisation se fait à travers les layouts.</p>
<pre class="brush: php">
// setup controller
$frontController = Zend_Controller_Front::getInstance();
$frontController-&gt;throwExceptions(true);
$frontController-&gt;setControllerDirectory(&#039;./application/controllers&#039;);
// on définit le chemin des layouts
$aOptions = array(
    &#039;layout&#039;     =&gt; &#039;home&#039;,
    &#039;layoutPath&#039; =&gt; &#039;./application/layouts&#039;
);
Zend_Layout::startMvc($aOptions);
</pre>
<hr/>
<strong>Zend_Layout::startMvc($aOptions);</strong><br />
Démarre le layout en prenant les options en paramètre.<br />
Dans les options :<br />
<strong>layoutPath </strong>=> le chemin où seront stockés les layouts<br />
<strong>layout    </strong>=> le nom du layout</p>
<hr/>
<p>Vous l&#8217;aurez compris, nous allons créer un dossier <strong>layouts</strong> dans notre dossier application où seront stockés nos layouts. Voici notre nouvelle arborescence :</p>
<div id="attachment_2203" class="wp-caption alignnone" style="width: 174px"><a href="http://media.waanser.com/2009/06/zend.jpg"><img src="http://media.waanser.com/2009/06/zend.jpg" alt="layouts zend" title="zend" width="164" height="127" class="size-full wp-image-2203" /></a><p class="wp-caption-text">layouts zend</p></div>
<hr/>
zenfacile => application => layouts => home.phtml</p>
<hr/>
<pre class="brush: html">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;
        &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;fr&quot; lang=&quot;fr&quot;&gt;
&lt;head&gt;
    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; /&gt;
	&lt;title&gt;&lt;?php echo $this-&gt;title; ?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;content&quot;&gt;
    &lt;h1&gt;&lt;?php echo $this-&gt;welcome; ?&gt;&lt;/h1&gt;
    &lt;?php echo $this-&gt;layout()-&gt;content; ?&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong> $this->layout()->content;</strong> sera le contenu de nos pages.</p>
<p>Nous allons retourner dans notre contrôleur principal.</p>
<hr/>
zenfacile => application => controllers => IndexControler.php</p>
<hr/>
<pre class="brush: php">
class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
    	    $this-&gt;view-&gt;title = &quot;Mes amis&quot;;
    	    $this-&gt;view-&gt;welcome = &quot;Bienvenue&quot;;
    }
</pre>
<p>Le rendu n&#8217;est pas super, mais ça au moins le mérite de montrer que ça marche.</p>
<div id="attachment_2210" class="wp-caption alignnone" style="width: 251px"><a href="http://media.waanser.com/2009/06/zend1.jpg"><img src="http://media.waanser.com/2009/06/zend1.jpg" alt="zend layout" title="zend1" width="241" height="101" class="size-full wp-image-2210" /></a><p class="wp-caption-text">zend layout</p></div>
<h2>La base de données avec Zend_Db </h2>
<p>Pour se connecter à la base de données, il faut bien naturellement indiquer les identifiants de connexions.<br />
Avec Zend, on passe par un fichier de configuration ini.</p>
<hr/>
zenfacile => index.php</p>
<hr/>
<pre class="brush: php">
Zend_Loader::registerAutoload();
//on définit un nouvel objet de configuration
$oConfig = new Zend_Config_Ini(&#039;./application/config.ini&#039;, &#039;connexion&#039;);
// Mise en place de la BDD
$oDb = Zend_Db::factory($oConfig-&gt;db);
// on définit notre objet de base de données par défaut
Zend_Db_Table::setDefaultAdapter($oDb);
</pre>
<p>new Zend_Config_Ini(le chemin de notre fichier ini, la section concerner);</p>
<hr/>
zenfacile => application => config.ini</p>
<hr/>
<p>[connexion]<br />
db.adapter = PDO_MYSQL<br />
db.params.host = localhost<br />
db.params.username = root<br />
db.params.password =<br />
db.params.dbname = zendfacile</p>
<p>Nous allons créer la base de donnée, voici la table :</p>
<pre class="brush: sql">
CREATE TABLE ami (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
nom VARCHAR( 255 ) NOT NULL ,
prenom VARCHAR( 255 ) NOT NULL
)
</pre>
<p>Les données :</p>
<pre class="brush: sql">
INSERT INTO zendfacile.ami (id ,nom ,prenom)
VALUES (NULL , &#039;Laporte&#039;, &#039;Jean&#039;);

INSERT INTO zendfacile.ami (id ,nom ,prenom)
VALUES (NULL , &#039;LaPie&#039;, &#039;Marie&#039;);
</pre>
<p>Maintenant que notre base est faite, on va s&#8217;attaquer au code <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
zenfacile => application => controllers => IndexControler.php</p>
<hr/>
<pre class="brush: php">
class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
    	    $this-&gt;view-&gt;title = &quot;Mes amis&quot;;
    	    $this-&gt;view-&gt;welcome = &quot;Bienvenue&quot;;
    	    $oAmi = new Ami();
    	     $this-&gt;view-&gt;ami = $oAmi-&gt;fetchAll();
    }
</pre>
<p> $oAmi = new Ami();<br />
va faire appel au modéle ami. On l&#8217;a pas créé ?<br />
j&#8217;allais l&#8217;oublier <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr/>
zenfacile => application => models=> Ami.php</p>
<hr/>
<pre class="brush: php">
class Ami extends Zend_Db_Table
{
    protected $_name = &#039;ami&#039;;
}
</pre>
<p>On a plus qu&#8217;à afficher notre résultat :</p>
<pre class="brush: html">
&lt;table&gt;
&lt;tr&gt;
	&lt;th&gt;Nom&lt;/th&gt;
	&lt;th&gt;Prenom&lt;/th&gt;
	&lt;th&gt;&amp;amp;amp;amp;amp;amp;nbsp;&lt;/th&gt;
&lt;/tr&gt;

&lt;?php foreach($this-&gt;ami as $ami) : ?&gt;
&lt;tr&gt;
	&lt;td&gt;&lt;?php echo $ami-&gt;nom;?&gt;&lt;/td&gt;
	&lt;td&gt;&lt;?php echo $ami-&gt;prenom;?&gt;&lt;/td&gt;

&lt;/tr&gt;
&lt;?php endforeach; ?&gt;
&lt;/table&gt;
</pre>
<p>C&#8217;est pas beau, mais on a ce que l&#8217;on a demandé <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  :<br />
<div id="attachment_2214" class="wp-caption alignnone" style="width: 215px"><a href="http://media.waanser.com/2009/06/zend2.jpg"><img src="http://media.waanser.com/2009/06/zend2.jpg" alt="Zend_Db" title="zend" width="205" height="190" class="size-full wp-image-2214" /></a><p class="wp-caption-text">Zend_Db</p></div><br />
<a href='http://media.waanser.com/2009/06/zenfacile.rar'>Voici le pack complet qui regroupe tout le code source fonctionnel</a><br />
<br/></p>
<p>Voilà une première mise en bouche des possibilités de Zend, dans les prochains articles nous irons plus loin dans l&#8217;univers de ZEND.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/zend-framework/2201-layout-et-connexion-a-une-base-avec-zen-zend_db.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>FBML techniques de propagation virales</title>
		<link>http://www.waanser.com/php/api-facebook/2147-fbml-api-facebook-les-techniques-de-propagation.html</link>
		<comments>http://www.waanser.com/php/api-facebook/2147-fbml-api-facebook-les-techniques-de-propagation.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 16:44:36 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Api Facebook]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=2147</guid>
		<description><![CDATA[La force d&#8217;une application facebook est le fait qu&#8217;elle peut toucher un grand nombre d&#8217;utilisateur très rapidement à un cout nul. Pour cela il faut savoir utiliser les techniques de propagation. Nous allons voir cela dans cet article. Les demandes d&#8217;ajouts Nous allons commencer par faire les demandes d&#8217;ajouts. Si vous ne l&#8217;avez déjà pas [...]]]></description>
			<content:encoded><![CDATA[<p>La force d&#8217;une application facebook est le fait qu&#8217;elle peut toucher un grand nombre d&#8217;utilisateur très rapidement à un cout nul. Pour cela il faut savoir utiliser les techniques de propagation. Nous allons voir cela dans cet article.</p>
<h2>Les demandes d&#8217;ajouts</h2>
<p>Nous allons commencer par faire les demandes d&#8217;ajouts.</p>
<hr />
Si vous ne l&#8217;avez déjà pas fait, pour pouvoir tester les notifications il est essentiel de rendre public votre application.<br />
Il faut donc que vous retourner dans les paramètres de votre application.<br />
Il faudra ensuite se rendre dans l&#8217;onglet <strong>Paramètres avancées</strong>, pour désactiver le mode bac à sable. (il devrait plutôt s&#8217;appeler mode développeur, non ? <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<div id="attachment_2128" class="wp-caption alignnone" style="width: 334px"><a href="http://media.waanser.com/2009/05/facebook8.jpg"><img class="size-full wp-image-2128" title="facebook8" src="http://media.waanser.com/2009/05/facebook8.jpg" alt="api facebook mode bac à sable" width="324" height="31" /></a><p class="wp-caption-text">api facebook mode bac à sable</p></div>
<p>Aussi, je vous conseille aussi de créer un deuxième compte plutôt que piquer celui de votre sœur <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nous allons donc créer une page de demande d&#8217;ajout.</p>
<p>Voici ce que l&#8217;on va mettre, les explications sont juste en-dessous :</p>
<pre class="brush: html">
&lt;!-- demande d&#039;ajout --&gt;
&lt;fb:fbml&gt;
&lt;fb:request-form action=&quot;index.php&quot; method=&quot;POST&quot; invite=&quot;true&quot; type=&quot; De Malade &quot; content=&quot;Je suis sur que je te bats facilement au quizz.&quot;
&lt;?php echo htmlentities(&quot;&lt;fb:req-choice url=\&quot;http://apps.facebook.com/waanser/\&quot; label=\&quot;J&#039;accepte le défis\&quot;&quot;) ?&gt;&quot; &gt;
&lt;fb:multi-friend-selector showborder=&quot;false&quot; actiontext=&quot;Défie tes amis !&quot;&gt;
&lt;/fb:request-form&gt;
&lt;/fb:fbml&gt;
</pre>
<p>Voilà ce que ça va donner :</p>
<div id="attachment_2111" class="wp-caption alignnone" style="width: 432px"><a href="http://media.waanser.com/2009/05/facebook2.jpg"><img class="size-full wp-image-2111" title="facebook2" src="http://media.waanser.com/2009/05/facebook2.jpg" alt="demande d'ajouts " width="422" height="150" /></a><p class="wp-caption-text">facebook demande d&#39;ajouts </p></div>
<p>Même si c&#8217;est long, on va y aller pas à pas :</p>
<hr />
<dl>
<dt><strong>action = &laquo;&nbsp;index.php&nbsp;&raquo;</strong></dt>
<dd>Une fois le formulaire validé, l&#8217;application va nous rediriger vers la page index.php</dd>
<dt><strong>method = &laquo;&nbsp;POST&nbsp;&raquo;</strong></dt>
<dd>Tout comme les formulaires traditionnels, c&#8217;est la méthode d&#8217;envoie des données (POST ou GET)</dd>
<dt><strong>invite = &laquo;&nbsp;true&nbsp;&raquo;</strong></dt>
<dd>Pour indiquer que le formulaire est une invitation</dd>
<dt><strong><strong>type =  &nbsp;&raquo; De Malade &laquo;&nbsp;</strong></strong></dt>
<dd>C&#8217;est le texte qui va s&#8217;afficher à la fin de l&#8217;entête de l&#8217;invitation</dd>
<dt><strong>content = &laquo;&nbsp;Je suis sur &#8230;</strong></dt>
<dd>Le contenu du message</dd>
<dt><strong>&lt;fb:req-choice</strong></dt>
<dd>C&#8217;est pour créer un bouton</dd>
<dt><strong>url = &laquo;&nbsp;http://apps.facebook.com/waanser/&nbsp;&raquo;</strong></dt>
<dd>L&#8217;url que redirige la fenêtre</dd>
<dt><strong>label = &laquo;&nbsp;J&#8217;accepte le défis&nbsp;&raquo;</strong></dt>
<dd>Le message sur le bouton</dd>
<dt><strong>&lt;fb:multi-friend-selector</strong></dt>
<dd>La fenêtre où l&#8217;utilisateur choisit les amis à défier</dd>
</dl>
<hr />
<p>Eh oui, facebook nous laisse la possibilité de tout paramétrer <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Les fils d&#8217;actualités</h2>
<p>Publier les fils d&#8217;actualités, est une des fonction phare de facebook.</p>
<p>Pour créer ces fils d&#8217;actualités, il faut dans un premier temps créer et enregistrer les maquettes d&#8217;évènements.</p>
<p>Pour enregistrer les maquettes de fils d&#8217;actualités c&#8217;est par <a href="http://developers.facebook.com/tools.php?feed">ici</a>.<br />
Vous avez reconnu ? C&#8217;est la page boîte à outil que facebook propose pour les développeurs.</p>
<hr />
Étape très difficile ^^<br />
La première étape sera de sélectionner l&#8217;application qui va utiliser la maquette.</p>
<div id="attachment_2168" class="wp-caption alignnone" style="width: 337px"><a href="http://media.waanser.com/2009/06/api_facebook.png"><img class="size-full wp-image-2168" title="api_facebook" src="http://media.waanser.com/2009/06/api_facebook.png" alt="api facebook" width="327" height="90" /></a><p class="wp-caption-text">api facebook</p></div>
<p>Vous avez la possibilité de faire 2 types d&#8217;actualités :</p>
<ul>
<li>les actualités standards</li>
<li>les actualités sur une ligne</li>
</ul>
<h2>Comment créer une maquette</h2>
<p>Vous tombez sur un panneau d&#8217;administration, c&#8217;est avec ça que l&#8217;on va faire notre fameuse maquette.</p>
<p>Là, c&#8217;est la structure de votre maquette :</p>
<div id="attachment_2117" class="wp-caption alignnone" style="width: 327px"><a href="http://media.waanser.com/2009/05/facebook3.jpg"><img class="size-full wp-image-2117" title="facebook3" src="http://media.waanser.com/2009/05/facebook3.jpg" alt="facebook template" width="317" height="52" /></a><p class="wp-caption-text">facebook template</p></div>
<p>On le devine tout seul, cette partie c&#8217;est le rendu :</p>
<div id="attachment_2118" class="wp-caption alignnone" style="width: 192px"><a href="http://media.waanser.com/2009/05/facebook4.jpg"><img class="size-full wp-image-2118" title="facebook4" src="http://media.waanser.com/2009/05/facebook4.jpg" alt="rendu maquette facebook" width="182" height="61" /></a><p class="wp-caption-text">rendu maquette facebook</p></div>
<p>Et enfin, c&#8217;est un exemple de données que l&#8217;on va appliquer dans la structure :</p>
<div id="attachment_2119" class="wp-caption alignnone" style="width: 336px"><a href="http://media.waanser.com/2009/05/facebook5.jpg"><img class="size-full wp-image-2119" title="facebook5" src="http://media.waanser.com/2009/05/facebook5.jpg" alt="maquette facebook" width="326" height="141" /></a><p class="wp-caption-text">maquette facebook</p></div>
<hr />
<a href="http://www.perdu.com">Perdu ?</a> <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Il faut savoir que la maquette est constituée d&#8217;une structure (qui ne changera jamais) et de données dynamique.<br />
On veut que notre file d&#8217;actualité ressemble à ça :</p>
<hr />
<div id="attachment_2120" class="wp-caption alignnone" style="width: 207px"><a href="http://media.waanser.com/2009/05/facebook6.jpg"><img class="size-full wp-image-2120" title="facebook6" src="http://media.waanser.com/2009/05/facebook6.jpg" alt="exemple maquette facebook" width="197" height="31" /></a><p class="wp-caption-text">exemple maquette facebook</p></div>
<p>Pour mieux comprendre, nous allons décomposer le message  :</p>
<p>donnée : <span style="color:red"> rouge </span><br />
structure : <span style="color:green"> vert </span><br />
<span style="color:red"><strong>Julien </strong></span><span style="color:green">maitrise </span><span style="color:red"> <strong>l&#8217;histoire</strong></span><span style="color:green"> à </span><span style="color:red"> <strong>65</strong></span><span style="color:green">%</span></p>
<p>Il savoir que facebook appel les données dynamiques ; <strong>un jeton</strong>.</p>
<p>Pour indiquer les données dynamiques, nous allons utiliser cette syntaxe :<em> {*nom du jeton*}</em><br />
La maquette va ressembler à ça :<br />
<em>{*actor*}</em> maitrise <em>{*theme*}</em> à <em>{*points*}</em> %</p>
<hr />
Si vous appuyez sur le bouton mettre l&#8217;aperçu à jour, vous aurez une belle erreur (Feed Story Preview Error)</p>
<div id="attachment_2121" class="wp-caption alignnone" style="width: 459px"><a href="http://media.waanser.com/2009/05/facebook7.jpg"><img class="size-full wp-image-2121" title="facebook7" src="http://media.waanser.com/2009/05/facebook7.jpg" alt="erreur prévualsisation maquette" width="449" height="213" /></a><p class="wp-caption-text">erreur prévualsisation maquette</p></div>
<p>En fait, votre maquette est bonne ! Mais pour que la prévisualisation se passe bien, il faut lui fournir un jeu de données. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr />
Pour donner cet exemple, il suffit de se reporter dans la zone de texte : Exemple de données de modèle<br />
et mettre : <em>{&laquo;&nbsp;points&nbsp;&raquo;:&nbsp;&raquo;65&#8243;,&nbsp;&raquo;theme&nbsp;&raquo;:&nbsp;&raquo;l&#8217;histoire&nbsp;&raquo;}</em></p>
<p>Et là Miracle ! ça fonctionne <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>{*author*} </em> est un jeton par défaut que facebook met d&#8217;office pour afficher le nom de l&#8217;utilisateur.</p>
<hr />
<strong> Attention, vous devez passer (bouton ignorer) la prochaine étape (Créer un modèle d&#8217;actualité courte), sinon facebook va enregistrer cette dernière maquette.</strong></p>
<hr />
Si vous voulez faire une actualité courte, c&#8217;est par ici:</p>
<p>L&#8217;actualité courte permet d&#8217;afficher des médias comme les images :</p>
<p>Pour afficher les images, il faut continuer dans la partie : Exemple de données de modèle</p>
<p>Voici la syntaxe :</p>
<p><em>{&laquo;&nbsp;images&nbsp;&raquo;:[{"src":"url de li'mage", "href":"la cible du lien"}</em></p>
<p>Voici un exemple :</p>
<p><em>{"images":[{"src":"http://media.waanser.com/2009/05/genie.png", "href":"http://apps.facebook.com/waanser/"}</em></p>
<hr />
<p><strong>Créer un lien d'action</strong></p>
<p>Étape très importante, parce que c'est le lien qui va renvoyer l'utilisateur vers notre application.</p>
<div id="attachment_2131" class="wp-caption alignnone" style="width: 285px"><a href="http://media.waanser.com/2009/05/f.jpg"><img class="size-full wp-image-2131" title="f" src="http://media.waanser.com/2009/05/f.jpg" alt="api facebook lien d'action" width="275" height="32" /></a><p class="wp-caption-text">api facebook lien d&#39;action</p></div>
<hr />
Cette partie n&#8217;est pas compliquée, vous avez deux champs ;<br />
<strong>Texte de lien d&#8217;action</strong> : le texte du lien.</p>
<p><strong>URL de lien d&#8217;action</strong> : l&#8217;adresse de redirection du lien.</p>
<hr />
<div id="attachment_2132" class="wp-caption alignnone" style="width: 333px"><a href="http://media.waanser.com/2009/05/facebook9.jpg"><img class="size-full wp-image-2132" title="facebook9" src="http://media.waanser.com/2009/05/facebook9.jpg" alt="api facebook lien d'action" width="323" height="140" /></a><p class="wp-caption-text">api facebook lien d&#39;action</p></div>
<p>Vous avez plus qu&#8217;à passer à l&#8217;étape suivante, puis à cliquer sur <em>enregistre le lot de modèles</em>.<br />
Facebook va alors vous donner un bundle id<a href="http://media.waanser.com/2009/05/facebook10.jpg"><img class="alignnone size-full wp-image-2133" title="facebook10" src="http://media.waanser.com/2009/05/facebook10.jpg" alt="facebook10" width="442" height="101" /></a></p>
<p>Il faut bien le conserver, vous en aurez bientôt besoin.</p>
<h2>Utilisez la maquette dans votre application</h2>
<p>Nous allons commencer avec l&#8217;exemple le plus simple, celui où il y a qu&#8217;une seule ligne.</p>
<hr />
Nous allons donc créer un fichier php qui fera appel a notre maquette.<br />
Facebook impose d&#8217;utiliser le format JSON pour appeler la maquette et par la même occasion envoyer les données paramétrables.</p>
<p>{&laquo;&nbsp;content&nbsp;&raquo;: {&laquo;&nbsp;feed&nbsp;&raquo;: {&laquo;&nbsp;template_id&nbsp;&raquo;:identifiant de la maquette , &laquo;&nbsp;template_data&nbsp;&raquo;: {&laquo;&nbsp;nom du jeton 1&#8243;:&nbsp;&raquo;valeur du jeton 1&#8243;,&nbsp;&raquo;nom du jeton 2&#8243;:&nbsp;&raquo;valeur du jeton 2&#8243;} } }, &laquo;&nbsp;method&nbsp;&raquo;:&nbsp;&raquo;feedStory&nbsp;&raquo; }</p>
<hr />
Pour nous, ça va donner :</p>
<p>{&laquo;&nbsp;content&nbsp;&raquo;: {&laquo;&nbsp;feed&nbsp;&raquo;: {&laquo;&nbsp;template_id&nbsp;&raquo;:43745522324, &laquo;&nbsp;template_data&nbsp;&raquo;: {&laquo;&nbsp;points&nbsp;&raquo;:&nbsp;&raquo;65&#8243;,&nbsp;&raquo;theme&nbsp;&raquo;:&nbsp;&raquo;l&#8217;histoire&nbsp;&raquo;} } }, &laquo;&nbsp;method&nbsp;&raquo;:&nbsp;&raquo;feedStory&nbsp;&raquo; }</p>
<p>Le php propose une librairie pour manipuler le json, nous allons en bénéficier pour faire un beau feed json<br />
facilement paramétrable. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<hr />
<pre class="brush: php">
$arr = array(
&#039;content&#039; =&gt; array(
&#039;feed&#039; =&gt; array(
&#039;template_id&#039; =&gt; 43745522324,&#039;template_data&#039; =&gt; array(
&#039;points&#039; =&gt; &#039;65&#039;, &#039;theme&#039; =&gt; &#039;l\&#039;histoire&#039;
)
)
),&#039;method&#039; =&gt; &#039;feedStory&#039;
);

echo json_encode($arr);
</pre>
<h2>Notification</h2>
<p>Nous allons voir comment générer des notifications, rassurez-vous, c&#8217;est beaucoup plus simple que les fils d&#8217;actualités <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voici la syntaxe :</p>
<p><em>$oFacebook-&gt;api_client-&gt;notifications_send(DESTINATAIRE, MESSAGE, TYPE);</em></p>
<hr />
<strong>DESTINATAIRE </strong>: le destinataire de la notification<br />
<strong>MESSAGE </strong>: ça c&#8217;est le message à afficher<br />
<strong>TYPE </strong>: ça c&#8217;est le type de message, il y a 2 types possibles  :</p>
<ul>
<li>app_to_user =&gt; L&#8217;expéditeur c&#8217;est l&#8217;application</li>
<li>app_to_user =&gt; L&#8217;expéditeur c&#8217;est  l’utilisateur enregistré r</li>
</ul>
<hr />
<p>Voici un exemple d&#8217;utilisation :</p>
<pre class="brush: php">
$oFacebook-&gt;api_client-&gt;notifications_send($iUid, &#039;some info&#039;, &#039;user_to_user&#039;);
$oFacebook-&gt;api_client-&gt;notifications_send($iUid, &#039;some info&#039;, &#039;app_to_user&#039;);
</pre>
<p>Le rendu :</p>
<div id="attachment_2144" class="wp-caption alignnone" style="width: 213px"><a href="http://media.waanser.com/2009/05/not.jpg"><img class="size-full wp-image-2144" title="not" src="http://media.waanser.com/2009/05/not.jpg" alt="api facebook notification" width="203" height="104" /></a><p class="wp-caption-text">api facebook notification</p></div>
<p>Et voilà vous avez tous les outils en main pour propager votre application.</p>
<p>Bonne propagation <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/api-facebook/2147-fbml-api-facebook-les-techniques-de-propagation.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Plateforme Php: CodeIgniter &amp; Smarty</title>
		<link>http://www.waanser.com/php/framework/codeigniter/255-plateforme-php-partie-1-codeigniter-et-smarty.html</link>
		<comments>http://www.waanser.com/php/framework/codeigniter/255-plateforme-php-partie-1-codeigniter-et-smarty.html#comments</comments>
		<pubDate>Fri, 01 May 2009 22:38:27 +0000</pubDate>
		<dc:creator>tilkc</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=255</guid>
		<description><![CDATA[Dans ce tutoriel nous allons donc intégrer Smarty pour CodeIgniter afin de faciliter le développement d&#8217;une application WEB. Installation Nous allons télécharger WampServeur, CodeIgniter et Smarty. Pour WampServeur, suivez les instructions d&#8217;installation. Pour CodeIgniter et Smarty il suffit de dezipper les fichiers. Dans WampServeur nous allons créer notre dossier de base de notre site C:/wamp/www/tutorielwaanser [...]]]></description>
			<content:encoded><![CDATA[<p>Dans ce tutoriel nous allons donc intégrer Smarty pour CodeIgniter afin de faciliter le développement d&#8217;une application WEB.<br />
<span id="more-255"></span></p>
<hr />
<h1>Installation</h1>
<p>Nous allons télécharger WampServeur, CodeIgniter et Smarty.</p>
<p>Pour <a title="Téléchargement de WampServeur" href="http://www.wampserver.com/download.php" target="_blank">WampServeur</a>, suivez les instructions d&#8217;installation.<br />
Pour <a title="Téléchargement de CodeIgniter" href="http://codeigniter.com/downloads/" target="_blank">CodeIgniter</a> et <a title="Téléchargement de Smarty" href="http://www.smarty.net/" target="_blank">Smarty</a> il suffit de dezipper les fichiers.</p>
<p>Dans WampServeur nous allons créer notre dossier de base de notre site<br />
C:/wamp/www/tutorielwaanser</p>
<hr />
<h1>Intégration de Smarty</h1>
<p>Dans le fichier index.php ajouter la constante :<strong> WEBSITE_PATH</strong></p>
<pre class="brush: php">
if (strpos($system_folder, &#039;/&#039;) === FALSE) {

if (function_exists(&#039;realpath&#039;) AND @realpath(dirname(__FILE__)) !== FALSE)
{
$system_folder = realpath(dirname(__FILE__)).&#039;/&#039;.$system_folder;
}
} else {
// Swap directory separators to Unix style for consistency
$system_folder = str_replace(&quot;\\&quot;, &quot;/&quot;, $system_folder);
}

define(&#039;WEBSITE_PATH&#039;, realpath(dirname(__FILE__)).&#039;/&#039;.$application_folder );
</pre>
<p>Dans le fichier <strong>system/application/config/config.php</strong> modifier la variable :</p>
<pre class="brush: php">
$config[&#039;subclass_prefix&#039;] = &#039;WAANSER_&#039;;
</pre>
<p><strong>Créer les arborescences suivantes :<br />
- system/smarty/libs </strong>et copier  les dossiers<strong> Internals et plugins de Smarty</strong><strong><br />
</strong></p>
<p><strong>system/application/smarty/plugins<br />
system/application/smarty/tpl</strong></p>
<p><strong>system/application/tmp/smarty/cache<br />
system/application/tmp/smarty/templates_c</strong></p>
<p>Renommer le fichier <strong>Smarty.class.php en Smarty.php</strong><br />
<strong>Copier les fichier Smarty.php, Smarty_Compiler.class.php et Config_File.class.php</strong> dans le dossier <strong>system/libraries</strong></p>
<hr />Dans le fichier <strong>system/libraries/Smarty.php</strong> couper les constantes et copier les dans le fichier <strong>application/config/constants.php</strong></p>
<pre class="brush: php">
//  ******* Smarty ********
define(&#039;DIR_SEP&#039;, DIRECTORY_SEPARATOR);
define(&#039;SMARTY_DIR&#039;, BASEPATH.&#039;smarty&#039;.DIRECTORY_SEPARATOR);
define(&#039;SMARTY_CORE_DIR&#039;, BASEPATH.&#039;smarty/libs/internals&#039; . DIRECTORY_SEPARATOR);

define(&#039;SMARTY_PHP_PASSTHRU&#039;,   0);
define(&#039;SMARTY_PHP_QUOTE&#039;,      1);
define(&#039;SMARTY_PHP_REMOVE&#039;,     2);
define(&#039;SMARTY_PHP_ALLOW&#039;,      3);
</pre>
<p>Ensuite nous devons créer les libraries <strong>WAANSER_controller</strong> et <strong>WAANSER_smarty </strong>dans le dossier <strong>system\application\libraries</strong></p>
<pre class="brush: php">

class WAANSER_Controller extends Controller {

/**
* @desc	for template
* @var 	obj smarty
*/
public $oMySmarty = null;

public function Controller() {

parent::Controller();

$this-&gt;loadSmarty();
}

public function loadSmarty() {

$this-&gt;oMySmarty = &amp;amp;amp;amp;amp;amp;load_class(&#039;Smarty&#039;);
}

}
</pre>
<p>Ce fichier va nous permettre d&#8217;étendre le contrôleur d&#8217;origine, pour récupérer tous le processus de chargement des classes, et nous ajoutons un attribut $oMySmarty qui sera un objet de la classe Smarty.</p>
<p>Avec cet objet on pourra changer de générateur de template.<br />
On peut, même si c&#8217;est moche <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   utiliser le générateur de templates par défaut en même temps que le générateur Smarty.</p>
<pre class="brush: php">

class WAANSER_Smarty extends Smarty {

/**
* @desc	class constructor
* @version	1.0.0
* @date	20090307
*/
public function __construct() {

parent::Smarty();
$this-&gt;setParams();
}

/**
* @desc 	initialise les variables pour smarty
* @version 1.0.0
* @date	20090307
*/

public function setParams() {
$this-&gt;template_dir = APPPATH.&#039;smarty/tpl&#039;;
$this-&gt;compile_dir = APPPATH.&#039;tmp/smarty/templates_c&#039;;
$this-&gt;plugins_dir = array(APPPATH.&#039;smarty/libs/plugins&#039;, APPPATH.&#039;smarty/plugins&#039;);
}

}

?&gt;
</pre>
<p>Il nous reste a changer le fichier welcome dans le dossier <strong>system\application\controllers</strong>, il suffit juste de changer l&#8217;appel au fichier parent.</p>
<pre class="brush: php">

class Welcome extends WAANSER_Controller {

function Welcome()
{
parent::Controller();
}

function index()
{
$this-&gt;oMySmarty-&gt;assign(&#039;TEST_WAANSER&#039;, &#039;Smarty est OK&#039;);
$this-&gt;oMySmarty-&gt;display(&#039;welcome.tpl&#039;);
//$this-&gt;load-&gt;view(&#039;welcome_message&#039;);
}
}
</pre>
<p>Et de lui ajouter une variable avec la methode <strong>assign </strong>et de lui indiquer le template a afficher avec la methode <strong>display</strong>.</p>
<p>Ensuite ajouter le fichier <strong>welcome.tpl</strong> dans le dossier <strong>system\application\smarty\tpl</strong></p>
<pre class="brush: php">

&lt;p&gt;{$TEST_WAANSER}&lt;/p&gt;
</pre>
<p>Au prochain Tuto <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><br />
</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/framework/codeigniter/255-plateforme-php-partie-1-codeigniter-et-smarty.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Une approche de Zend Framework 1.7</title>
		<link>http://www.waanser.com/php/zend-framework/1425-une-approche-de-zend-framework-17.html</link>
		<comments>http://www.waanser.com/php/zend-framework/1425-une-approche-de-zend-framework-17.html#comments</comments>
		<pubDate>Thu, 09 Apr 2009 16:54:36 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1425</guid>
		<description><![CDATA[Zend fait parti de ces frameworks qui font beaucoup parler d&#8217;eux. Pour les néophytes ce n&#8217;est pas toujours évident de mettre en place et d&#8217;utiliser ce framework. Sans entrer dans les détails nous allons voir comment installer la dernière version en ligne de zend, la 1.7. Ce qu&#8217;il faut Si vous le savez pas, il [...]]]></description>
			<content:encoded><![CDATA[<p>Zend fait parti de ces frameworks qui font beaucoup parler d&#8217;eux. Pour les néophytes ce n&#8217;est pas toujours évident de mettre en place et d&#8217;utiliser ce framework. Sans entrer dans les détails nous allons voir comment installer la dernière version en ligne de zend, la 1.7.</p>
<h2>Ce qu&#8217;il faut</h2>
<p>Si vous le savez pas, il faut <strong>php5</strong> et activé le <strong>module_rewrite</strong> </p>
<div id="attachment_1426" class="wp-caption alignnone" style="width: 357px"><a href="http://media.waanser.com/2009/04/zend.png"><img src="http://media.waanser.com/2009/04/zend.png" alt="zend" title="zend" width="347" height="359" class="size-full wp-image-1426" /></a><p class="wp-caption-text">zend</p></div>
<p>Et on télécharge la <a href="http://framework.zend.com/download/latest">dernière version</a>.</p>
<p>On va créer notre dossier <em>zenfacile</em> où seront enregistrées les pages. Dans ce dossier on va créer un dossier <em>Zend</em>. Dans ce dossier on va mettre la librairie Zend.</p>
<p><a href="http://media.waanser.com/2009/04/zend1.png"><img src="http://media.waanser.com/2009/04/zend1.png" alt="zend" title="zend1" class="alignnone size-full wp-image-1428" /></a></p>
<h2>Arborescence</h2>
<p>L&#8217;arborescence de notre site va suivre une structure MVC traditionnel :<br />
<a href="http://media.waanser.com/2009/04/zend2.png"><img src="http://media.waanser.com/2009/04/zend2.png" alt="zend" title="zend2" class="alignnone size-full wp-image-1429" /></a></p>
<p>Comme on va faire de la réécriture d&#8217;url, on va ajouter un fichier .htaccess</p>
<pre class="brush: php">
# Règles de réécriture pour Zend Framework
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php

# Sécurité : Ne pas autoriser le parcours de répertoires
Options -Indexes

# Configuration PHP
php_flag magic_quotes_gpc off
php_flag register_globals off
php_flag short_open_tag on
</pre>
<p>voici le fichier <a href='http://media.waanser.com/2009/04/.htaccess'>.htaccess</a></p>
<p>Maintenant tout est prêt, on va pouvoir s&#8217;attaquer au php.<br />
(eh oui ça va très vite on y va pas avec de la dentelle) <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>On va commencer par l&#8217;index.php</p>
<p>On va pas se précipiter, on va déjà voir si la librairie est bien chargé :</p>
<pre class="brush: php">
error_reporting(E_ALL|E_STRICT);
ini_set(&#039;display_errors&#039;, 1);
date_default_timezone_set(&#039;Europe/Paris&#039;);

// mise en place des répertoires et chargement des classes
set_include_path(&#039;.&#039;
    . PATH_SEPARATOR . &#039;./library&#039;
    . PATH_SEPARATOR . &#039;./application/models/&#039;
    . PATH_SEPARATOR . get_include_path());
include &quot;Zend/Loader.php&quot;;

echo &#039;salut Zend !&#039;;
</pre>
<p>Le message salut Zend !  devrait s&#8217;afficher sur cette page  :<a href="http://localhost/zenfacile/" >http://localhost/zenfacile</a></p>
<p>C&#8217;est bon ? <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voici ce que l&#8217;on va mettre :</p>
<pre class="brush: php">
&lt;?php

error_reporting(E_ALL|E_STRICT);
ini_set(&#039;display_errors&#039;, 1);
date_default_timezone_set(&#039;Europe/Paris&#039;);

// mise en place des répertoires et chargement des classes
set_include_path(&#039;.&#039;
    . PATH_SEPARATOR . &#039;./library&#039;
    . PATH_SEPARATOR . &#039;./application/models/&#039;
    . PATH_SEPARATOR . get_include_path());
include &quot;Zend/Loader.php&quot;;

Zend_Loader::registerAutoload();

// setup controller
$frontController = Zend_Controller_Front::getInstance();
$frontController-&gt;throwExceptions(true);
$frontController-&gt;setControllerDirectory(&#039;./application/controllers&#039;);

// run!
$frontController-&gt;dispatch();
?&gt;
</pre>
<p>Normalement vous avez une belle fatal erreur :</p>
<hr/>
<b>Fatal error</b>:  Uncaught exception &#8216;Zend_Controller_Dispatcher_Exception&#8217; with message &#8216;Invalid controller specified (index)&#8217; in C:\wamp\www\zenfacile\Zend\Controller\Dispatcher\Standard.php:241<br />
Stack trace:#0 C:\wamp\www\zenfacile\Zend\Controller\Front.php(934): Zend_Controller_Dispatcher_Standard-&gt;dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 C:\wamp\www\zenfacile\index.php(23): Zend_Controller_Front-&gt;dispatch() #2 {main}<br />
  thrown in <b>C:\wamp\www\zenfacile\Zend\Controller\Dispatcher\Standard.php</b> on line <b>241</b></p>
<hr/>
<p>Pas de panique c&#8217;est normal <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Par défaut Zend recherche le contrôleur Index.</p>
<p>Et comme il n&#8217;existe pas, Zend nous génère une erreur.</p>
<h2>Strucuture MVC</h2>
<p>On va créer ce controleur :</p>
<hr/>
zenfacile => application => controllers => IndexControler.php</p>
<hr/>
<p>Le nom de la classe doit forcément ce terminer par <strong>Controller</strong></p>
<pre class="brush: php">
class IndexController extends Zend_Controller_Action
{
    function indexAction()
    {
    	 $this-&gt;view-&gt;title = &quot;Mon Zend&quot;;
    }
}
</pre>
<p>Il faut savoir que dans chaque controleur il y a des actions (qui est en fait des méthodes de la classe).<br />
Ces méthodes actions doivent se terminer par <strong>Action</strong>.<br />
Ainsi pour l&#8217;action Index la méthode l&#8217;appellera <strong>indexAction</strong>.</p>
<p>L&#8217;objet <strong>$this-&gt;view </strong> est l&#8217;objet qui manipule la vue.</p>
<p>Comme vous l&#8217;avez remarquez notre classe hérite de <strong>Zend_Controller_Action</strong>.</p>
<p>Comment fait-on pour retrouver cette classe ?</p>
<p>Facile ! On remplace les <strong>_</strong> par les <strong>/ </strong>. Et voilà, on a l&#8217;arborescence et le nom de la classe.<br />
Pour Zend_Controller_Action la classe se situeras dans :<br />
Zend => Controller =>Action.php</p>
<p><strong>La vue</strong></p>
<p>Pour la vue, il faut aller dans le dossier <strong>views </strong> créer un dossier <strong>scripts</strong>.<br />
Un fois ceci fait nous allons créer un dossier qui porte le nom du contrôleur. Le nom de notre vue sera alors <strong>index</strong>.</p>
<p>Le nom de la vue doit être le nom de l&#8217;action, son nom sera alors <strong>index.phtml</strong></p>
<hr/>
zenfacile => application => views => scripts => index => index.phtml</p>
<hr/>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;&lt;?php echo $this-&gt;escape($this-&gt;title); ?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;&lt;?php echo $this-&gt;escape($this-&gt;title); ?&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>et là on rafraichit <a href="http://localhost/zenfacile/"></a><br />
<a href="http://localhost/zenfacile/index/index"></a></p>
<p> on voit le message !  c&#8217;est que ça marche \o/</p>
<p>Pour la réécriture d&#8217;url zend fait vraiment simple. c&#8217;est http://lenomdusite/<strong>controleur</strong>/<strong>action</strong>. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
On va créer une autre page, une page contact (elle aussi sera toute simple)</p>
<pre class="brush: php">
    function contactAction()
    {
    	 $this-&gt;view-&gt;title = &quot;Contact&quot;;
    }
</pre>
<p>Avec une vue identique :</p>
<hr/>
zenfacile => application => views => scripts => index => contact.phtml</p>
<hr/>
<pre class="brush: html">
&lt;html&gt;
&lt;head&gt;
	&lt;title&gt;&lt;?php echo $this-&gt;escape($this-&gt;title); ?&gt;&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;&lt;?php echo $this-&gt;escape($this-&gt;title); ?&gt;&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Pour y accéder ça sera : <a href="http://localhost/zenfacile/">http://localhost/zenfacile/index/contact</a></p>
<p>Et voila notre Zend est installé, pour ne pas trop alourdir le tutoriel, j&#8217;ai fait l&#8217;impasse sur des notions importantes comme le MVC, si vous avez des questions n&#8217;hésitez pas à poster un commentaire.</p>
<p>Voici le dossier complet : <a href='http://media.waanser.com/2009/04/zenfacile.rar'>zenfacile</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/zend-framework/1425-une-approche-de-zend-framework-17.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Les données clés de l&#8217;API facebook avec le FQL</title>
		<link>http://www.waanser.com/php/api-facebook/1308-les-donnees-cles-de-lapi-facebook-avec-le-fql.html</link>
		<comments>http://www.waanser.com/php/api-facebook/1308-les-donnees-cles-de-lapi-facebook-avec-le-fql.html#comments</comments>
		<pubDate>Sat, 04 Apr 2009 16:30:13 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Api Facebook]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1308</guid>
		<description><![CDATA[Avec toutes les données que nous fournit l&#8217;api facebook il est facile de se perdre. Cette article va vous aider à y voir plus clair. Les statistiques avec la table Metrics Si vous voulez vendre de la publicité dans votre site, ou tout simplement connaitre le traffic de votre gadget il essentiel de connaitre les [...]]]></description>
			<content:encoded><![CDATA[<p>Avec toutes les données que nous fournit l&#8217;api facebook il est facile de se perdre.<br />
Cette article va vous aider à y voir plus clair.</p>
<h2>Les statistiques avec la table Metrics</h2>
<p>Si vous voulez vendre de la publicité dans votre site, ou tout simplement connaitre le traffic de votre gadget il essentiel de connaitre les statiques. Ces informations se trouvent dans la table <strong>Metrics</strong>.</p>
<p>Les statistiques se font sur une portion de temps. (ex : du 01/02/2009 au 01/03/2009).<br />
Pour définir cette portion de temps à notre table Metrics, il faut définir 2 champs ; <strong>end_time</strong> et <strong>period </strong>.</p>
<p><strong>end_time</strong> : la date de début de votre portion en <strong>timestamp </strong><br />
<strong>period </strong> : la durée en seconde de votre portion.</p>
<hr/>
Les informations qui me paraisse importantes :</p>
<p><strong>active_users </strong>: le nombre d&#8217;utilisateur unique<br />
<strong>canvas_page_views </strong>: le nombre de page vue<br />
<strong>unique_adds</strong> : le nombre de fois que votre application à été ajoutée.<br />
<strong>unique_removes</strong> : le nombre de fois que votre application à été enlevée.<br />
<strong>unique_blocks</strong> : le nombre de fois que votre application à été bloquée.<br />
<strong>unique_unblocks</strong> : le nombre de fois que votre application à été débloquée.</p>
<hr/>
Pour récupérer les statistiques ce n&#8217;est pas une chose aisée avec facebook.<br />
Déjà nous somme limité dans les périodes, on a le choix entre 86400 (1 jour), 604800(1 semaine) et 2592000(1 moi).<br />
Pour le timestamp il faut qu&#8217;il doit définit à 9 heure (j&#8217;ai pas bien compris).</p>
<p>C&#8217;est compliqué ? Je vais vous montrez un exemple.</p>
<pre class="brush: php">
$iTime = mktime(9, 0, 0, date(&#039;m&#039;)-1, date(&#039;d&#039;), date(&#039;Y&#039;)); // il ya 1 moi en timestamp
$sQuery = &#039;SELECT end_time, period, active_users, canvas_page_views  FROM metrics WHERE end_time =&#039;.$iTime.&#039; AND period = 2592000&#039;;
$aStatInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
// un affichage bête et méchant
echo&#039;&lt;pre&gt;&#039;;
var_dump($aStatInformation);
echo&#039;&lt;/pre&gt;&#039;;
</pre>
<hr/>
Ce code source renvoi les statistiques du moi dernier</p>
<div id="attachment_1304" class="wp-caption alignnone" style="width: 272px"><a href="http://media.waanser.com/2009/03/fql3.jpg"><img src="http://media.waanser.com/2009/03/fql3.jpg" alt="fql" title="fql3" width="262" height="198" class="size-full wp-image-1304" /></a><p class="wp-caption-text">fql</p></div>
<p>Vous avez remarquez que l&#8217;on a pas récupérer ces quatre données<strong> unique_adds, unique_removes, unique_blocks, unique_unblocks</strong>.<br/><br />
C&#8217;est parce que facebook nous complique la tache.<br />
En effet si on veut récupérer ces données il faut que la portion de temps soit d&#8217;un jour (et non d&#8217;un mois).<br />
Pour récupérer ces données pour un mois on va faire un script à part :</p>
<pre class="brush: php">
$iDay = 1;// jour 1
$aResult = array(&#039;unique_adds&#039; =&gt; 0,&#039;unique_removes&#039; =&gt; 0,&#039;unique_blocks&#039; =&gt; 0,&#039;unique_unblocks&#039; =&gt; 0);
while($iDay&lt;31) // pour un mois
{	// on convertit notre date en time stamp
	$iTime = mktime(9, 0, 0, date(&#039;m&#039;), date(&#039;d&#039;)-$iDay, date(&#039;Y&#039;));
	$sQuery = &#039;SELECT unique_adds, unique_removes, unique_blocks, unique_unblocks  FROM metrics WHERE end_time =&#039;.$iTime.&#039; AND period = 86400&#039;;
	$aStatInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
	if (is_array($aStatInformation)){//  on sotcke les infos
		foreach($aStatInformation[0] as $iKey =&gt; $iVal)
		{
			$aResult[$iKey]+=(int)$iVal;
		}
	}
	$iDay++;
}
// on affiche le résultat
echo&#039;&lt;pre&gt;&#039;;
var_dump($aResult);
echo&#039;&lt;/pre&gt;&#039;;
</pre>
<hr/>
Eh voila on à les informations qu&#8217;il nous faut <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<br/></p>
<h2>Cibler les utilisateurs avec les tables fan et groups</h2>
<p>Cibler les utilisateurs et un atout essentiel si vous voulez optimiser le rendement de vos pubs.<br />
La table <strong>fan</strong> permet de savoir quel page l&#8217;utilisateur est fan.<br />
<br/><br />
Voici comment faire pour récupérer ces pages. (biensur on a besoin de l&#8217;id utilisateur)</p>
<pre class="brush: php">
//on récupère l&#039;id de l&#039;utilisateur
$sUser_id = $oFacebook-&gt;user;
//récupérer les id des pages
$sQuery = &#039;SELECT page_id, type FROM page_fan	 WHERE uid=&#039; . $sUser_id.;
$aUserInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
</pre>
<p><br/><br />
Les ids des pages nous parlent pas beaucoup. Mais ce n&#8217;est pas un problème, on va utiliser une autre table<br />
pour récupérer les informations de ces pages.<br />
La table <strong>page</strong> est une des plus grosses tables de facebook, voici ça <a href="http://wiki.developers.facebook.com/index.php/Page_(FQL)">structure</a>.</p>
<hr/>
Si vous utilisez souvent facebook, vous savez qu&#8217;une page peut recenser tout et n&#8217;importe quoi (une entreprise, un individu, un lieu, un événement &#8230;). Il n&#8217;est pas nécessaires de récupérer toutes les données (cela risque d&#8217;alourdir votre application et votre base de données).</p>
<p>Dans cet exemple nous allons récupérez l&#8217;essentiel (le nom, l&#8217;image représentative,le type, les informations générales et le nombre de page) </p>
<pre class="brush: php">
//on récupère l&#039;id de l&#039;utilisateur
$sUser_id = $oFacebook-&gt;user;

//on récupère les informations importantes
$sQuery = &#039;SELECT name, pic, type, website, general_info,  fan_count from, website page where page_id IN (SELECT page_id, type FROM page_fan	 WHERE uid=&#039; . $sUser_id.&#039;)&#039;;  

$aUserInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
</pre>
<hr/>
La table <strong>group</strong> va permettre de savoir tout sur les groupes de l&#8217;utilisateur en cours</p>
<p>Rien de particulier sur cette table, on y accède de la même manière que pour la page <strong>fan</strong> :</p>
<pre class="brush: php">
//on récupère l&#039;id de l&#039;utilisateur
$sUser_id = $oFacebook-&gt;user;

// on récupère les informations du groupe
$sQuery = &#039;SELECT name, pic, description, group_type, group_subtype, website from group where gid IN (SELECT gid FROM group_member WHERE uid=&#039; . $sUser_id.&#039;)&#039;;  

$aUserInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
</pre>
<hr/>
<h2>Les permissions avec la table Permissions</h2>
<p>Comme son nom l&#8217;indique, la table <strong>permissions</strong> va nous dire ce que notre gadget peut ou pas faire.<br />
Dans cette table ce qui va nous intéresser, c&#8217;est de savoir si on peut leur envoyer des sms ou des mails.<br />
ps : si on a l&#8217;autorisation, ce n&#8217;est pas une bonne raison pour faire du spam <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voici la requête :</p>
<pre class="brush: php">
//on récupère l&#039;id de l&#039;utilisateur
$sUser_id = $oFacebook-&gt;user;

// les permissions pour l&#039;envoi de mail et de sms
$sQuery = &#039;SELECT email, sms FROM permissions WHERE uid=&#039; . $sUser_id;  

$aUserInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
</pre>
<hr/>
Le résultat sera renvoyé sous la forme de booléen.<br />
 0 : on a pas la permission<br />
 1 : on a la permission</p>
<p>Pour avoir la permission il faut utiliser le fbml. plus précisément la balise <strong>&lt;fb:prompt-permission&gt;</strong></p>
<p>L&#8217;attribut perms est obligatoir puisque c&#8217;est lui qui va définir quelle autorisation à accorder. (pour nous ça sera <strong>sms </strong>et <strong>mail</strong>)</p>
<pre class="brush: html">
&lt;fb:prompt-permission perms=&quot;email&quot;&gt;Autorisez vous l&#039;application a envoyez des mails&lt;/fb:prompt-permission&gt;
</pre>
<p>Si l&#8217;utilisateur clique sur le lien, une fenêtre devrait apparaître :</p>
<div id="attachment_1409" class="wp-caption alignnone" style="width: 160px"><a href="http://media.waanser.com/2009/04/apifacebook.png"><img src="http://media.waanser.com/2009/04/apifacebook-150x150.jpg" alt="apifacebook" title="apifacebook" width="150" height="150" class="size-thumbnail wp-image-1409" /></a><p class="wp-caption-text">apifacebook</p></div>
<p> Voila nous avons fait le tour des données clé de l&#8217;api facebook. A travers ces exemples on a pu voir le fonctionnement de la base de données facebook. Comme je vous l&#8217;ai déjà dit, chaque donnée a son utilité, et c&#8217;est en fonction de vos projet que vous allez devoir choisir les données à récupérer. Le choix des données est une étape très importante, parce que vous pouvez manquez une information importantes ou alourdir votre base pour rien (à l&#8217;échelle de milliers d&#8217;utilisateurs, cela peut venir vite une catastrophe).</p>
<hr/>
Update : J&#8217;ai mis en ligne une documentation sur le fql, si vous êtes intéressé c&#8217;est <a href="http://www.waanser.com/documentation-base-de-donnees-facebook">par ici</a></p>
<hr/>
Si vous avez des questions, vous pouvez laissez un commentaire. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/api-facebook/1308-les-donnees-cles-de-lapi-facebook-avec-le-fql.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>La révolution du debug avec FirePHP</title>
		<link>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html</link>
		<comments>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html#comments</comments>
		<pubDate>Wed, 01 Apr 2009 15:15:50 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Général]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1382</guid>
		<description><![CDATA[Il y a autant de technique de développement que de façon de debugger. Les normes de développement et consensus permettent au développeur de produire du code propre. Mais pour ce qui est du débug, chaque développeur débug comme il le sent (les affichages bruts à l&#8217;écran, la création de fichier de log, ou l&#8217;envoi des [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a autant de technique de développement que de façon de debugger. Les normes de développement et consensus permettent au développeur de produire du code propre. Mais pour ce qui est du débug, chaque développeur débug comme il le sent (les affichages bruts à l&#8217;écran, la création de fichier de log, ou l&#8217;envoi des données par mail).En plus de mettre de l&#8217;ordre dans le debug, le plugin Firephp permet aussi de faire des deboggages plus optimisés.</p>
<h2>FirePHP qu&#8217;est ce que c&#8217;est ?</h2>
<p>Tout d&#8217;abord FirePHP  est un plugin firefox, qui s&#8217;attache à celui de firebug.<br />
 Les données de debug sont représentées de cette façon :<br />
<a href="http://media.waanser.com/2009/04/firephp.png"><img src="http://media.waanser.com/2009/04/firephp.png" alt="firephp" title="firephp" class="alignnone size-full wp-image-1383" /></a></p>
<p>C&#8217;est à l&#8217;aide d&#8217;une classe php, que l&#8217;on va définir les données de debug à afficher.<br />
Et c&#8217;est cette classe php, qui envoie ces données au format JSON.<br />
Pour finir le plugin s&#8217;occupe d&#8217;afficher les données.</p>
<p>Passons maintenant à la pratique <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><strong>Installation</strong></p>
<p>Si vous ne l&#8217;avez pas fait , il faut installer <a href="https://addons.mozilla.org/fr/firefox/addon/1843">firebug</a>,une fois ceci fait, vous pouvez installer le plugin <a href="https://addons.mozilla.org/en-US/firefox/addon/6149">firephp</a>.</p>
<p>Maintenant nous allons récupérer la dernière version de la <a href="http://framework.zend.com/download/latest">librairie </a>.</p>
<p>Nous allons voir si firePHP fonctionne :</p>
<pre class="brush: php">
require_once &#039;./FirePHPCore/FirePHP.class.php&#039;;
$oFirebug = FirePHP::getInstance(true);
$oFirebug-&gt;fb(&#039;FirePhp fonctionne !&#039;);
</pre>
<p>Voilà ce que cela doit donner :</p>
<p><a href="http://media.waanser.com/2009/04/firephp1.png"><img src="http://media.waanser.com/2009/04/firephp1.png" alt="firephp" title="firephp1" class="alignnone size-full wp-image-1388" /></a></p>
<p>Si vous ne voyez rien, c&#8217;est que vous avez oublié d&#8217;activer la surveillance réseau de votre firebug:</p>
<p><a href="http://media.waanser.com/2009/04/firephp2.png"><img src="http://media.waanser.com/2009/04/firephp2.png" alt="firebug surveillance réseau" title="firephp2" class="alignnone size-full wp-image-1389" /></a></p>
<h2>Utilisation de firePhp</h2>
<p>Avant toute chose, il faut bien avoir en tête que ces données sont visibles par tous les visiteurs qui possèdent firePHP. Il est préférable d&#8217;afficher les données dans un environnement de développement ou de test.</p>
<p>Normalement avec l&#8217;exemple de fonctionnement vous avez déjà du tout comprendre <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>$oFirebug  = FirePHP::getInstance(true);</strong><br />
c&#8217;est notre objet firebug.<br />
<strong>$f->fb(&#8216;FirePhp fonctionne !&#8217;);</strong><br />
 pour afficher un message.</p>
<p><strong>Grouper les variables de debug</strong></p>
<p>Vous pouvez regroupez vos variables de debug avec Firephp. Cela peut être utile si vos tests se font sur plusieurs fonctions.</p>
<pre class="brush: php">
$oFirebug-&gt;group(&#039;Fonction animal&#039;);
$oFirebug-&gt;log(&#039;Chien&#039;);
$oFirebug-&gt;log(&#039;Chat&#039;);
$oFirebug-&gt;log(&#039;Poisson&#039;);
$oFirebug-&gt;groupEnd();

$oFirebug-&gt;group(&#039;Fonction ville&#039;);
$oFirebug-&gt;log(&#039;Lens&#039;);
$oFirebug-&gt;log(&#039;Rennes&#039;);
$oFirebug-&gt;log(&#039;Caen&#039;);
$oFirebug-&gt;groupEnd();
</pre>
<p>Voilà ce que ça donne :</p>
<p><a href="http://media.waanser.com/2009/04/firephp3.png"><img src="http://media.waanser.com/2009/04/firephp3.png" alt="firephp" title="firephp3" class="alignnone size-full wp-image-1391" /></a></p>
<p><strong>Définir des niveaux d&#8217;erreurs</strong></p>
<p>Tout comme l&#8217;objet error_reporting de php, avec firePHP on peux définir un niveau d&#8217;erreur.</p>
<p>méthode <strong>info</strong> : ressemble au notice<br />
méthode <strong>warn</strong> : ressemble au warning<br />
méthode <strong>error</strong> : ressemble au fatal error</p>
<pre class="brush: php">
$oFirebug-&gt;log(&#039;Plain Message&#039;);     // or FB::
$oFirebug-&gt;info(&#039;Info Message&#039;);     // or FB::
$oFirebug-&gt;warn(&#039;Warn Message&#039;);     // or FB::
$oFirebug-&gt;error(&#039;Error Message&#039;);   // or FB::
</pre>
<p>Firebug va donc afficher :</p>
<p><a href="http://media.waanser.com/2009/04/firephp4.png"><img src="http://media.waanser.com/2009/04/firephp4.png" alt="firephp" title="firephp4" class="alignnone size-full wp-image-1392" /></a></p>
<p><strong>Afficher les tableaux</strong></p>
<p>C&#8217;est avec la méthode <strong>table()</strong> que l&#8217;on va pouvoir afficher les tableaux avec FirePHP</p>
<p>Voici un exemple de code :</p>
<pre class="brush: php">
$aTable   = array();
$aTable[] = array(&#039;Col 1 Heading&#039;,&#039;Col 2 Heading&#039;);
$aTable[] = array(&#039;Row 1 Col 1&#039;,&#039;Row 1 Col 2&#039;);
$aTable[] = array(&#039;Row 2 Col 1&#039;,&#039;Row 2 Col 2&#039;);
$aTable[] = array(&#039;Row 3 Col 1&#039;,&#039;Row 3 Col 2&#039;);

$oFirebug-&gt;table(&#039;Table Label&#039;, $aTable)
</pre>
<p>Cela donne :</p>
<p><a href="http://media.waanser.com/2009/04/firephp5.png"><img src="http://media.waanser.com/2009/04/firephp5.png" alt="firephp" title="firephp5" class="alignnone size-full wp-image-1393" /></a></p>
<p><strong>Laissez des traces avec trace()</strong></p>
<p>Affiche un bascktrace de la ligne ou est tapée la méthode <strong>trace()</strong>.</p>
<p>Voici un exemple d&#8217;utilisation:</p>
<pre class="brush: php">
mess($oFirebug);
function mess($oFirebug)
{
 $oFirebug-&gt;trace(&#039;Trace Label&#039;);
}
</pre>
<p>Firephp va afficher :</p>
<p><a href="http://media.waanser.com/2009/04/firephp6.png"><img src="http://media.waanser.com/2009/04/firephp6.png" alt="firephp" title="firephp6" class="alignnone size-full wp-image-1396" /></a></p>
<p><strong>Attraper les erreurs avec firePhp</strong></p>
<p>On peut aussi gérer l&#8217;affichage des erreurs par firePhp</p>
<pre class="brush: php">
$oFirebug-&gt;registerErrorHandler();
$oFirebug-&gt;registerExceptionHandler();

try {
  throw new Exception(&#039;Test erreur&#039;);
} catch(Exception $e) {
  $oFirebug-&gt;error($e);
}
</pre>
<p>Et voila notre belle erreur <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><a href="http://media.waanser.com/2009/04/firephp7.png"><img src="http://media.waanser.com/2009/04/firephp7.png" alt="firephp" title="firephp7" class="alignnone size-full wp-image-1398" /></a></p>
<p>On a fait le tour de firePhp, vous pouvez maintenant debugger en toute transparence.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/general-php/1382-la-revolution-du-debug-avec-firephp.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le FQL avec l&#8217;api facebook</title>
		<link>http://www.waanser.com/php/api-facebook/1362-le-fql-avec-lapi-facebook.html</link>
		<comments>http://www.waanser.com/php/api-facebook/1362-le-fql-avec-lapi-facebook.html#comments</comments>
		<pubDate>Tue, 31 Mar 2009 17:45:43 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Api Facebook]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1362</guid>
		<description><![CDATA[Api facebook offre généreusement une bonne partie de sa base données via le FQL. Nous allons voir dans ce tutoriel comment exploiter au mieux ces données. Dans ce tutoriel, il est nécessaire d&#8217;avoir des bases en SQL. Le FQL qu&#8217;es-ce ce que c&#8217;est ? On pourrait dire que le FQL c&#8217;est le SQL de facebook. [...]]]></description>
			<content:encoded><![CDATA[<p>Api facebook offre généreusement une bonne partie de sa base données via le FQL.<br />
Nous allons voir dans ce tutoriel comment exploiter au mieux ces données.</p>
<p>Dans ce tutoriel, il est nécessaire d&#8217;avoir des bases en SQL.</p>
<h2>Le FQL qu&#8217;es-ce ce que c&#8217;est ?</h2>
<p>On pourrait dire que le FQL c&#8217;est le SQL de facebook. Mais en fait, bien qu&#8217;il ressemble au sql il n&#8217;en est rien, parce que le FQL<br />
est interprété et traité (par l&#8217;API facebook).<br/></p>
<p><strong><u>Oui, pour nous, ça change rien ?</u></strong></p>
<p>Contrairement au SQL, on ne peut pas modifier les données (UPDATE,DELETE,UPDATE).<br />
De plus il est évident que facebook nous ne donne pas la possibilité de récupérer toute sa base de données.(il est pas fou facebook:)) Il faut forcément un identifiant (d&#8217;une personne, un groupe &#8230;) pour accéder aux informations.<br/></p>
<p> Ne vous inquiéter pas si le FQL ne vous paraît pas clair, avec quelques exemples vous comprendrez tout de suite ce que je veux dire <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h2>Notre première requête FQL</h2>
<p>Déjà on va se connecter à notre API. </p>
<pre class="brush: php">
// on charge la librairie facebook
require_once &#039;lib-facebook/facebook.php&#039;;

// on définit la clé et le code secret
$sAppapikey = CLE;
$sAppsecret = CODE SECRET;

// on se connecte à facebook par la création d&#039;un objet Facebook
$oFacebook = new Facebook($sAppapikey, $sAppsecret);

// on demande à l&#039;utilisateur de se loguer
$oFacebook-&gt;require_login();

//on récupère l&#039;id de l&#039;utilisateur
$sUser_id = $oFacebook-&gt;user;
</pre>
<p>On va pas faire compliquer pour notre première requête FQL, on va juste récupérer les informations principales de<br />
l&#8217;utilisateur en cours. C&#8217;est à dire son nom, prénom, date de naissance,sexe,photo.</p>
<pre class="brush: php">
//notre requête FQL
$sQuery = &#039;SELECT first_name,last_name,birthday,sex,pic_big FROM user WHERE uid=&#039; . $sUser_id;  

// information de notre utilisateur
$aUserInformation = $oFacebook-&gt;api_client-&gt;fql_query($sQuery);
</pre>
<p>Comme vous le voyez nous avons interrogé la table <strong>user</strong> pour récupérer les informations de l&#8217;utilisateur en cours.</p>
<p>Par défaut le résultat retourné est sous forme de tableau.</p>
<div id="attachment_1296" class="wp-caption alignnone" style="width: 566px"><a href="http://media.waanser.com/2009/03/fql.jpg"><img src="http://media.waanser.com/2009/03/fql.jpg" alt="fql" title="fql" width="556" height="218" class="size-full wp-image-1296" /></a><p class="wp-caption-text">fql</p></div>
<p>Maintenant c&#8217;est pas compliqué pour mettre tout ça en forme</p>
<pre class="brush: php">
// affichage des données
echo &#039;&lt;h1&gt;Mes informations&lt;/h1&gt;&lt;br/&gt;&#039;;
echo &#039;nom : &#039;.$aUserInformation[0][&#039;last_name&#039;].&#039;&lt;br/&gt;&#039;;
echo &#039;prenom : &#039;.$aUserInformation[0][&#039;first_name&#039;].&#039;&lt;br/&gt;&#039;;
echo &#039;date de naissance : &#039;.$aUserInformation[0][&#039;birthday&#039;].&#039;&lt;br/&gt;&#039;;
echo &#039;sexe : &#039;.$aUserInformation[0][&#039;sex&#039;].&#039;&lt;br/&gt;&#039;;
echo &#039;photo :&lt;br/&gt; &lt;img src=\&#039;&#039;.$aUserInformation[0][&#039;pic_big&#039;].&#039;\&#039;/&gt;&#039;;
</pre>
<p>Voila ce que ça donne :</p>
<div id="attachment_1298" class="wp-caption alignnone" style="width: 193px"><a href="http://media.waanser.com/2009/03/fql1.jpg"><img src="http://media.waanser.com/2009/03/fql1.jpg" alt="fql" title="fql1" width="183" height="244" class="size-full wp-image-1298" /></a><p class="wp-caption-text">fql</p></div>
<p>Voila nous avons fait notre première requête. On va pouvoir savoir tout sur nos utilisateurs :p. </p>
<p>Stocker ces informations sur une base de données:</p>
<p>Il est toujours intéressant de stocker les informations sur une base de données. Il est bien important d&#8217;optimiser<br />
votre base en fonction de votre application (et non de la base facebook).<br />
Par exemple pour le sexe plutôt que stocker male ou female, il est plus intéressant de stocker 2 id différents qui feront référence à une table.<br />
Si vous stockez les informations de facebook pour être en toute légalité, n&#8217;oubliez pas de faire un tour à la <a href="http://www.cnil.fr">cnil </a>pour faire  une déclaration de fichier.</p>
<h2>La base de données Facebook</h2>
<p>Vous pouvez avoir toute la structure de la base de données facebook sur la <a href="http://wiki.developers.facebook.com/index.php/FQL_Tables">documentation</a>.Hélas elle n&#8217;est qu&#8217;en anglais <img src='http://www.waanser.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Actuellement il y a 23 tables que l&#8217;ont peut interroger. Cela fait une quantité astronomique de données que l&#8217;on peut récupérer.<br />
Il est essentiel de bien comprendre l&#8217;utilité de chaque table et surtout de savoir faire le tri entre toutes ses données.</p>
<p><strong>note sur la documentation :</strong> en FQL il est nécessaire d&#8217;utiliser un critère (clause <strong>WHERE</strong>)<br />
sur un élément marqué par une étoile &laquo;&nbsp;*&nbsp;&raquo;.</p>
<div id="attachment_1303" class="wp-caption alignnone" style="width: 503px"><a href="http://media.waanser.com/2009/03/fql2.jpg"><img src="http://media.waanser.com/2009/03/fql2.jpg" alt="fql" title="fql2" width="493" height="214" class="size-full wp-image-1303" /></a><p class="wp-caption-text">fql</p></div>
<p>Dans cette exemple, pour récupérer les information d&#8217;un utilisateur on a besoin forcément de son <strong>uid</strong> ou de son <strong>name</strong>.</p>
<p>Bon si vous n&#8217;êtes pas motivé pour éplucher toute la doc, très prochainement un tutoriel sur les données clés de facebook va voir le jour. <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En attentant vous pouvez toujours poster un commentaire pour une remarque ou une interrogation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/api-facebook/1362-le-fql-avec-lapi-facebook.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Code igniter et la base de données</title>
		<link>http://www.waanser.com/php/framework/1337-code-igniter-et-la-base-de-donnees.html</link>
		<comments>http://www.waanser.com/php/framework/1337-code-igniter-et-la-base-de-donnees.html#comments</comments>
		<pubDate>Tue, 31 Mar 2009 17:01:10 +0000</pubDate>
		<dc:creator>roul</dc:creator>
				<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://www.waanser.com/?p=1337</guid>
		<description><![CDATA[Nous allons voir comment interagir avec une base de données avec code igniter. Dans ce tutoriel nous reprendrons l&#8217;exemple de cet article. Création du formulaire Pour créer notre formulaire, nous allons faire appel au helper (form). Un helper est une librairie de code igniter. Dans le controleur ecoleCtr, nous allons charger la vue ajoutEleve. public [...]]]></description>
			<content:encoded><![CDATA[<p>Nous allons voir comment interagir avec une base de données avec code igniter.<br />
Dans ce tutoriel nous reprendrons l&#8217;exemple de cet <a href="http://www.waanser.com/php/1080-un-simple-select-avec-code-igniter.html">article</a>.</p>
<h2>Création du formulaire </h2>
<p>Pour créer notre formulaire, nous allons faire appel au helper (form). </p>
<p><a href="http://media.waanser.com/2009/03/code_igniter6.png"><img src="http://media.waanser.com/2009/03/code_igniter6.png" alt="code_igniter" title="code_igniter6" class="alignnone size-full wp-image-1338" /></a></p>
<p>Un <strong>helper </strong>est une librairie de code igniter.</p>
<p>Dans le controleur ecoleCtr, nous allons charger la vue ajoutEleve.</p>
<pre class="brush: php">
    public function __construct()
    {
        parent::__construct();
        $this-&gt;load-&gt;helper(&#039;form&#039;);
    }
    public function ajoutEleve()
    {
		$this-&gt;load-&gt;view(&#039;ajoutEleve&#039;);
    }
</pre>
<p>Maintenant dans la vue ajoutEleve nous allons utiliser la commande <strong>form_open</strong> pour construire le formulaire.</p>
<p>la synthaxe : form_open(méthode du contrôleur où seront envoyées les données du formulaire); </p>
<p>Pour nous ça va être :</p>
<pre class="brush: html">
&lt;?=form_open(&#039;ecoleCtr/insertEleve&#039;);?&gt;

&lt;p&gt;nom : &lt;input type=&quot;text&quot; name=&quot;nom&quot;/&gt;&lt;/p&gt;
&lt;p&gt;prenom : &lt;input type=&quot;text&quot; name=&quot;prenom&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;envoyer&quot;/&gt;&lt;/p&gt;
</pre>
<p>Attention  les noms de champs doivent être les même que ceux de la base.<br />
Cela va permettre d&#8217;insérer les données dans la base plus facilement.</p>
<h2>Envoi et traitement des données</h2>
<p>Stocker les données avec Code Ingiter se fait très rapidement <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>On va utiliser la méthode <strong>insert</strong> de la librairie <strong>db</strong>.</p>
<pre class="brush: php">
    public function insertEleve()
    {
		$this-&gt;db-&gt;insert(&#039;user&#039;,$_POST);
    }
</pre>
<p>Un fois que vous validez votre formulaire si vous tombez sur cette adresse :</p>
<p>http://example.com/index.php/eleveCtr/eleve_insert</p>
<p>C&#8217;est que vous avez oublier comme moi de remplir :</p>
<pre class="brush: php">
$config[&#039;base_url&#039;]	= &quot;http://localhost/ecole&quot;;
</pre>
<p>dans system-> application -> config -> config.php</p>
<p><u><strong>Redirection</strong></u></p>
<p>On va rediriger notre utilisateur à la page où il y a la liste d&#8217;élève.</p>
<p>Avec Code Igniter pour faire des redirections on a besoin du <strong>helper url</strong></p>
<pre class="brush: php">
       $this-&gt;load-&gt;helper(&#039;url&#039;);
</pre>
<p>La méthode <strong>redirect(<em>chemin</em>,<em>type</em>);</strong> s&#8217;occupe de la redirection.</p>
<p>Pour nous ça sera :</p>
<pre class="brush: php">
redirect(&#039;/ecoleCtr/listeEleve&#039;, &#039;refresh&#039;);
</pre>
<h2>Modification Update avec CI</h2>
<p>Maintenant que nous savons insérer des données nous allons apprendre à les modifier <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Retournons dans notre vue <strong>listeEleve.php</strong> <img src='http://www.waanser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ecole -> system -> application -> views-> listeEleve.php</p>
<p>Pour chaque élève, on va ajouter un lien vers un formulaire pour modifier les informations de cet élève.</p>
<p><u><strong>Les liens avec anchor</strong></u></p>
<p>La syntaxe n&#8217;est pas compliqué<strong> anchor(<em>url</em>,<em>texte</em>)</strong></p>
<p>Donc dans notre exemple nous allons rediriger vers la méthode <strong>modifEleve </strong>de <strong>ecoleCtr</strong>;</p>
<pre class="brush: php">
&lt;td&gt;&lt;?=anchor(&#039;ecoleCtr/modifEleve/&#039;.$oEleve-&gt;id, &#039;Modifier&#039;);?&gt;&lt;/td&gt;
</pre>
<p>Rendez vous dans le modèle</p>
<p>ecole -> system -> application -> models -> ecoleMod.php</p>
<p>On va modifier notre fonction :</p>
<pre class="brush: php">
    public function getEnfant($aRestriction = null)
    {
    	if (is_array($aRestriction))
    	{
	    	foreach ($aRestriction as $sKey =&gt; $sValue)
	    	{
	    		$this-&gt;db-&gt;where($sKey, $sValue);
	    	}
    	}
    	$oEleve=$this-&gt;db-&gt;get(&#039;eleve&#039;);
    	return $oEleve-&gt;result();
    }
</pre>
<p><strong>La clause $this->db->where</strong></p>
<p>La clause $this->db->where va nous permettre de créer nos requête de projections.<br />
Le premier paramètre est l&#8217;attribut de la table et le second est la valeur.<br />
Par exemple :<br />
$oEleve=$this->db->get(&#8216;eleve&#8217;);<br />
$this->db->where(&#8216;nom&#8217;, &#8216;paul&#8217;); </p>
<p>donnera SELECT * FROM eleve WHERE nom = paul</p>
<p>On s&#8217;est occupé du modèle, on va pouvoir redescendre au contrôleur <img src='http://www.waanser.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />
Bon là rien de nouveau :</p>
<pre class="brush: php">
    public function modifEleve()
    {
    	$this-&gt;load-&gt;model(&#039;ecoleMod&#039;);
    	$iIdEleve = $this-&gt;uri-&gt;segment(3);
		$aEleve = $this-&gt;ecoleMod-&gt;getEnfant(array(&#039;id&#039;=&gt;$iIdEleve));
		$aData[&#039;nom&#039;] = $aEleve[0]-&gt;nom;
		$aData[&#039;prenom&#039;] = $aEleve[0]-&gt;prenom;
		$aData[&#039;id&#039;] = $aEleve[0]-&gt;id;
		$this-&gt;load-&gt;view(&#039;modifEleve&#039;,$aData);
    }
</pre>
<p>Pareil pour la vue <strong>modifEleve</strong>, on est sur du terrain connu</p>
<pre class="brush: html">
&lt;html&gt;
&lt;body&gt;
&lt;h1&gt;Modification d&#039;un eleve&lt;/h1&gt;

&lt;?=form_open(&#039;ecoleCtr/updateEleve/&#039;.$id);?&gt;

&lt;p&gt;nom : &lt;input type=&quot;text&quot; name=&quot;nom&quot; value =&quot;&lt;?=$nom?&gt;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;prenom : &lt;input type=&quot;text&quot; name=&quot;prenom&quot; value =&quot;&lt;?=$prenom?&gt;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;envoyer&quot;/&gt;&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;
</pre>
<p><strong>La clause $this->db->update</strong></p>
<p>pour faire un update avec un code igniter on a besoin de la méthode<strong>where </strong> et <strong>update</strong>.</p>
<p><strong>$this->db->where(<em>attribut</em>,<em>valeur</em>)</strong></p>
<p>Faites bien attention à cette méthode, une erreur et Code Igniter modifie tous les champs de la table.<br />
(et oui ça m&#8217;est arrivé ^^)</p>
<p><strong>$this->db->update(<em>table</em>,<em>valeurs</em>)</strong></p>
<p>Notre méthode updateEleve va ressembler à ça :</p>
<pre class="brush: php">
    public function updateEleve()
    {
    	$this-&gt;db-&gt;where(&#039;id&#039;, $this-&gt;uri-&gt;segment(3));
		$this-&gt;db-&gt;update(&#039;eleve&#039;,$_POST);
		 redirect(&#039;/ecoleCtr/listeEleve&#039;, &#039;refresh&#039;);
    }
</pre>
<p>Voila ce tutoriel est terminé, votre base de données n&#8217;a plus qu&#8217;à bien se tenir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.waanser.com/php/framework/1337-code-igniter-et-la-base-de-donnees.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

