<?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=2&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>Exemples de fonctions PHP</title>
		<link>https://vader-fr.fr/spip.php?article174</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article174</guid>
		<dc:date>2016-07-27T08:09:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


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

		<description>
&lt;p&gt;Retour des erreurs &lt;br class='autobr' /&gt;
Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS). Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires. &lt;br class='autobr' /&gt;
Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique17" rel="directory"&gt;Les pages dynamiques avec PHP/MySQL&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;

		</description>


 <content:encoded>&lt;div class='rss_texte'&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;Retour des erreurs&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Lorsque les erreurs et autres messages &#224; caract&#232;re informatif sont g&#233;r&#233;s dans les diff&#233;rents blocs, et empil&#233;s dans une variable qui sera au final affich&#233;e dans un bloc d&#233;di&#233; (lequel peut &#234;tre d&#233;pliant gr&#226;ce au CSS).&lt;br class='autobr' /&gt;
Si l'on souhaite un style diff&#233;rent selon le niveau d'erreur atteint, les diff&#233;rents blocs peuvent faire appel &#224; cette fonction, qui use d'op&#233;rateurs ternaires.&lt;/p&gt;
&lt;p&gt;Il est aussi possible d'utiliser une variable globale pour le niveau d'erreur actuel, ce qui simplifie les appels &#224; la fonction.&lt;/p&gt;
&lt;p&gt;3 niveaux d'erreur sont g&#233;r&#233;s :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; info : tout va bien, on affiche un (ou plus) message(s) juste pour information&lt;/li&gt;&lt;li&gt; debug : attention, risque d'erreur, tout n'est pas optimal&lt;/li&gt;&lt;li&gt; error : erreur critique&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;function raise_debuglvl($lvl,$actuel){ $debuglvl=$actuel; $debuglvl=(($lvl==&#034;info&#034;)&amp;&amp;($actuel==&#034;info&#034;))?&#034;info&#034;:$debuglvl; $debuglvl=(($lvl==&#034;debug&#034;)&amp;&amp;($actuel!=&#034;error&#034;))?&#034;debug&#034;:$debuglvl; $debuglvl=($lvl==&#034;error&#034;)?&#034;error&#034;:$debuglvl; return $debuglvl;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La d&#233;claration du bloc d'affichage :&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;// bloc d'information - l'image sert au d&#233;ploiement mais reste affich&#233;e dans le bloc d&#233;pli&#233; if ($debug!=&#034;&#034;){ switch ($debuglvl) { case &#034;info&#034; : $debugimg=&#034;notif-info.gif&#034;; break; // ou action-s-valide case &#034;debug&#034; : $debugimg=&#034;notif-warning.gif&#034;; break; case &#034;error&#034; : $debugimg=&#034;notif-error.gif&#034;; break; default: $debugimg=&#034;notif-warning.gif&#034;; break; } echo &#034;&lt;div id=\&#034;debug\&#034; class=\&#034;$debuglvl\&#034;&gt; &lt;img src=\&#034;imj/$debugimg\&#034; alt=\&#034;$debuglvl\&#034;/&gt; $debug &lt;/div&gt;&#034;; }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La page appelante d&#233;clare les variables &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; :&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;$debug&lt;/code&gt; contiendra les messages &#224; afficher dans le bloc d&#233;di&#233;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info&lt;/code&gt; contiendra les messages &#224; afficher dans la page.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Les pages appel&#233;es (via &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;include&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;require&lt;/code&gt; empileront dans ces variables les messages qu'elles souhaitent soulever.&lt;br class='autobr' /&gt;
&lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$debug.=&#034;message&#034;;&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$info.=&#034;message&#034;;&lt;/code&gt;, cette derni&#232;re variable pouvant &#234;tre affich&#233;e dans la page puis vid&#233;e.&lt;/p&gt;
&lt;div class='cs_blocs'&gt;&lt;h4 class='blocs_titre blocs_replie blocs_click'&gt;&lt;a href='#_foo'&gt;exemple d'utilisation&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;dans un script g&#233;rant le login d'un utilisateur, on r&#233;cup&#232;re (en &#233;tape 2) login/mot de passe.&lt;br class='autobr' /&gt;
Selon ce qui est fourni, on retourne en &#233;tape 1 en affichant un message d'erreur.&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 ($etape==2){ if ((isset($_POST[&#034;user&#034;]))&amp;&amp;($_POST[&#034;user&#034;]!=&#034;&#034;)){ $user=$_POST[&#034;user&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-z][a-z0-9]+$/&#034;,$user)){ $debug.=&#034;nom utilisateur non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;nom utilisateur manquant&lt;br/&gt;&#034;; } if ((isset($_POST[&#034;motpass&#034;]))&amp;&amp;($_POST[&#034;motpass&#034;]!=&#034;&#034;)){ $motpass=$_POST[&#034;motpass&#034;]; // v&#233;rifier pas d'espace (entre autre) if (!preg_match(&#034;/^[a-zA-Z0-9]+$/&#034;,$user)){ $debug.=&#034;mot de passe non conforme&lt;br/&gt;&#034;; } }else{ $debug.=&#034;mot de passe manquant&lt;br/&gt;&#034;; } if ($debug!=&#034;&#034;){ $etape=1; $info=$debug; raise_debuglvl(&#034;debug&#034;,$debuglvl); }
}
if ($etape==2){
// comparaison BDD
}
if ($etape==1){ echo &#034;&lt;div id=\&#034;navig\&#034; class=\&#034;$page\&#034;&gt; Bloc navigation &lt;/div&gt; &lt;div id=\&#034;contenu\&#034; class=\&#034;$page\&#034;&gt; $info &#034;; // formulaire }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&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;son style CSS&lt;/a&gt;&lt;/h4&gt;&lt;div class='blocs_destination blocs_invisible blocs_slide'&gt;
&lt;p&gt;pour un bloc d&#233;pliable CSS situ&#233; en haut &#224; gauche de 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;#debug { position:absolute; top:0; left:0; width:32px; height:32px; z-index:42; line-height:0; font-size:0;
}
#debug img { height:auto; width:auto; max-height:32px; max-width:32px; visibility:visible;
}
#debug:hover { height:auto; width:auto; min-height:100px; min-width:200px; line-height:normal; font-size:1em; overflow-y:auto;
}
#debug:hover img { height:auto; width:auto;
}
#debug:hover img#deploi_debug { height:0; width:0; visibility:hidden;
}
/* =========================================== Messages de d&#233;bogages =========================================== */
#debug.error{ background-color:#FF0000;
}
#debug.error:hover { background-color:#FF8C00;
} #debug.debug { background-color:#FF8C00; }
#debug.info { background-color:#ADD8E6;
}
#debug.debug:hover, #debug.info:hover { background-color:#ADD8E6;
}
.debug { color:#FF8C00; /*#FFB30A;*/ /*#FFA501;*/
}
.info { color:#40820D; }
.error { color:#FF0000; font-weight:bold;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&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;redirection en https&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Pas vraiment une fonction, mais un petit bout de code &#224; mettre dans la section &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;head&gt;...&lt;/head&gt;&lt;/code&gt;.&lt;br class='autobr' /&gt;
Si la page est acc&#233;d&#233;e en http non s&#233;curis&#233;, on redirige vers le mode s&#233;curis&#233; https, via une balise meta.&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; // 'HTTPS' est d&#233;fini &#224; une valeur non-vide si le script a &#233;t&#233; appel&#233; via le protocole HTTPS. if ((!isset($_SERVER['HTTPS']))||($_SERVER['HTTPS']==&#034;&#034;)){ $url=&#034;https://&#034;.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; echo &#034;&lt;meta http-equiv='Refresh' content=\&#034;0; url=$url\&#034;/&gt;&#034;; }&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>
<item xml:lang="fr">
		<title>Expressions r&#233;guli&#232;res</title>
		<link>https://vader-fr.fr/spip.php?article173</link>
		<guid isPermaLink="true">https://vader-fr.fr/spip.php?article173</guid>
		<dc:date>2016-07-27T08:09:00Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Vader[FR]</dc:creator>


		<dc:subject>PHP</dc:subject>
		<dc:subject>Linux</dc:subject>

		<description>
&lt;p&gt;Que ce soit sous Linux Bash (sed, grep, find...), PHP (preg_match et preg_replace) ou Perl, il est possible de simplifier des traitements en faisant correspondre une cha&#238;ne &#224; un motif (pattern). &lt;br class='autobr' /&gt;
Certains motifs utilisent des expressions r&#233;guli&#232;res &#233;tendues, n&#233;cessitant une option (-r pour sed, -E pour grep...) ou un param&#233;trage &#224; v&#233;rifier (PHP/Perl). &lt;br class='autobr' /&gt;
Article non exhaustif &lt;br class='autobr' /&gt;
Les caract&#232;res sp&#233;ciaux (^, $, ?, +, *, [ , ], (, )...) seront prot&#233;g&#233;s par un \ afin de ne pas &#234;tre interpr&#233;t&#233;s (&#8230;)&lt;/p&gt;


-
&lt;a href="https://vader-fr.fr/spip.php?rubrique5" rel="directory"&gt;Linux &amp; Logiciels Libres&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?mot6" rel="tag"&gt;Linux&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Que ce soit sous Linux Bash (sed, grep, find...), PHP (preg_match et preg_replace) ou Perl, il est possible de simplifier des traitements en faisant correspondre une cha&#238;ne &#224; un motif (pattern).&lt;/p&gt;
&lt;p&gt;&lt;strong class=&#034;caractencadre-spip spip&#034;&gt;Certains motifs utilisent des expressions r&#233;guli&#232;res &#233;tendues, n&#233;cessitant une option (-r pour sed, -E pour grep...) ou un param&#233;trage &#224; v&#233;rifier (PHP/Perl).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong class=&#034;caractencadre-spip spip&#034;&gt;Article non exhaustif&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong class=&#034;caractencadre2-spip spip&#034;&gt;Les caract&#232;res sp&#233;ciaux (^, $, ?, +, *, [ , ], (, )...) seront prot&#233;g&#233;s par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\&lt;/code&gt; afin de ne pas &#234;tre interpr&#233;t&#233;s&lt;/strong&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;G&#233;n&#233;ralit&#233;s&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;
&lt;p&gt;Les composantes d'une expression r&#233;guli&#232;re sont :&lt;/p&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; les ancres - elles d&#233;finissent quelle partie de la cha&#238;ne il faut comparer au motif.
&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;^&lt;/code&gt; pour le d&#233;but de la cha&#238;ne&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$&lt;/code&gt; pour la fin de la cha&#238;ne.&lt;/li&gt;&lt;li&gt; en cas de comparaison (et/ou remplacement) d'une partie de cha&#238;ne, l'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;g&lt;/code&gt; permettra un traitement pour chaque correspondance au motif.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; les m&#233;ta-caract&#232;res
&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;.&lt;/code&gt; signifie &#034;n'importe quel caract&#232;re&#034;. Un &#034;.&#034; simple devra &#234;tre prot&#233;g&#233; par un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; les types de caract&#232;res, indiqu&#233;s entre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[ ]&lt;/code&gt; - valable pour un seul caract&#232;re &#224; comparer. Il faudra utiliser des quantificateurs pour comparer plusieurs caract&#232;res.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; au d&#233;but de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[ ]&lt;/code&gt;, le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^&lt;/code&gt; indique une n&#233;gation. Ainsi, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[^0-9]&lt;/code&gt; signifie &#034;tout sauf num&#233;rique&#034;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[0-9]&lt;/code&gt; pour du num&#233;rique.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[a-z]&lt;/code&gt; pour de l'alphab&#233;tique en minuscule&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[A-Z]&lt;/code&gt; pour de l'alphab&#233;tique en majuscule&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[a-zA-Z0-9]&lt;/code&gt; pour de l'alphanum&#233;rique.&lt;/li&gt;&lt;li&gt; Il est possible de lister les valeurs &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[abcdef567]&lt;/code&gt; ou de mettre une liste implicite &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[a-f5-7]&lt;/code&gt;&lt;/li&gt;&lt;li&gt; le &#034;-&#034; en tant que caract&#232;re sera donc mis en premier dans la liste, afin de ne pas tester une liste implicite. exemple, soit &#034;-&#034;, soit 0, soit 9 : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[-09]&lt;/code&gt;&lt;/li&gt;&lt;li&gt; il existe aussi des types d&#233;finis et des raccourcis
&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;\d&lt;/code&gt; est ainsi l'&#233;quivalent de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[0-9]&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\w&lt;/code&gt; celui de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[a-zA-Z0-9]&lt;/code&gt;, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\s&lt;/code&gt; un caract&#232;re d'espacement (espace, tabulation...), &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\t&lt;/code&gt; une tabulation simple, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\b&lt;/code&gt; indique un s&#233;parateur de mot...&lt;/li&gt;&lt;li&gt; les inverses sont alors en majuscule. &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\D&lt;/code&gt; &#233;tant tout sauf num&#233;rique.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; le respect ou non de la casse pourra &#234;tre indiqu&#233; par l'option &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;i&lt;/code&gt;, juste en dehors de l'expression r&#233;guli&#232;re&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; les sous-cha&#238;nes, entre &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;( )&lt;/code&gt; - permettent de comparer une .. sous-cha&#238;ne, pouvant &#234;tre compos&#233;e de plusieurs expressions
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; exemple, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^(Q|q)$&lt;/code&gt; correspond &#224; un q majuscule ou minuscule, le &#034;ou&#034; logique &#233;tant repr&#233;sent&#233; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;|&lt;/code&gt;. C'est l'&#233;quivalent de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^[qQ]$&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^(perl|linux|php)$&lt;/code&gt; &#224; la cha&#238;ne enti&#232;re &#034;perl&#034; OU &#034;linux&#034; ou &#034;php&#034;. contrairement &#224; la notation &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[ ]&lt;/code&gt;, la comparaison se fait sur plusieurs caract&#232;res.&lt;/li&gt;&lt;li&gt; une cha&#238;ne unique, sans utilisation de OU logique ou de r&#233;p&#233;tition de la sous-cha&#238;ne, pourra &#234;tre simplement indiqu&#233;e. voir exemple qui suit.&lt;/li&gt;&lt;li&gt; autre exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^Mem(Free|Total):&lt;/code&gt; cherche en d&#233;but de cha&#238;ne &#034;MemFree :&#034; ou &#034;MemTotal :&#034;&lt;/li&gt;&lt;li&gt; exemple dans ce code PHP &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$patterns[&#034;max_essais_logins&#034;]=&#034;/^[a]{0}(0*[3-9]|(0*[1-9]0*)+0|(0*[1-9]+0*)+[1-9])$/&#034;;&lt;/code&gt; qui contr&#244;le une cha&#238;ne num&#233;rique sup&#233;rieure &#224; 3.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[a]{0}&lt;/code&gt; s&#233;pare le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^&lt;/code&gt; de la sous-cha&#238;ne, afin de le comprendre comme &#034;d&#233;but de cha&#238;ne globale&#034; et non &#034;diff&#233;rent de sous-cha&#238;ne qui suit&#034;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Il n'existe pas de &#034;et&#034; logique en expression r&#233;guli&#232;re, mais il est possible de le simuler par un non &#034;ou&#034; des valeurs inverses.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; le &#034;non&#034; logique se met devant l'ouverture de la sous-cha&#238;ne, exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^(valeur1|valeur2)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Les sous-cha&#238;nes sont automatiquement mises dans des variables num&#233;rot&#233;es &#224; partir de 1 et peuvent &#234;tre r&#233;utilis&#233;es dans un remplacement.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;s/^.+: +([0-9]+) kB/$1/&lt;/code&gt; via un remplacement, extrait de la cha&#238;ne les seuls caract&#232;res num&#233;riques situ&#233;s avant un &#034; kB&#034;, et ce pour la premi&#232;re occurrence dans la ligne.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; les quantificateurs - situ&#233;s apr&#232;s le type de caract&#232;re ou la sous-cha&#238;ne. Par d&#233;faut, vaut 1.
&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;?&lt;/code&gt; signifie &#034;z&#233;ro ou 1 fois&#034;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;*&lt;/code&gt; signifie &#034;z&#233;ro &#224; n fois&#034; (sans limite)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;+&lt;/code&gt; signifie &#034;au moins 1 &#224; n fois&#034;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{a,b}&lt;/code&gt; signifie &#034;de a &#224; b fois&#034;. a ou b peuvent &#234;tre absents, afin de ne sp&#233;cifier que le maximum ou minimum.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; ainsi, &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;{0,}&lt;/code&gt; est un &#233;quivalent de &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;*&lt;/code&gt;&lt;/li&gt;&lt;li&gt; exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^(\.|\.\.)$&lt;/code&gt;, afin de ne pas traiter &#034;.&#034; et &#034;..&#034; dans la liste des r&#233;pertoires Unix/Linux, peut &#234;tre remplac&#233; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^\.{1,2}$&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^\.\.?$&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&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;Exemples d'utilisation&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; PHP
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; preg_match permet de comparer le contenu d'une variable &#224; un motif. preg_replace fera le remplacement.&lt;/li&gt;&lt;li&gt; Ici, on d&#233;termine le type de donn&#233;e avant un bindValue d'une requ&#234;te param&#233;trable (PDO)&lt;/li&gt;&lt;li&gt; les caract&#232;res encadrant le motif &#233;tant &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;/&lt;/code&gt;, les options s'indiqueraient de mani&#232;re &#034;/motif/options&#034;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; par exemple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;preg_match(&#034;/^linux/i&#034;,$chaine)&lt;/code&gt; sera insensible &#224; la casse et cherchera en d&#233;but de cha&#238;ne le terme &#034;linux&#034; avec ou sans majuscules.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;if (preg_match(&#034;/[\w]+/&#034;,$param)){ $typ_param=PDO::PARAM_STR; }&lt;/code&gt; si la cha&#238;ne contient (peut importe o&#249;) un voire plus caract&#232;res alphab&#233;tiques, c'est une cha&#238;ne de caract&#232;res
&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;\w&lt;/code&gt; peut &#234;tre remplac&#233; par &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\D&lt;/code&gt;, signifiant &#034;tout sauf num&#233;rique&#034;. Ici, l'expression est assez permissive car c'est le type &#034;par d&#233;faut&#034;, qui peut &#234;tre surcharg&#233; par les deux suivants.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;if (preg_match(&#034;/^[+-]?\d+$/&#034;,$param)){ $typ_param=PDO::PARAM_INT; }&lt;/code&gt; si la cha&#238;ne ne contient, du d&#233;but &#224; la fin, qu'un (ou pas) +/- suivi d'un ou plusieurs caract&#232;res num&#233;riques, c'est un entier sign&#233;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;if (preg_match(&#034;/^$/&#034;,$param)){ $typ_param=PDO::PARAM_NULL; }&lt;/code&gt; si la cha&#238;ne, entre son d&#233;but et sa fin, ne contient rien, c'est un param&#232;tre null&lt;/li&gt;&lt;li&gt; Le motif suivant v&#233;rifie si la cha&#238;ne entr&#233;e est un num&#233;rique, sup&#233;rieur ou &#233;gal &#224; 3&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$patterns[&#034;max_essais_logins&#034;]=&#034;/^[a]{0}(0*[3-9]|(0*[1-9]0*)+0|(0*[1-9]+0*)+[1-9])$/&#034;;&lt;/code&gt;
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; commence par z&#233;ro fois la lettre a. En fait, cela permet d'interpr&#233;ter le &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^&lt;/code&gt; comme &#034;d&#233;but de cha&#238;ne&#034; et non &#034;non &#233;gal &#224; la sous-cha&#238;ne qui suit&#034;&lt;/li&gt;&lt;li&gt; puis contient ensuite soit &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;0*[3-9]&lt;/code&gt; soit &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(0*[1-9]0*)+0&lt;/code&gt; soit &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(0*[1-9]+0*)+[1-9]&lt;/code&gt; r&#233;p&#233;t&#233; au moins une fois, et termine&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;0*[3-9]&lt;/code&gt; = un chiffre de 3 &#224; 9 tout seul, pr&#233;c&#233;d&#233; ou non de z&#233;ros.&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(0*[1-9]0*)+0&lt;/code&gt; = une cha&#238;ne contenant au moins un chiffre de 1 &#224; neuf, et qui terminera par z&#233;ro&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(0*[1-9]+0*)+[1-9]&lt;/code&gt; = une cha&#238;ne contenant au moins un chiffre de 1 &#224; neuf, et qui terminera par un chiffre de 1 &#224; neuf, donc compl&#233;mentaire &#224; la cha&#238;ne pr&#233;c&#233;dente&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; PERL
&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;=~&lt;/code&gt; et &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;!~&lt;/code&gt; permettent de comparer le contenu d'une variable &#224; un motif.&lt;/li&gt;&lt;li&gt; Ici, on utilise un op&#233;rateur ternaire : si la valeur commence &#233;ventuellement par + ou -, suivi d'un ou plusieurs chiffres, on met la valeur dans le tableau, sinon on sort.
&lt;ul class=&#034;spip&#034; role=&#034;list&#034;&gt;&lt;li&gt; l'op&#233;rateur ternaire existe aussi en PHP. exemple : &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$page=(isset($_POST[&#034;page&#034;]))?$_POST[&#034;page&#034;]:&#034;accueil&#034;;&lt;/code&gt; affecte &#224; la variable page la valeur transmise en POST si celle-ci existe, sinon la valeur &#034;accueil&#034;.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;($valeur=~/^[+-]{0,1}[0-9]+$/)?push(@rray,$valeur):last;&lt;/code&gt;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;s/&lt;\/{0,1}head&gt;//gi;&lt;/code&gt; le s indique que l'on remplace (substitute) la cha&#238;ne &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;/head&gt;&lt;/code&gt; ou &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;&lt;head&gt;&lt;/code&gt; (le / &#233;tant prot&#233;g&#233;), par une cha&#238;ne vide, avec les options g (global, ne pas s'arr&#234;ter &#224; la premi&#232;re occurrence) et i (insensible &#224; la casse)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt; Linux : find et sed, voir &lt;a href='https://vader-fr.fr/spip.php?article165' class=&#034;spip_in&#034;&gt;ici&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Autres
&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;3\.14(15?)?&lt;/code&gt; 3.14 ET 3.141 ET 3.1415&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(ab)([c]{0,1}|[c]{3})z&lt;/code&gt; abz ET abcz ET abcccz&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(abc)[c]{2}z&lt;/code&gt; abcz ET abcccz MAIS PAS abz&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;(ab)[c]{0,1}z&lt;/code&gt; abz ET abcz&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;[\\]*[\*]*&lt;/code&gt; un nombre quelconque de &#8220;\&#8221; suivi d'un nombre quelconque de &#8220;*&#8221;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;([^&#034;]*)&lt;/code&gt; une cha&#238;ne entre quotes contenant 0 &#224; n fois tout sauf &#034;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^0?[0-3]?[0-7]{1,2}$&lt;/code&gt; commence par 0 (0 ou 1 fois) puis 0 &#224; 3 (0 ou 1 fois) puis 0 &#224; 7 (1 ou 2 fois) et termine&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\b[\w.]{1,12}\b&lt;/code&gt; un mot de 1 &#224; 12 caract&#232;res alphanum&#233;riques ou &#034;.&#034;&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^\$\w+$&lt;/code&gt; une cha&#238;ne contenant uniquement le nom d'une variable scalaire sans toutefois correspondre &#224; une variable sp&#233;ciale comme &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;$*&lt;/code&gt; (PERL)&lt;/li&gt;&lt;li&gt; &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;^(#.*|\s*)$&lt;/code&gt; une cha&#238;ne commen&#231;ant par soit un di&#232;se suivi de n'importe quoi en n'importe quelle quantit&#233; soit ne contenant (&#233;ventuellement) que des caract&#232;res de s&#233;paration, jusqu'&#224; la fin de la cha&#238;ne. un &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;\s*#&lt;/code&gt; au lieu du simple &lt;code class='spip_code spip_code_inline' dir='ltr'&gt;#&lt;/code&gt; permettrait de g&#233;rer les lignes de commentaires commen&#231;ant par des caract&#232;res d'espacement.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<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>
