<?xml
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:atom="http://www.w3.org/2005/Atom"
>

<channel xml:lang="fr">
	<title>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
	<link>https://vader-fr.fr/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	<atom:link href="https://vader-fr.fr/spip.php?id_mot=1&amp;page=backend" rel="self" type="application/rss+xml" />

	<image>
		<title>Vader[FR] : ce n'est pas un blog, c'est un Sith</title>
		<url>https://vader-fr.fr/local/cache-vignettes/L144xH144/siteon0-c1872.jpg?1771612673</url>
		<link>https://vader-fr.fr/</link>
		<height>144</height>
		<width>144</width>
	</image>



<item xml:lang="fr">
		<title>Script g&#233;n&#233;rique des diaporamas AJAX</title>
		<link>https://vader-fr.fr/spip.php?article144</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article144</guid>
		<dc:date>2014-10-18T19:53:27Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>JavaScript</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>D&#233;veloppement web</dc:subject>
		<dc:subject>SPIP</dc:subject>

		<description>
&lt;p&gt;Ce script est le m&#234;me pour le diaporama de la page de garde et pour le diaporama de la galerie. &lt;br class='autobr' /&gt;
Il lit des param&#232;tres dans la page (num&#233;ro de rubrique &#224; parcourir, nombre de niveaux de sous-rubriques &#224; chercher, langue) et envoie la requ&#234;te au serveur, puis ins&#232;re dans la page l'image, le titre et le texte de chaque &#233;l&#233;ment du diaporama en l'adaptant &#224; la taille de la fen&#234;tre, avant de demander l'&#233;l&#233;ment suivant. &lt;br class='autobr' /&gt;
En effet, les &#233;l&#233;ments de ce diaporama sont des articles : le logo de (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique31" rel="directory"&gt;Isabelle Palenc : artiste peintre sculpteur&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot1" rel="tag"&gt;JavaScript&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot2" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot9" rel="tag"&gt;D&#233;veloppement web&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot10" rel="tag"&gt;SPIP&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Ce script est le m&#234;me pour le diaporama de la page de garde et pour le diaporama de la galerie.&lt;/p&gt;
&lt;p&gt;Il lit des param&#232;tres dans la page (num&#233;ro de &lt;strong&gt;rubrique&lt;/strong&gt; &#224; parcourir, nombre de niveaux de &lt;strong&gt;sous-rubriques&lt;/strong&gt; &#224; chercher, langue) et envoie la requ&#234;te au serveur, puis ins&#232;re dans la page l'image, le titre et le texte de chaque &#233;l&#233;ment du diaporama en l'adaptant &#224; la taille de la fen&#234;tre, avant de demander l'&#233;l&#233;ment suivant.&lt;/p&gt;
&lt;p&gt;En effet, les &#233;l&#233;ments de ce diaporama sont des articles :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le logo de l'article est une image particuli&#232;re, que l'on peut ais&#233;ment diff&#233;rencier du texte, afin de lui accorder un traitement diff&#233;rent.&lt;/li&gt;&lt;li&gt; un article existe dans une certaine langue, ce qui permet d'afficher un diaporama diff&#233;rent selon la langue souhait&#233;e&lt;/li&gt;&lt;li&gt; un article avec texte, titre et logo est facile &#224; ajouter, modifier ou enlever dans l'espace priv&#233; de SPIP.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Lancement des fonctions JavaScript&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Comme on peut le voir dans l'aper&#231;u Firebug de la &lt;a href='https://vader-fr.fr/spip.php?article143' class=&#034;spip_in&#034;&gt;structure de la page de garde&lt;/a&gt;, il y a dans chaque page, pour l'&#233;v&#232;nement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;onLoad&lt;/code&gt; (= &#034;au chargement&#034;) de l'&#233;l&#233;ment HTML &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body&lt;/code&gt;, appel &#224; une fonction unique et g&#233;n&#233;rique &#034;AuChargement&#034;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function AuChargement(){ pisteIE(); cachejs(); setTimeout(&#034;charger_diapo()&#034;,1000); // 1 seconde traitercadres(); traiterimages();
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction unique en invoque d'autres, qui, selon les &#233;l&#233;ments pr&#233;sents ou non dans la page, feront quelque chose :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;pisteIE&lt;/code&gt; va, comme son nom l'indique, rediriger les utilisateurs du navigateur Internet Explorer vers une page d'avertissement, indiquant les d&#233;ficiences de Microsoft Internet Explorer quand aux &#233;l&#233;ments pourtant normalis&#233;s W3C de la page.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; Un lien &#034;continuer quand m&#234;me&#034; permet aux utilisateurs d'Internet Explorer de poursuivre la navigation, ils ont &#233;t&#233; pr&#233;venus.&lt;/li&gt;&lt;li&gt; Un syst&#232;me de cookie enregistre le fait que l'utilisateur est pr&#233;venu, cela &#233;vite de faire la redirection &#224; chaque ouverture de page.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;cachejs&lt;/code&gt; sert, comme son nom l'indique, &#224; cacher le message selon lequel JavaScript est d&#233;sactiv&#233; sur le navigateur.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;setTimeout(&#034;charger_diapo()&#034;,1000);&lt;/code&gt; lance la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo()&lt;/code&gt; au bout d'une seconde.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; C'est cette fonction qui ira chercher les param&#232;tres du diaporama dans la page et enverra la requ&#234;te au serveur pour le premier &#233;l&#233;ment.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;traitercadres&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;traiterimages&lt;/code&gt; vont redimensionner les cadres et images qui en ont besoin.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Lancement du diaporama&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function charger_diapo(){ if (this.document.getElementById('diapo')!=null){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Cette fonction ne s'ex&#233;cutera que si un &#233;l&#233;ment &#034;diapo&#034; est pr&#233;sent dans la page&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (this.document.getElementById('nrubrique')!=null){ nrubrique=this.document.getElementById('nrubrique').value; }else{ nrubrique=0; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour chaque param&#232;tre du diaporama, on v&#233;rifie sa pr&#233;sence, et en cas d'absence on utilise une valeur par d&#233;faut&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres param&#232;tres&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (this.document.getElementById('mindepth')!=null){ mindepth=this.document.getElementById('mindepth').value; }else{ mindepth=0; } if (this.document.getElementById('maxdepth')!=null){ maxdepth=this.document.getElementById('maxdepth').value; }else{ maxdepth=1; } if (this.document.getElementById('lang')!=null){ lang=this.document.getElementById('lang').value; }else{ lang=&#034;fr&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Puis on initialise quelques valeurs avant d'appeler la fonction qui cr&#233;era et enverra la requ&#234;te.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; var url_image=null; var texte_diapo=null; var titre_diapo=null; requete_requete_image_diapo('charger_diapo.php?id=0&amp;rub='+nrubrique+'&amp;min='+mindepth+'&amp;max='+maxdepth+'&amp;lang='+lang); }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Cr&#233;ation de la requ&#234;te XMLHTTP&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Le script javaScript d&#233;fini quelque variables globales, que plusieurs fonctions utiliseront.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;var diapo = 0;
var prochain=0;
var nrubrique=0;
var mindepth=0;
var maxdepth=1;
var delai=5000;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Avant de pouvoir cr&#233;er la requ&#234;te XMLHTTP, il faut un objet de type xmlhttprequest pour y mettre les param&#232;tres, l'envoyer au serveur et recevoir sa r&#233;ponse.&lt;br class='autobr' /&gt;
En fonction du navigateur, on utilisera plusieurs m&#233;thodes.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Cr&#233;ation de l'objet xmlhttprequest&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function get_requete_image_diapo(){ var requete_image_diapo = null; if (window.XMLHttpRequest){ // Firefox requete_image_diapo=new XMLHttpRequest(); }else if (window.ActiveXObject){ // IE try{ requete_image_diapo=new ActiveXObject(&#034;Msxml12.XMLHTTP&#034;); }catch(e){ try{ requete_image_diapo=new ActiveXObject(&#034;Microsoft.XMLHTTP&#034;); }catch(e1){ requete_image_diapo=null; } } }else{ // non support&#233; alert(&#034;Votre navigateur ne supporte pas les XMLHTTPRequest.&#034;); /* + redirection vers page navigs.html */ } return requete_image_diapo;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;La fonction pr&#233;c&#233;dente, qui cr&#233;&#233; l'objet xmlhttprequest, est appel&#233;e par la fonction de cr&#233;ation et d'envoi de la requ&#234;te que voici :&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function requete_requete_image_diapo(url){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	requete_image_diapo=get_requete_image_diapo(); if (!requete_image_diapo){ alert(&#034;Votre navigateur ne peut cr&#233;er de requ&#234;te AJAX.&#034;); /* + redirectiuon vers page navigs.html */ return; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re l'objet xmlhttprequest, puis, si celui-ci n'a pu &#234;tre cr&#233;&#233; et que par cons&#233;quent la variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;requete_image_diapo&lt;/code&gt; n'existe pas - le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;!&lt;/code&gt; signifiant la n&#233;gation - on affiche un message et l'on quitte la fonction.&lt;br class='autobr' /&gt;
Sinon, on poursuit&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	//alert(&#034;envoi de la requete&#034;); requete_image_diapo.onreadystatechange=function(){traitementReponse_requete_image_diapo(requete_image_diapo)} requete_image_diapo.open(&#034;GET&#034;,url,true); requete_image_diapo.send(null);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;requete_image_diapo.onreadystatechange=&lt;code&gt; d&#233;finit la fonction &lt;code&gt;function(){ ... }&lt;/code&gt; de traitement de la r&#233;ponse, quand la requ&#234;te aura &#034;chang&#233; d'&#233;tat&#034;.&lt;br class='autobr' /&gt;
Puis on ouvre l'url du script du serveur auquel il faut envoyer la requ&#234;te, et qui la traitera pour envoyer la r&#233;ponse selon les param&#232;tres indiqu&#233;s, et on y envoie la requ&#234;te.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Modification de la page affich&#233;e&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function traitementReponse_requete_image_diapo(requete_image_diapo){ var contenu; var erreur=0; if (requete_image_diapo.readyState==4){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si la requ&#234;te est dans l'&#233;tat &#034;4&#034;, c'est &#224; dire que l'on a re&#231;u la r&#233;ponse du serveur,&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; //alert(&#034;reception de la reponse : traitement&#034;); contenu=requete_image_diapo.responseXML;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re le document XML constituant la r&#233;ponse du serveur.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (contenu.getElementsByTagName(&#034;image&#034;)[0].firstChild.nodeValue!=null){ url_image=contenu.getElementsByTagName(&#034;image&#034;)[0].firstChild.nodeValue; }else{ erreur=1; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On v&#233;rifie la pr&#233;sence de diff&#233;rents &#233;l&#233;ments de r&#233;ponse, en pr&#233;parant des valeurs par d&#233;faut si besoin.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu&lt;/code&gt; est le document XML de r&#233;ponse. Celui-ci est organis&#233; selon une arborescence de balises pour les divers &#233;l&#233;ments et leurs valeurs.&lt;/li&gt;&lt;li&gt; on utilise la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementsByTagName&lt;/code&gt; pour adresser ces balises par leur nom
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; cette fonction renvoie un tableau de balises correspondantes, dont on s'int&#233;resse au premier &#233;l&#233;ment, &#224; la case 0, qui est la premi&#232;re case d'un tableau javaScript.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Une fois r&#233;cup&#233;r&#233; la balise souhait&#233;e, on r&#233;cup&#232;re la valeur du n&#339;ud (&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;nodeValue&lt;/code&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres &#233;l&#233;ments&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (contenu.getElementsByTagName(&#034;url_article&#034;)[0].firstChild.nodeValue!=null){ url_article=contenu.getElementsByTagName(&#034;url_article&#034;)[0].firstChild.nodeValue; }else{ erreur=1; } if (contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild!=null){ if (contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild.nodeValue!=null){ titre_diapo=contenu.getElementsByTagName(&#034;titre&#034;)[0].firstChild.nodeValue; }else{ erreur=1; } }else{ titre_diapo=&#034;&#034;; } //alert(&#034;titre=&#034;+contenu.getElementsByTagName(&#034;titre&#034;)[0].textContent); // y'a aussi data, wholeText...nodeValue... if (contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild!=null){ if (contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild.nodeValue!=null){ texte_diapo=contenu.getElementsByTagName(&#034;texte&#034;)[0].firstChild.nodeValue; if ((texte_diapo==null)||(texte_diapo==&#034;&#034;)){ texte_diapo=&#034;Sans titre&#034;; } }else{ texte_diapo=&#034;&#034;; } }else{ texte_diapo=&#034;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;De m&#234;me, on r&#233;cup&#232;re plusieurs param&#232;tres toujours pr&#233;sents, dont la prochaine image &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;preload&lt;/code&gt; que l'on va commencer &#224; charger comme arri&#232;re plan &#224; taille nulle pour acc&#233;l&#233;rer son chargement lorsque ce sera son tour.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; prochain=contenu.getElementsByTagName(&#034;prochain&#034;)[0].firstChild.nodeValue; // delai=contenu.getElementsByTagName(&#034;delai&#034;)[0].firstChild.nodeValue; preload=contenu.getElementsByTagName(&#034;preload&#034;)[0].firstChild.nodeValue; //alert(&#034;texte=&#034;+contenu.getElementsByTagName(&#034;texte_diapo&#034;)[0].firstChild.nodeValue);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour comprendre &#224; quoi correspondent ces &#233;l&#233;ments, voir l'onglet d&#233;taillant le script PHP.&lt;/p&gt;
&lt;p&gt;Et si tout va bien (variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;erreur&lt;/code&gt; toujours &#224; z&#233;ro)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if (erreur==0){	&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On essaie de r&#233;cup&#233;rer le bloc &#034;image&#034; du diaporama afin de pouvoir y int&#233;grer l'image indiqu&#233;e dans le document XML.&lt;br class='autobr' /&gt;
Dans la m&#234;me structure conditionnelle, l'on s'assure qu'il y a bien une image &#224; y int&#233;grer (l'url de l'image fournie dans la r&#233;ponse XML est non nulle).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if ((this.document.getElementById('diapo_image')!=null)&amp;&amp;(url_image!=&#034;&#034;)){ //alert (&#034;on a le div image&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si le bloc image existe, on le r&#233;f&#233;rence afin de pouvoir le modifier, en utilisant la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementById&lt;/code&gt; qui renvoie un &#233;l&#233;ment unique, puis on y int&#232;gre un lien vers l'article sous la forme d'une image qui est son logo avec la valeur &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;innerHTML&lt;/code&gt; de l'&#233;l&#233;ment, qui correspond au code HTML que l'&#233;l&#233;ment contient.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; var div_image=this.document.getElementById('diapo_image'); // le div div_image.innerHTML=&#034;&lt;a href=\&#034;&#034;+url_article+&#034;\&#034;&gt;&lt;img src=\&#034;&#034;+url_image+&#034;\&#034; style=\&#034;margin-left:0px;margin-top:0px;\&#034;&gt;&lt;/a&gt;&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L'image du diaporama &#233;tant dans son bloc, il est peut &#234;tre utile &#224; pr&#233;sent de la redimensionner afin de l'adapter aux dimensions dudit bloc.&lt;/p&gt;
&lt;p&gt;On r&#233;cup&#232;re donc les dimensions du bloc, par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;offsetHeight&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;offsetWidth&lt;/code&gt;, puis les dimensions r&#233;elles de l'image, par les valeurs &#034;hauteur&#034; et &#034;largeur&#034; fournies dans la r&#233;ponse (voir script PHP).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; var h_div=this.document.getElementById('diapo_image').offsetHeight; var l_div=this.document.getElementById('diapo_image').offsetWidth; var h_img=parseFloat(contenu.getElementsByTagName(&#034;hauteur&#034;)[0].firstChild.nodeValue); var l_img=parseFloat(contenu.getElementsByTagName(&#034;largeur&#034;)[0].firstChild.nodeValue); //alert(&#034;traitement d'une image de &#034;+h_img+&#034; par &#034;+l_img);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Selon la diff&#233;rence de dimension entre le bloc et l'image, il faudra la r&#233;duire prioritairement en largeur, en hauteur, ou les deux, et si l'image n'est pas trop grande, on cherchera &#224; la centrer.&lt;/p&gt;
&lt;p&gt;Le reste du script de traitement devrait &#234;tre ais&#233;ment compr&#233;hensible, d'autant que les commentaires permettent de suivre les conditions v&#233;rifi&#233;es et le traitement effectu&#233;.&lt;br class='autobr' /&gt;
Le principe reste toujours le m&#234;me :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; si une dimension de l'image est plus grande que celle du bloc, alors
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; calculer la proportion entre les deux afin de pouvoir r&#233;duire l'image&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; une fois la bonne proportion de r&#233;duction trouv&#233;e, calculer les marges entre les dimensions du bloc et celles de l'image r&#233;duite, pour centrer l'image.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (l_img&gt;l_div){ var reduction=l_img/l_div; // la proportion de r&#233;duction, qui sera la meme en hauteur et largeur // si h_img/reduction&gt;h_div alors if ((h_img/reduction)&gt;h_div){ // image plus large et en r&#233;duite, plus haute que le div // image plus HAUTE que large // r&#233;duction_h = h_img/h_div var reduction_h=h_img/h_div; // appliquer reduction_h en hauteur et largeur var nh=h_img/reduction_h; var nl=l_img/reduction_h; // pour &#234;tre au milieu&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois l'image r&#233;duite, on calcule la marge, puis on applique r&#233;duction et marge de centrage.&lt;br class='autobr' /&gt;
De m&#234;me que pour le bloc diapo, on utilise la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementById&lt;/code&gt; pour r&#233;f&#233;rencer le bloc, puis, comme pour la r&#233;ponse XML, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementsByTagName&lt;/code&gt; pour r&#233;cup&#233;rer le tableau des images (balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img ...&gt;&lt;/code&gt; contenues, la premi&#232;re (et seule) &#233;tant &#224; la case 0.&lt;br class='autobr' /&gt;
Puis l'on d&#233;finit les attributs HTML de cette balise &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;img ...&gt;&lt;/code&gt; pour retailler l'image, et lui ajouter un style personnalis&#233; contenant la marge de centrage, ainsi que la prochaine image &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;preload&lt;/code&gt; comme arri&#232;re-plan de taille nulle pour acc&#233;l&#233;rer son chargement lorsque ce sera son tour.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; var margel=(l_div-nl)/2; // si la marge est &gt; &#224; x px, calculer la diff&#233;rence et r&#233;duire div image pour agrandir div texte image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres cas&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; // sinon }else{ // image plus large mais pas plus haute que le div // image plus LARGE que haute // appliquer r&#233;duction en largeur et hauteur var nh=h_img/reduction; var nl=l_img/reduction; // pour &#234;tre au milieu, il faut que margeh=()h_div-nh/2 var margeh=(h_div-nh)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); image.setAttribute(&#034;style&#034;,&#034;margin-top:&#034;+margeh+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); //finsi } // fins }else{ // image pas plus large que le div if (h_img&gt;h_div){ // div assez large mais pas assez haut // r&#233;duction_h = h_img/h_div var reduction_h=h_img/h_div; // appliquer reduction_h en hauteur et largeur var nh=h_img/reduction_h; var nl=l_img/reduction_h; // pour &#234;tre au milieu, il faut que margel=()545-nl/2 var margel=(l_div-nl)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); image.setAttribute(&#034;height&#034;,nh); image.setAttribute(&#034;width&#034;,nl); }else{ // image pas trop grande // mais cadre peut-&#234;tre trop grand var margeh=(h_div-h_img)/2; var margel=(l_div-l_img)/2; image=this.document.getElementById('diapo_image').getElementsByTagName('img')[0]; image.setAttribute(&#034;style&#034;,&#034;margin-left:&#034;+margel+&#034;px;margin-top:&#034;+margeh+&#034;px; background-image:url(\&#034;&#034;+preload+&#034;\&#034;); background-size: 0px 0px;&#034;); } } }else{ //alert(&#034;div image non trouv&#233;&#034;); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Puis on fait la m&#234;me chose pour le texte et le titre&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (this.document.getElementById('diapo_texte')!=null){ var div_texte=this.document.getElementById('diapo_texte'); // le div //alert (&#034;on a le div texte&#034;); div_texte.innerHTML=&#034;&lt;span class=\&#034;titre_diapo\&#034;&gt;&lt;a href=\&#034;&#034;+url_article+&#034;\&#034;&gt;&#034;+titre_diapo+&#034;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=\&#034;texte_diapo\&#034;&gt;&#034;+texte_diapo+&#034;&lt;/span&gt;&lt;/p&gt;&#034;; }else{ //alert(&#034;div texte non trouv&#233;&#034;); } }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...et on demande le prochain &#233;l&#233;ment, si bien s&#251;r cela a du sens.&lt;br class='autobr' /&gt;
Si le diaporama n'a aucun ou qu'un seul &#233;l&#233;ment, il n'est pas utile d'envoyer d'autre requ&#234;te, et le script du serveur indiquera que prochain vaut &#034;-1&#034;, soit une valeur non valide.&lt;/p&gt;
&lt;p&gt;la commande &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;setTimeout(&lt;/code&gt; permet de d&#233;finir un d&#233;lai avant de demander le prochain &#233;l&#233;ment.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; diapo=prochain; if (prochain!=-1){ //	requete_requete_image_diapo(&#034;charger_diapo.php?id=&#034;+diapo+&#034;&amp;delai=&#034;+delai); setTimeout(&#034;requete_requete_image_diapo('charger_diapo.php?id='+diapo+'&amp;rub='+nrubrique+'&amp;min='+mindepth+'&amp;max='+maxdepth+'&amp;lang='+lang)&#034;,delai); } }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;script PHP&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Le script PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo.php&lt;/code&gt;, situ&#233; &#224; la racine du serveur web, et appel&#233; comme URL par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;charger_diapo&lt;/code&gt; et apr&#232;s chaque traitement de r&#233;ponse, va traiter la requ&#234;te xmlhttp et envoyer une r&#233;ponse au format XML.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?php
session_start();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans la mesure o&#249; les scripts PHP de SPIP peuvent utiliser des variables de session pour stocker des param&#232;tres, on se connecte &#224; cette session afin de pouvoir r&#233;cup&#233;rer la langue choisie.&lt;/p&gt;
&lt;p&gt;On cr&#233;&#233; l'ent&#234;te de la r&#233;ponse avant qu'un autre script, de traitement des accents, ne s'en charge.&lt;br class='autobr' /&gt;
le script &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;accents.php&lt;/code&gt; contient plusieurs fonctions, dont une utilis&#233;e pour transformer les caract&#232;res accentu&#233;s contenus dans la base en leur &#233;quivalent en code HTML, permettant un affichage normal quel que soient les encodages de caract&#232;re du serveur et du navigateur.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;header('content-Type:text/xml,charset=UTF-8');
require &#034;accents.php&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On se connecte &#224; la base de donn&#233;es.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;mysql_connect('serveur','utilisateur','mot de passe','MYSQL'); mysql_select_db(&#034;nom de la base&#034;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On travaillera sur les tables des rubriques et des articles de SPIP, qui ont g&#233;n&#233;ralement un nom commen&#231;ant par &#034;spip_&#034;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$tablerubriques=&#034;spip_rubriques&#034;;
$tablearticles=&#034;spip_articles&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La requ&#234;te xmlhttp envoyant ses param&#232;tres dans l'url, par la m&#233;thode GET (voir &lt;a href='https://vader-fr.fr/spip.php?article63' class=&#034;spip_in&#034;&gt;article&lt;/a&gt; sur PHP), on r&#233;cup&#232;re les param&#232;tres par la variable globale &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$_GET&lt;/code&gt;, qui est un tableau associatif (les colonnes sont identifi&#233;es par nom et non par num&#233;ro).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;if (isset($_GET[&#034;id&#034;])){ $idd=$_GET[&#034;id&#034;];
}else{ $idd=0; /* id du diapo en cours, &#224; diviser par total de diapo et prendre le reste , ex si idd = 5 pour 3 photos existantes, alors charger photo 2 */
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Autres param&#232;tres&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;if (isset($_GET[&#034;delai&#034;])){ $delai=$_GET[&#034;delai&#034;]; //echo &#034;delai de $delai secondes&lt;br&gt;&#034;;
}else{ $delai=0;
} if (isset($_GET[&#034;rub&#034;])){ $id_rubrique_diapo=$_GET[&#034;rub&#034;];
}else{ $id_rubrique_diapo=0; } if (isset($_GET[&#034;min&#034;])){ $min_depth=$_GET[&#034;min&#034;];
}else{ $min_depth=0; } if (isset($_GET[&#034;max&#034;])){ $max_depth=$_GET[&#034;max&#034;];
}else{ $max_depth=1; } if (isset($_GET[&#034;lang&#034;])){ $_SESSION[&#034;lang&#034;]=$_GET[&#034;lang&#034;];
}else{ if (isset($_SESSION[&#034;languser&#034;])){ $_SESSION[&#034;lang&#034;]=$_SESSION[&#034;languser&#034;]; } if (!isset($_SESSION[&#034;lang&#034;])){ $_SESSION[&#034;lang&#034;]=&#034;fr&#034;; }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour la langue, on essaie d'abord de la r&#233;cup&#233;rer par le param&#232;tre fourni lors de la requ&#234;te et le stocker dans la variable de session &#034;lang&#034;, avant de pendre la variable de session &#034;languser&#034; si elle est d&#233;finie, et enfin, si la variable de session &#034;lang&#034; n'est toujours pas d&#233;finie, on prend par d&#233;faut langue fran&#231;aise.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Une fonction de parcourt de rubrique et sous-rubrique est d&#233;finie, ce qui permet de faire du parcours r&#233;cursif, lorsque la fonction s'appelle elle-m&#234;me.&lt;br class='autobr' /&gt;
La fonction renverra tous les identifiants de sous-rubriques dans lesquelles on est susceptible de trouver des &#233;l&#233;ments de diaporama.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function parcourt_rubrik($cur_rubrik,$curdepth,$maxdepth,$mindepth) {&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces deux param&#232;tres ne pouvant &#234;tre pass&#233;s d'un niveau &#224; l'autre de la boucle r&#233;cursive sans rendre la fonction complexe, on les red&#233;finit localement &#224; chaque niveau.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$tablerubriques=&#034;spip_rubriques&#034;; $tablearticles=&#034;spip_articles&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$curdepth.=$curdepth+1; $rubs=array(); // le tableau qu'on renverra, contenant dans la case 0 sa taille $reksrub=&#034;select id_rubrique from &#034;.$tablerubriques.&#034; where id_parent=$cur_rubrik&#034;; $resrub=mysql_query($reksrub); while ($rowrub=mysql_fetch_array($resrub,MYSQL_ASSOC)){ $ssrub=$rowrub[&#034;id_rubrique&#034;]; if ($curdepth&gt;=$mindepth){ $rubs[]=$ssrub; } if ($curdepth&lt;$maxdepth){ $rubs=array_merge($rubs,parcourt_rubrik($ssrub,$curdepth,$maxdepth,$mindepth)); } } return $rubs;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On cr&#233;&#233; donc la liste des rubriques en appelant la fonction r&#233;cursive, en partant de la rubrique fournie en param&#232;tre par la requ&#234;te xmlhttp.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$liste_rubriques=parcourt_rubrik($id_rubrique_diapo,$min_depth,$max_depth,$min_depth);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, on construit un morceau de la requ&#234;te SQL, &#224; savoir une partie de la clause conditionnelle WHERE, en ajoutant &#224; un code de base des morceaux de code SQL&lt;span class=&#034;spip_note_ref&#034;&gt; [&lt;a href=&#034;#nb1&#034; class=&#034;spip_note&#034; rel=&#034;appendix&#034; title=&#034;&#231;a tombe bien, j'avais justement besoin d'exemple de ce genre de m&#233;thode (&#8230;)&#034; id=&#034;nh1&#034;&gt;1&lt;/a&gt;]&lt;/span&gt;&lt;br class='autobr' /&gt;
On utilise une boucle while (tant que) pour parcourir un tableau dont la taille est variable, en s'arr&#234;tant lorsque l'index atteint le nombre de case contenues dans le tableau, et en incr&#233;mentant l'index au fur et &#224; mesure.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;$liste_rubrik=&#034;(id_rubrique=$id_rubrique_diapo&#034;;
$irub=0; while ($irub&lt;count($liste_rubriques)){ $liste_rubrik.=&#034; or id_rubrique=$liste_rubriques[$irub]&#034;; $irub++;
} $liste_rubrik.=&#034;)&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois que la partie &#034;liste des rubriques parentes&#034; de la requ&#234;te des articles que l'on va s&#233;lectionner est cr&#233;&#233;e, on l'utilise d'abord dans une requ&#234;te pour compter les &#233;l&#233;ments, puis ensuite dans la requ&#234;te de r&#233;cup&#233;ration.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;/* requete pour conna&#238;tre le nombre total de photos pouvant &#234;tre affich&#233;es */ $rek_compt=&#034;select count(*) as total from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;'&#034;; // pas de order by pour compter
$res_compt=mysql_query($rek_compt);
$row_total=mysql_fetch_array($res_compt,MYSQL_ASSOC);
$total=$row_total[&#034;total&#034;];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; clause SELECT :
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; On compte &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;count&lt;/code&gt;&lt;/li&gt;&lt;li&gt; les lignes dans leur globalit&#233; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;count(*)&lt;/code&gt;&lt;/li&gt;&lt;li&gt; dont on stockera le compte dans une colonne nomm&#233;e &#034;total&#034; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;as total&lt;/code&gt;, plus simple pour la r&#233;f&#233;rencer,&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; clause FROM
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; depuis la table des articles, dont le nom, susceptible de varier, a &#233;t&#233; mis dans la variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;tablearticles&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; clause WHERE
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; pour les articles faisant partie de la liste des rubriques&lt;/li&gt;&lt;li&gt; et &#233;tant publi&#233;s&lt;/li&gt;&lt;li&gt; et dont la langue est celle d&#233;termin&#233;e plus t&#244;t et stock&#233;e dans la variable de session.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;if ($total&gt;0){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si il y a effectivement plusieurs articles publi&#233;s dans les rubriques cibl&#233;es et ce dans la langue choisie, alors on va r&#233;cup&#233;rer les deux premiers articles selon un tri d&#233;finit plus bas.&lt;br class='autobr' /&gt;
Le script JavaScript, fournissant toujours un param&#232;tre de num&#233;ro de diapo &#224; charger dans la requ&#234;te xmlhttp, on se base sur ce param&#232;tre pour d&#233;marrer la s&#233;lection dans la liste des articles disponibles.&lt;/p&gt;
&lt;p&gt;Quand au prochain &#233;l&#233;ment de diaporama &#224; charger, c'est soit l'article suivant dans la liste - si l'article en cours n'est pas le dernier de la liste - soit le premier, &#224; savoir le num&#233;ro 0 de la liste (tableau des r&#233;ponses).&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$debut=$idd; // 0 par defaut $par_page=1; if (($idd+1)&lt;$total){ $prochain=$idd+1; }else{ $prochain=0; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La requ&#234;te de s&#233;lection est la m&#234;me que celle de comptage, logique puisque l'on travaille sur les m&#234;mes &#233;l&#233;ments.&lt;br class='autobr' /&gt;
Seules les clauses SELECT - car on ne compte pas cette fois - et la clause de tri ORDER - qui &#233;tait inutile dans une requ&#234;te de comptage - vont changer&lt;br class='autobr' /&gt;
On ajoute aussi une clause LIMIT qui restreint le nombre de lignes de r&#233;sultat que l'on va finalement traiter.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; clause SELECT : on s&#233;lectionne tous les champs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;*&lt;/code&gt;&lt;/li&gt;&lt;li&gt; clause ORDER BY par date d&#233;croissante &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;DESC&lt;/code&gt;, et donc par article le plus r&#233;cent.&lt;/li&gt;&lt;li&gt; on limite les lignes de r&#233;sultat &#224; 1, comme vu plus haut &lt;code class='spip_code spip_code_inline' dir='ltr'&gt; $par_page=1;&lt;/code&gt;, et on d&#233;marre &#224; la ligne num&#233;ro &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debut&lt;/code&gt;, &#224; savoir &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$idd&lt;/code&gt;, le param&#232;tre de num&#233;ro de diapo fourni &#224; l'appel du script par la requ&#234;te xmlhttp.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$rek_sel=&#034;select * from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;' order by 'date' DESC limit $debut,$par_page &#034;; // order by date DESC $res_sel=mysql_query($rek_sel);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#201;tant donn&#233; que l'on traite des articles, et que l'image cherch&#233;e est un logo, il est bon de savoir que sous SPIP, les logos ont un nom particulier :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; type de l'&#233;l&#233;ment SPIP &lt;strong&gt;art&lt;/strong&gt;icles, &lt;strong&gt;rub&lt;/strong&gt;riques, &lt;strong&gt;site&lt;/strong&gt;s&lt;/li&gt;&lt;li&gt; &lt;strong&gt;on&lt;/strong&gt;&lt;/li&gt;&lt;li&gt; num&#233;ro dudit &#233;l&#233;ment&lt;/li&gt;&lt;li&gt; les logos &#233;tant stock&#233;s &#224; la racine du dossier &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;IMG&lt;/code&gt;, peu importe leur extension (jpg, png, gif...)&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$imagebase=&#034;IMG/arton&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour chaque ligne de r&#233;sultat renvoy&#233;e (en fait il n'y en a qu'une)&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	while ($row_sel=mysql_fetch_array($res_sel,MYSQL_ASSOC)){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On r&#233;cup&#232;re la valeur de chaque champ dont on a besoin.&lt;br class='autobr' /&gt;
Les champs de type texte (titre et texte) passent par plusieurs filtres pour traiter des caract&#232;res sp&#233;ciaux qui risqueraient de faire planter le document XML r&#233;ponse.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; $id=$row_sel[&#034;id_article&#034;]; $titre=htmlentities($row_sel[&#034;titre&#034;]); $titre=remet_accents($titre); $titre=str_replace(&#034;'&#034;,&#034;'&#034;,$titre); $titre=str_replace('&#034;','&#034;',$titre); $titre=str_replace(&#034;&#176;&#034;,&#034;&amp;deg;&#034;,$titre); $texte=htmlentities($row_sel[&#034;texte&#034;]); $texte=remet_accents($texte); $texte=str_replace(&#034;'&#034;,&#034;'&#034;,$texte); $texte=str_replace('&#034;','&#034;',$texte); $texte=str_replace(&#034;&#176;&#034;,&#034;&amp;deg;&#034;,$texte); $texte=nl2br($texte); $urlarticle=&#034;spip.php?article$id&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour l'image, on recherche si le fichier &lt;i&gt;artonXX&lt;/i&gt; existe pour plusieurs extensions possibles.&lt;br class='autobr' /&gt;
Si un fichier portant ce nom existe, alors on a trouv&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; // image = IMG/arton[+id article].jpg ou autre // =========== existence du fichier jpg, png ou gif ============== $extensions=array(&#034;jpg&#034;,&#034;jpeg&#034;,&#034;JPG&#034;,&#034;png&#034;,&#034;PNG&#034;,&#034;gif&#034;,&#034;GIF&#034;); $i=0; $trouve=false; $image=&#034;&#034;; while (($i&lt;sizeof($extensions))&amp;&amp;($trouve==false)){ $image_test=$imagebase.$id.&#034;.&#034;.$extensions[$i]; //echo &#034;on teste $image_test&lt;br&gt;&#034;; if (file_exists($image_test)){ //echo &#034;$image_test existe&lt;br&gt;&#034;; $image=$image_test; $trouve=true; }else{ //echo &#034;$image_test n'existe pas&lt;br&gt;&#034;; } $i++; } // image par d&#233;faut if (!$trouve){ $image=&#034;interrogation.png&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si aucun fichier image de logo correspondant &#224; l'article n'est trouv&#233;, on prend une image par d&#233;faut.&lt;br class='autobr' /&gt;
Puis on r&#233;cup&#232;re les dimensions de l'image contenue dans le fichier avec une fonction PHP.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; $infos_image = @getImageSize($image); // info sur la dimension de l'image // '@' est plac&#233; devant la fonction getImageSize() pour empecher l'affichage des erreurs si l'image est absente. //dimension $largeur = $infos_image[0]; // largeur de l'image $hauteur = $infos_image[1]; // hauteur de l'image&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ces informations de taille seront envoy&#233;es dans la r&#233;ponse et utilis&#233;es par le script pour redimensionner l'image si besoin est.&lt;/p&gt;
&lt;p&gt;Et on oublie pas de fermer la boucle de traitement de la ligne de r&#233;sultat des articles correspondants &#224; ce que l'on cherche.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis on s&#233;lectionne l'image suivante afin de pouvoir commencer &#224; la charger plus t&#244;t, de sorte qu'au tour d'apr&#232;s, l'image de la diaporama suivante se chargera plus vite.&lt;br class='autobr' /&gt;
La requ&#234;te est la m&#234;me que la pr&#233;c&#233;dente, mais on ne prendra pas la m&#234;me ligne de r&#233;sultat.&lt;br class='autobr' /&gt;
Le traitement pour trouver le fichier image sera le m&#234;me.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;Image suivante&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$rek_presel=&#034;select * from &#034;.$tablearticles.&#034; where $liste_rubrik and statut='publie' and lang='&#034;.$_SESSION[&#034;lang&#034;].&#034;' order by 'date' DESC limit $prochain,$par_page &#034;; // order by date DESC $res_presel=mysql_query($rek_presel); while ($row_presel=mysql_fetch_array($res_presel,MYSQL_ASSOC)){ $extensions=array(&#034;jpg&#034;,&#034;jpeg&#034;,&#034;JPG&#034;,&#034;png&#034;,&#034;PNG&#034;,&#034;gif&#034;,&#034;GIF&#034;); $i=0; $trouve=false; $pre_image=&#034;&#034;; while (($i&lt;sizeof($extensions))&amp;&amp;($trouve==false)){ $image_test=$imagebase.$id.&#034;.&#034;.$extensions[$i]; //echo &#034;on teste $image_test&lt;br&gt;&#034;; if (file_exists($image_test)){ //echo &#034;$image_test existe&lt;br&gt;&#034;; $pre_image=$image_test; $trouve=true; }else{ //echo &#034;$image_test n'existe pas&lt;br&gt;&#034;; } $i++; } // image par d&#233;faut if (!$trouve){ $pre_image=&#034;interrogation.png&#034;; } } //echo &#034;image trouvee : $image&lt;br&gt;&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Si en revanche il n'y a aucun article correspondant &#224; ce que l'on cherche&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;}else{ $image=&#034;interrogation.png&#034;; $texte=&#034;\&#034;\&#034;&#034;; $largeur=0; $hauteur=0; $delai=0; $pre_image=&#034;\&#034;\&#034;&#034;; $urlarticle=&#034;#&#034;; // page actuelle $prochain=-1; $titre=&#034;Aucune image disponible.&#034;; // changer le texte selon la langue if ($_SESSION[&#034;lang&#034;]==&#034;fr&#034;){ $titre=&#034;Aucune image disponible.&#034;; // changer le texte selon la langue } if ($_SESSION[&#034;lang&#034;]==&#034;en&#034;){ $titre=&#034;No article available for this language : english.&#034;; // changer le texte selon la langue } if ($_SESSION[&#034;lang&#034;]==&#034;de&#034;){ } $texte=$titre; // $texte=htmlentities($texte); // $texte=remet_accents($texte);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puis il est temps de cr&#233;er le document XML qui servira de r&#233;ponse.&lt;br class='autobr' /&gt;
Dans Firebug, il est possible de voir, dans l'onglet r&#233;seau, les requ&#234;tes avec leurs param&#232;tres, et les r&#233;ponses associ&#233;es en XML.&lt;/p&gt;
&lt;p&gt;On cr&#233;e un objet de type DOMDocument, puis on y ajoute les &#233;l&#233;ments et sous-&#233;l&#233;ments, en commen&#231;ant par la racine du document.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// r&#233;ponse du serveur = contenu de l'XmlHttpResponse
$doc=new DOMDocument(&#034;1.0&#034;,&#034;utf-8&#034;);
$racine=$doc-&gt;createElement('root');
$doc-&gt;appendChild($racine);
$url_image=$doc-&gt;createElement('image',$image);
$racine-&gt;appendChild($url_image);
$lien=$doc-&gt;createElement('url_article',$urlarticle);
$racine-&gt;appendChild($lien);
$titre_diapo=$doc-&gt;createElement('titre',$titre);
$racine-&gt;appendChild($titre_diapo);
$texte_diapo=$doc-&gt;createElement('texte',$texte);
$racine-&gt;appendChild($texte_diapo);
$info=$doc-&gt;createElement('largeur',$largeur);
$racine-&gt;appendChild($info);
$info2=$doc-&gt;createElement('hauteur',$hauteur);
$racine-&gt;appendChild($info2);
$tempo=$doc-&gt;createElement('delai',$delai);
$racine-&gt;appendChild($tempo);
$next=$doc-&gt;createElement('prochain',$prochain);
$racine-&gt;appendChild($next);
$pre=$doc-&gt;createElement('preload',$pre_image);
$racine-&gt;appendChild($pre);
$debug=$doc-&gt;createElement('debug',&#034;$debugmsg&#034;);
$racine-&gt;appendChild($debug);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Et pour finir, on envoie le document par un simple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;echo&lt;/code&gt; du texte XML renvoy&#233; par la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;saveXML&lt;/code&gt; sur l'objet.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;echo $doc-&gt;saveXML();
?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;div id=&#034;nb1&#034;&gt;
&lt;p&gt;&lt;span class=&#034;csfoo htmla&#034;&gt;&lt;/span&gt;&lt;span class=&#034;spip_note_ref&#034;&gt;[&lt;a href=&#034;#nh1&#034; class=&#034;spip_note&#034; title=&#034;Notes 1&#034; rev=&#034;appendix&#034;&gt;1&lt;/a&gt;] &lt;/span&gt;&lt;span class=&#034;csfoo htmlb&#034;&gt;&lt;/span&gt;&#231;a tombe bien, j'avais justement besoin d'exemple de ce genre de m&#233;thode pour un autre article&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>AJAX - Affichage en temps r&#233;el de temp&#233;rature relev&#233;e par une sonde.</title>
		<link>https://vader-fr.fr/spip.php?article116</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article116</guid>
		<dc:date>2013-05-05T16:51:40Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>JavaScript</dc:subject>
		<dc:subject>PHP</dc:subject>
		<dc:subject>HTML</dc:subject>

		<description>
&lt;p&gt;A la demande de absolut_man sur jeuxvideopc.com, qui &#233;tait int&#233;ress&#233; par ma proposition d'aide pour r&#233;aliser un site web, &lt;br class='autobr' /&gt;
Description &lt;br class='autobr' /&gt;
Le projet de bac sp&#233; ISN consiste en un robot qui mesure la temp&#233;rature et qui la communique sur un site internet. Pas d'une grande utilit&#233; &#224; priori mais cela permet de balayer tout le programme de l'ann&#233;e. &lt;br class='autobr' /&gt;
Deux cartes arduinos sont utilis&#233;es pour la mesure m&#233;t&#233;orologique : une sur le robot une connect&#233;e &#224; l'ordinateur qui communiquera &#224; intervalle (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique3" rel="directory"&gt;D&#233;veloppement web&lt;/a&gt;

/ 
&lt;a href="https://vader-fr.fr/spip.php?mot1" rel="tag"&gt;JavaScript&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot2" rel="tag"&gt;PHP&lt;/a&gt;, 
&lt;a href="https://vader-fr.fr/spip.php?mot3" rel="tag"&gt;HTML&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;A la demande de absolut_man sur jeuxvideopc.com, qui &#233;tait int&#233;ress&#233; par ma &lt;a href=&#034;http://vader-fr.fr/spip.php?article9&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;proposition d'aide pour r&#233;aliser un site web&lt;/a&gt;,&lt;/p&gt;
&lt;div class=&#034;onglets_bloc_initial&#034;&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Description&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Le projet de bac sp&#233; ISN consiste en un robot qui mesure la temp&#233;rature et qui la communique sur un site internet. Pas d'une grande utilit&#233; &#224; priori mais cela permet de balayer tout le programme de l'ann&#233;e.&lt;/p&gt;
&lt;p&gt;Deux cartes arduinos sont utilis&#233;es pour la mesure m&#233;t&#233;orologique :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; une sur le robot&lt;/li&gt;&lt;li&gt; une connect&#233;e &#224; l'ordinateur qui communiquera &#224; intervalle r&#233;gulier les donn&#233;es transmise par l'autre carte&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Le probl&#232;me &#233;tait : comment faire pour mettre &#224; jour automatiquement les donn&#233;es sur le site internet ?&lt;/p&gt;
&lt;p&gt;en fait c'est assez facile&lt;br class='autobr' /&gt;
il faut sur le serveur :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; une base de donn&#233;es&lt;/li&gt;&lt;li&gt; un script php qui fait la mise &#224; jour, script appel&#233; par un programme sur le PC qui envoie les informations &#224; mettre en base (sonde, date, temp&#233;rature...).&lt;/li&gt;&lt;li&gt; une page html avec un script JavaScript mettant &#224; jour les donn&#233;es affich&#233;es gr&#226;ce &#224; l'AJAX.&lt;/li&gt;&lt;li&gt; un script php fournissant au script AJAX les donn&#233;es contenues en base.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;sur le pc, il suffit d'utiliser la librairie python permettant de faire des requ&#234;tes HTTP.&lt;/p&gt;
&lt;p&gt;voir &lt;a href=&#034;http://www.commentcamarche.net/forum/affich-481904-requete-http-en-python-debutant&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;l&#224;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;la requ&#234;te sera donc du type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;http://le_site/page_php.php?param&#232;tre1=valeur1&amp;param&#232;tre2=valeur2&lt;/code&gt;.&lt;br class='autobr' /&gt;
la page php permettra de mettre &#224; jour la base de donn&#233;es.&lt;br class='autobr' /&gt;
python ne cr&#233;&#233; pas de liste, il envoie les donn&#233;es 1 par 1 &#224; un script php, qui ins&#232;re les donn&#233;es dans une base.&lt;/p&gt;
&lt;p&gt;un script php affichera ensuite une donn&#233;e unique ou une liste, selon ce qui est pr&#233;vu. donn&#233;e unique mise &#224; jour par l'AJAX, liste &#233;ventuellement sous forme graphique pour pr&#233;senter l'&#233;volution.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Base de donn&#233;es&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;la base n'a besoin que d'une seule table : &lt;strong&gt;releves&lt;/strong&gt;, contenant 3 champs&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; num&#233;ro identifiant de la sonde - champ &lt;strong&gt;sonde&lt;/strong&gt; de type &lt;strong&gt;int&lt;/strong&gt;, entier.&lt;/li&gt;&lt;li&gt; date + heure du relev&#233; de temp&#233;rature - champ &lt;strong&gt;date&lt;/strong&gt; de type &lt;strong&gt;datetime&lt;/strong&gt;, contenant donc date et heure.&lt;/li&gt;&lt;li&gt; temp&#233;rature relev&#233;e - champ &lt;strong&gt;temperature&lt;/strong&gt; de type &lt;strong&gt;float&lt;/strong&gt;, un nombre &#034;flottant&#034; donc &#224; virgule, appartenant &#224; l'ensemble math&#233;matique des nombres r&#233;els &#8477;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;tous ces champs sont non nuls, non uniques.&lt;/p&gt;
&lt;p&gt;l'index &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;PRIMARY KEY&lt;/code&gt; (cl&#233; primaire, permettant d'identifier de mani&#232;re unique une ligne de la table) sera la combinaison du num&#233;ro de sonde et de la date/heure du relev&#233; de temp&#233;rature.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Script PHP mise &#224; jour BDD&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Ce script est extr&#234;mement simple : Il re&#231;oit en entr&#233;e plusieurs variables et les ins&#232;re dans la base.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?php if (isset($_GET[&#034;sonde&#034;])){ $sonde=$_GET[&#034;sonde&#034;]; }else{ $sonde=1; // par d&#233;faut } if (isset($_GET[&#034;temper&#034;])){ $temper=$_GET[&#034;temper&#034;]; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;le script PHP &#233;tant appel&#233; par un script python, l'envoi des donn&#233;es se fait dans l'url de la requ&#234;te html g&#233;n&#233;r&#233;e par le script python.&lt;/p&gt;
&lt;p&gt;la m&#233;thode est donc &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;GET&lt;/code&gt;.&lt;br class='autobr' /&gt;
la r&#233;cup&#233;ration des variables se fait alors par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$_GET[&#034;variable&#034;]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;par s&#233;curit&#233; autant que par simplicit&#233;, on v&#233;rifie l'existence de la variable (dans la requ&#234;te) avant d'essayer de r&#233;cup&#233;rer sa valeur, avec la fonction &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;isset(variable)&lt;/code&gt;.&lt;br class='autobr' /&gt;
Et pour simplifier encore plus, on rend certaines variables optionnelles en pr&#233;voyant des valeurs par d&#233;faut.&lt;/p&gt;
&lt;p&gt;Ainsi, s'il n'y a qu'une seule sonde et/ou qu'on ne souhaite pas se compliquer en envoyant la date/heure sous un format complexe, le script php s'en charge.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if (isset($_GET[&#034;quand&#034;])){ $quand=$_GET[&#034;quand&#034;]; }else{ $quand=date(&#034;Y-m-d H:i:s&#034;); // par d&#233;faut, date actuelle // format YYYY-MM-DD HH:MM:SS ===&gt; datetime en MYSQL }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;la date/heure, justement, doit &#234;tre au format &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;datetime&lt;/code&gt; de MySQL pour &#234;tre ins&#233;r&#233;e en base, &#224; savoir de type YYYY-MM-DD HH:MM:SS&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	// connexion &#224; la base SQL et insertion des donn&#233;es include_once &#034;connect.php&#034;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pour se connecter &#224; la base, on fait appel &#224; un autre script, ce qui permet d'avoir plusieurs scripts PHP diff&#233;rents utilisant la m&#234;me m&#233;thode de connexion, rendant les changements et corrections plus faciles.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;?php&lt;/code&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt; mysql_connect('&lt;/code&gt;&lt;i&gt;adresse serveur MySQL&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;','&lt;/code&gt;&lt;i&gt;utilisateur MySQL&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;','&lt;/code&gt;&lt;i&gt;mot de passe&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;','MYSQL');&lt;/code&gt;&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt; mysql_select_db(&#034;&lt;/code&gt;&lt;i&gt;nom de la base&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&#034;);&lt;/code&gt; &lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;?&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Puis, si la temp&#233;rature est d&#233;finie et que la variable contient une valeur, on ins&#232;re les donn&#233;es.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if (isset($temper)&amp;&amp;$temper!=null){ $reki=&#034;insert into releves (sonde,date,temperature) values ($sonde,'$quand',$temper)&#034;; $resi=mysql_query($reki); }
?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt; est un mot cl&#233; signifiant &#034;rien&#034;. Pas z&#233;ro, pas cha&#238;ne vide, mais rien, pas de valeur. la variable existe mais n'est pas initialis&#233;e. C'est un peu comme s'il y avait un feu tricolore, mais &#233;teint. Il est l&#224;, il existe, mais il n'est pas vert, orange ou rouge et n'a donc pas de &#034;valeur&#034;.&lt;/p&gt;
&lt;p&gt;la requ&#234;te SQL est tr&#232;s simple, l'ordre &#233;tant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;insert&lt;/code&gt; dans la table &lt;strong&gt;releves&lt;/strong&gt; dans les champs correspondants &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;sonde, date, temperature&lt;/code&gt; des valeurs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$sonde, $quand, $temper&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Par s&#233;curit&#233;, on aurait pu ajouter un syst&#232;me de cl&#233; ou autre moyen d'authentifier le &#034;client&#034; envoyant la requ&#234;te de mise &#224; jour, que ce soit au niveau du script php, au niveau du serveur web Apache (SSL), ou m&#234;me ou niveau du pare-feu iptables (cha&#238;ne &lt;i&gt;mangle&lt;/i&gt;) sous Linux.&lt;br class='autobr' /&gt;
Le probl&#232;me ne se posant pas sur ce projet et par souci de simplicit&#233;, cela n'a pas &#233;t&#233; envisag&#233;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Page HTML&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;La page html est assez simple&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;!DOCTYPE html PUBLIC &#034;-//W3C//DTD XHTML 1.0 Transitional//EN&#034; &#034;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&#034;&gt;
&lt;html lang=&#034;fr&#034; dir=&#034;ltr&#034; xml:lang=&#034;fr&#034; xmlns=&#034;http://www.w3.org/1999/xhtml&#034;&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On indique :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le type de document &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;xhtml1 transitionnal&lt;/code&gt;. Les types de documents normalis&#233;s &lt;a href=&#034;http://vader-fr.fr/spip.php?article68&#034; class=&#034;spip_out&#034; rel=&#034;external&#034;&gt;W3C&lt;/a&gt; d&#233;finissent le contenu utilisable et permettent un traitement homog&#232;ne par les navigateurs respectant ces normes.&lt;/li&gt;&lt;li&gt; la langue&lt;/li&gt;&lt;li&gt; la direction d'affichage : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;dir = ltr&lt;/code&gt;, left-to-right, de gauche &#224; droite&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	&lt;head&gt; &lt;title&gt;Projet Celcius (ISN)&lt;/title&gt; &lt;meta http-equiv=&#034;content-Type&#034; content=&#034;text/html; charset=UTF-8&#034;/&gt; &lt;meta name=&#034;description&#034; content=&#034;Projet Celcius&#034;/&gt; &lt;link media=&#034;all&#034; type=&#034;text/css&#034; href=&#034;style.css&#034; rel=&#034;stylesheet&#034;/&gt; &lt;script type=&#034;text/javascript&#034; src=&#034;absolut.js&#034;&gt; &lt;/script&gt; &lt;/head&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;en ent&#234;te de page, on fournit d'autres informations comme le titre de la page, l'encodage des caract&#232;res, la description rapide du contenu.&lt;br class='autobr' /&gt;
Une feuille de style CSS et un fichier de script JavaScript sont &#233;galement appel&#233;s.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	&lt;body onload=&#034;AuChargement();&#034;&gt; &lt;div id=&#034;head&#034;&gt; &lt;h1&gt;Projet Celcius - Mesure de la temp&#233;rature&lt;/h1&gt; &lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;le style CSS associ&#233;&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;body { margin-top: 0px; margin:0; background-image:url(&#034;ciel2.jpg&#034;); background-repeat:repeat; font-family: Helvetica, sans-serif; font-size: 1em; color: black;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Le corps de page n'a pas de marge, poss&#232;de une image d'arri&#232;re plan qui sera r&#233;p&#233;t&#233;e (et non &#233;tir&#233;e ou fix&#233;e), on utilise la police d'&#233;criture Helvetica, de taille 1em et la couleur du texte sera le noir.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;body a, body a:visited { color: brown; cursor:pointer; text-decoration:underline;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;les liens seront en marron et soulign&#233;s, qu'ils aient &#233;t&#233; visit&#233;s ou non.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;body a:hover { color: darkred;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Au survol de la souris (&#233;v&#232;nement &#034;hover&#034;), les liens passeront en rouge sombre.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;La page se divise en 2 blocs : ent&#234;te et contenu.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#head, #content h2, #content h3, #temperature { text-align:center;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dans l'ent&#234;te, le texte est centr&#233;. &lt;br class='autobr' /&gt;
De m&#234;me que pour les titres (entre balises &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;h2&gt;&lt;/h2&gt;&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;h3&gt;&lt;/h3&gt;&lt;/code&gt;) dans le contenu et le contenu du bloc &#034;temp&#233;rature&#034;.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;le bloc contenu contiendra un petit texte explicatif ainsi que le bloc &#034;temp&#233;rature&#034;, dont le contenu sera mis &#224; jour et d&#233;di&#233; &#224; l'affichage de la temp&#233;rature.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; &lt;div id=&#034;content&#034;&gt; &lt;h2&gt;&amp;curren; Bienvenue sur le site de notre Projet ISN &amp;curren;&lt;/h2&gt; &lt;p&gt;&lt;b&gt;Intitul&#233; du projet :&lt;/b&gt; R&#233;aliser un programme et mettre en oeuvre des &#233;quipements permettant &#224; un robot Mindstorm NXT de se d&#233;placer dans une pi&#232;ce en &#233;vitant les obstacles et de transmettre des
mesures de temp&#233;rature rafra&amp;icirc;chies automatiquement sur un site internet.&lt;/p&gt; &lt;h3&gt;Temp&#233;rature en temps r&#233;el :&lt;/h3&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;Pour que le texte soit lisible et non coll&#233; aux bords de la page, une propri&#233;t&#233; de style inclut une marge &#224; l'int&#233;rieur du bloc entre les bords du bloc et le contenu.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#content { padding:5px;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&#034;padding&#034; repr&#233;sente un espace &#224; l'int&#233;rieur, entre le bord du contenant et son contenu. &#034;margin&#034; repr&#233;sente un espace &#224; l'ext&#233;rieur, entre le bord d'un &#233;l&#233;ment et les &#233;l&#233;ments qui l'entourent.&lt;br class='autobr' /&gt;
Des propri&#233;t&#233;s diff&#233;rentes peuvent &#234;tre d&#233;clar&#233;es pour les bords gauche, haut, droit et bas : padding-left, padding-top, padding-right, padding-bottom, margin-left, ...&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Le bloc &#034;temp&#233;rature&#034; contient par d&#233;faut une valeur quelconque, qui sera ensuite mise &#224; jour par le script JavaScript qui demandera &#224; un script PHP une valeur en base de donn&#233;es, avant d'ins&#233;rer ladite valeur dans la page.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; &lt;div id=&#034;temperature&#034;&gt;&lt;i&gt;en attente de mise &#224; jour&lt;/i&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#temperature{ font-size:1.5em; color:darkred;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Au cas o&#249; l'utilisateur aurait d&#233;sactiv&#233; JavaScript, un bloc sera par d&#233;faut affich&#233;. Si Javascript est activ&#233;, une fonction cachera ce bloc.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; &lt;div id=&#034;jsornotjs&#034;&gt; Vous avez d&#233;sactiv&#233; JavaScript. JavaScript est requis pour le rafra&amp;icirc;chissement des donn&amp;eacute;es de temp&amp;eacute;rature relev&amp;eacute;es par le robot sur le site. &lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;#jsornotjs{ color:darkred; font-weight:bold;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Puis on ferme le bloc contenu, le corps de page et la page.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; &lt;/div&gt; &lt;/body&gt;
&lt;/html&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ce qui donne ceci :&lt;/p&gt;
&lt;p&gt;&lt;span class='spip_document_185 spip_documents spip_documents_center'&gt;
&lt;img src='https://vader-fr.fr/local/cache-vignettes/L500xH118/projetsite-d5411.jpg?1771653422' width='500' height='118' alt=&#034;&#034; /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Script JS de mise &#224; jour de la page en AJAX&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;AJAX consiste &#224; envoyer de mani&#232;re asynchrone une requ&#234;te de type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;XMLHttpRequest&lt;/code&gt; et d'effectuer ensuite un traitement du document XML fourni en r&#233;ponse.&lt;/p&gt;
&lt;p&gt;Il faut donc d'abord une fonction pour cr&#233;er l'objet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;XMLHttpRequest&lt;/code&gt;&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;cr&#233;ation de l'objet XMlHttpRequest&lt;/h3&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function get_requete_maj_temp(){ var requete_maj_temp=null;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ici, la variable &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;requete_maj_temp&lt;/code&gt; est initialis&#233; &#224; vide. Si la fonction s'ex&#233;cute correctement, elle contiendra un objet de type &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;XMLHttpRequest&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Selon le navigateur, la fonction &#224; utiliser est diff&#233;rente :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;window.XMLHttpRequest&lt;/code&gt; sous Firefox&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;new ActiveXObject(&#034;Msxml12.XMLHTTP&#034;)&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;new ActiveXObject(&#034;Microsoft.XMLHTTP&#034;)&lt;/code&gt; sous IE, selon la version.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if (window.XMLHttpRequest){ // Firefox requete_maj_temp=new XMLHttpRequest(); }else if (window.ActiveXObject){ // IE&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;des blocs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;try { } catch (&lt;/code&gt;&lt;i&gt;erreur&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;) { }&lt;/code&gt; permettent &#034;d'essayer&#034; de r&#233;aliser certaines actions, et de r&#233;cup&#233;rer le code/message d'erreur dans la variable &lt;i&gt;erreur&lt;/i&gt; avant d'ex&#233;cuter d'autres actions en cas d'&#233;chec de l'essai.&lt;br class='autobr' /&gt;
Cela permet dans cette fonction de tester les diff&#233;rentes versions d'Internet Explorer.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; try{ requete_maj_temp=new ActiveXObject(&#034;Msxml12.XMLHTTP&#034;); }catch(e){ try{ requete_maj_temp=new ActiveXObject(&#034;Microsoft.XMLHTTP&#034;); }catch(e1){ requete_maj_temp=null; } } }else{ // non supporte alert(&#034;Votre navigateur ne supporte pas les XMLHTTPRequest.&#034;); }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Une fois fini, que l'objet soit cr&#233;&#233; ou non, on retourne la variable. &lt;br class='autobr' /&gt;
Celle-ci contient &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt; si on n'a pas pu cr&#233;er d'objet &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;XMLHttpRequest&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	return requete_maj_temp;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, cet objet doit &#234;tre envoy&#233; &#224; un script sur un serveur&lt;/p&gt;
&lt;h3 class=&#034;spip&#034;&gt;cr&#233;ation et envoi de la requ&#234;te&lt;/h3&gt;
&lt;p&gt;On fournit &#224; cette fonction l'adresse o&#249; envoyer la requ&#234;te.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function requete_requete_maj_temp(url){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On tente de cr&#233;er la requ&#234;te en utilisant la fonction d&#233;clar&#233;e pr&#233;c&#233;demment.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	requete_maj_temp=get_requete_maj_temp();&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si la variable n'existe pas ou si elle contient &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;null&lt;/code&gt;, on affiche un message d'erreur et on quitte la fonction par la directive &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;return&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if ((!requete_maj_temp)&amp;&amp;(requete_maj_temp!=null)){ alert(&#034;Votre navigateur ne peut creer de requete AJAX.&#034;); return; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sinon, on d&#233;finit la fonction JavaScript charg&#233;e de traiter la r&#233;ponse et on envoie la requ&#234;te.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	requete_maj_temp.onreadystatechange=function(){traitementReponse_requete_maj_temp(requete_maj_temp)} requete_maj_temp.open(&#034;GET&#034;,url,true); requete_maj_temp.send(null);
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;traitement de la r&#233;ponse&lt;/h3&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function traitementReponse_requete_maj_temp(requete_maj_temp){ var contenu;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;la variable &lt;contenu&lt;/code&gt; contiendra le document r&#233;ponse XML.&lt;/p&gt;
&lt;p&gt;Lorsque la requ&#234;te sera dans l'&#233;tat &#034;4&#034;, &#224; savoir pr&#233;sence d'une r&#233;ponse, le traitement sera effectu&#233;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	if (requete_maj_temp.readyState==4){&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On charge le contenu du document XML de r&#233;ponse dans la variable&lt;/p&gt;
&lt;p&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;contenu=requete_maj_temp.responseXML;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Puis on r&#233;cup&#232;re une par une les valeurs des diff&#233;rentes balises XML (tag) avec &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;getElementsByTagName(&lt;/code&gt;&lt;i&gt;code_balise&lt;/i&gt;&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;)&lt;/code&gt;, qui renvoie un tableau de tous les &#233;l&#233;ments ayant ce tag Html/XML.&lt;br class='autobr' /&gt;
On cherche g&#233;n&#233;ralement le premier &#233;l&#233;ment du tableau,&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre [0]&lt;/code class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; dont on r&#233;cup&#232;re la valeur. &lt;code&gt; temper=contenu.getElementsByTagName(&#034;temperature&#034;)[0].firstChild.nodeValue; dater=contenu.getElementsByTagName(&#034;date&#034;)[0].firstChild.nodeValue; heurer=contenu.getElementsByTagName(&#034;heure&#034;)[0].firstChild.nodeValue; sonde=contenu.getElementsByTagName(&#034;sonde&#034;)[0].firstChild.nodeValue;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ensuite, si le bloc d&#233;di&#233; &#224; l'affichage des donn&#233;es existe dans la page Html affich&#233;e, on le met dans une variable afin de pouvoir y &#233;crire les donn&#233;es re&#231;ues avec la directive &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;variable_bloc.innerHTML=cha&#238;ne texte&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; if (this.document.getElementById('temperature')!=null){ var div_temp=this.document.getElementById('temperature'); // le div div_temp.innerHTML=&#034;sonde &#034;+sonde+&#034; : &#034;+temper+&#034;&#176;C le &#034;+dater+&#034; &#224; &#034;+heurer;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enfin, pour continuer de mettre &#224; jour les donn&#233;es affich&#233;es, on d&#233;finit un compte &#224; rebours, ici de 10 secondes (10 000 milli-secondes) avec la directive &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;SetTimeout&lt;/code&gt; pour appeler la fonction lan&#231;ant la mise &#224; jour et d&#233;finie juste apr&#232;s.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; setTimeout(&#034;maj_temp()&#034;,10000); } }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 class=&#034;spip&#034;&gt;fonction de chargement de la temp&#233;rature &lt;/h3&gt;
&lt;p&gt;il aurait &#233;t&#233; possible de faire appel direct &#224; function requete_requete_maj_temp(url) mais cette fonction encapsule l'url pour faire un appel plus simple&lt;br class='autobr' /&gt;
on pourrait aussi accepter des param&#232;tres de maj_temp.php, comme le num&#233;ro de sonde&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;function maj_temp(){ if (this.document.getElementById('temperature')!=null){ requete_requete_maj_temp('maj_temp.php'); }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La fonction de mise &#224; jour est lanc&#233;e au chargement de la page (&#233;v&#232;nement &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;onLoad&lt;/code&gt; de l'&#233;l&#233;ment &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;body&lt;/code&gt;), via cette fonction AuChargement, qui permet de lancer plusieurs traitements.&lt;br class='autobr' /&gt;
Cette fois, le compte &#224; rebours est de 1 seconde, pour initialiser dans la page une valeur de la base de donn&#233;es.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;// fonction pour les scripts a lancer au chargement de la page =&gt; body onLoad
function AuChargement(){ pisteIE(); cacherjs(); setTimeout(&#034;maj_temp()&#034;,1000); // 1 seconde
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#034;onglets_contenu&#034;&gt;&lt;h2 class=&#034;cs_onglet&#034;&gt;&lt;a href=&#034;#&#034;&gt;Script PHP envoyant les donn&#233;es au script JS&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Ce script, appel&#233; par la fonction JavaScript, est extr&#234;mement simple.&lt;br class='autobr' /&gt;
Il r&#233;cup&#232;re en base la derni&#232;re valeur de temp&#233;rature pour une sonde donn&#233;e, la sonde &#034;par d&#233;faut&#034; &#233;tant la 1.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;&lt;?php // recuperation des champs if (isset($_GET[&#034;sonde&#034;])){ $id=$_GET[&#034;sonde&#034;]; }else{ $id=1; /* sonde par defaut */ }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;On g&#233;n&#232;re ensuite l'ent&#234;te du document r&#233;ponse...&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt; header('content-Type:text/xml,charset=UTF-8');&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;...avant de se connecter &#224; la base, r&#233;cup&#233;rer les valeurs...&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	include_once &#034;connect.php&#034;; $rek=&#034;select sonde,DATE_FORMAT(date,'%d/%m/%Y') as date, DATE_FORMAT(date,'%H:%i:%s') as heure,temperature from releves where sonde=$id order by date DESC limit 0,1&#034;; $res=mysql_query($rek); $row=mysql_fetch_array($res,MYSQL_ASSOC); $sonde=$row[&#034;sonde&#034;]; $date=$row[&#034;date&#034;]; // a transformer en texte $heure=$row[&#034;heure&#034;]; // de meme $temperature=$row[&#034;temperature&#034;];&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;... et de les mettre dans le document XML.&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; d'abord, cr&#233;er le document par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;new DOMDocument(&#034;1.0&#034;,&#034;utf-8&#034;);&lt;/code&gt;&lt;/li&gt;&lt;li&gt; puis y mettre la balise racine &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;createElement('root');&lt;/code&gt; suivi de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;appendChild();&lt;/code&gt;&lt;/li&gt;&lt;li&gt; ajouter les &#233;l&#233;ments par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;createElement(nom_balise, valeur);&lt;/code&gt; suivi de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;appendChild();&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	$doc=new DOMDocument(&#034;1.0&#034;,&#034;utf-8&#034;); $racine=$doc-&gt;createElement('root'); $doc-&gt;appendChild($racine); $xmlsonde=$doc-&gt;createElement('sonde',$sonde); $racine-&gt;appendChild($xmlsonde); $xmldate=$doc-&gt;createElement('date',$date); $racine-&gt;appendChild($xmldate); $xmlheure=$doc-&gt;createElement('heure',$heure); $racine-&gt;appendChild($xmlheure); $xmltemp=$doc-&gt;createElement('temperature',$temperature); $racine-&gt;appendChild($xmltemp);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;et enfin envoyer le document.&lt;/p&gt;
&lt;div class=&#034;precode&#034;&gt;&lt;pre class='spip_code spip_code_block' dir='ltr' style='text-align:left;'&gt;&lt;code&gt;	echo $doc-&gt;saveXML(); ?&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
